// Tower of Hanoi Puzzle // Rules hanoi(return, source, target, aux) >< (int n) | n==0 => // Erase the source, target and aux source ~ Eraser, target ~ Eraser, aux ~ Eraser, // 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)]