aboutsummaryrefslogtreecommitdiff
path: root/sample/hanoi.in
blob: 40cef504ec6708d3bdacf2ae95a4423cb6465b56 (plain) (blame)
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
// Tower of Hanoi Puzzle

// Rules
hanoi(return, source, target, aux) >< (int n)
| n==0 => 
          // Erase the source, target and aux
          Eraser~source, Eraser~target, Eraser~aux,
	  // result
          return~[]

| _    => 
          // Duplicate the source, target and aux
	  source ~ Dup(src1, Dup(src2, src3)),
          target ~ Dup(tgt1, Dup(tgt2, tgt3)),
          aux ~ Dup(aux1, aux2),

          // recursive applications
          hanoi(ret1, src1, aux1, tgt1)~(n-1),
          hanoi(ret2, aux2, tgt2, src2)~(n-1),

          // result
          return << Append(ret1, (n,src3,tgt3):ret2);


// Net
hanoi(result, A, C, B) ~ 3;
result; // should be [(1,A,C),(2,A,B),(1,C,B),(3,A,C),(1,B,A),(2,B,C),(1,A,C)]