File: Nim.curry

package info (click to toggle)
curry-tools 1.0.1%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 5,492 kB
  • ctags: 121
  • sloc: makefile: 470; sh: 421
file content (34 lines) | stat: -rw-r--r-- 1,107 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{-# OPTIONS_CYMAKE -F --pgmF=currypp --optF=defaultrules #-}
{-# OPTIONS_CYMAKE -Wnone #-}

import Test.EasyCheck

-- A simple implementation of a two-person game (here: Nim) with default rules
--
-- Example taken from (where the same example was implemented with "fails"):
-- F.J. Lopez-Fraguas, J. Sanchez-Hernandez:
-- A Proof Theoretic Approach to Failure in Functional Logic Programming
-- TPLP 4(1), 2004

-- A winning move is some move of the game to a state
-- where the other person can *not* win:
winMove state | next == move state = proceed state next   where next free

-- We proceed with a next state only if the next state does not allow
-- a winning move:
proceed state next | winMove next == _ = failed
proceed'default _ next = next

-- Here are the moves of the Nim game: pick some number of sticks
-- from *one* row, where the rows are presented as a list of (Peano)
-- numbers (representing the number of sticks):
move (x:xs) = (pick x : xs) ? (x : move xs)

pick (S n) = n ? pick n

data Nat = Z | S Nat


main = winMove [S (S Z), S Z]

testNim = winMove [S (S Z), S Z]  -=-  [S Z, S Z]