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 35 36 37 38 39 40 41 42 43
|
let nil = Abs(Abs(Var 1))
let trio = Abs(Abs(Abs(Abs(App(App(App(Var 1,Var 4),Var 3),Var 2)))))
let rod_a = Abs(Var 1)
let rod_b = Abs(Abs(Var 1))
let rod_c = Abs(Abs(Var 2))
let yfix = Abs(App(Abs(App(Var 2,App(Var 1,Var 1))),Abs(App(Var 2,App(Var 1,Var 1)))))
let zero = Abs(Abs(Var 2))
let one = Abs(Abs(App(Var 1,zero)))
let two = Abs(Abs(App(Var 1,one)))
let three = Abs(Abs(App(Var 1,two)))
let hanoi =
Abs(Abs(Abs(Abs(Abs(Abs(
App(
App(Var 1,App(App(App(trio,Var 5),Var 3),Var 2)), (* if n = 0 then src::dst::acc *)
Abs(
App(App(App(App(App(
Var 7, (* hn *)
Var 5),(* tmp *)
Var 6),(* src *)
Var 4),(* dst *)
App(
App(App(trio,Var 6),Var 4), (* src::dst:: *)
App(App(App(App(App(Var 7,Var 6),Var 4),Var 5),Var 3),Var 1) (* hn src dst tmp acc (pred n) *)
)
),
Var 1)
)
)
))))))
let hanoi = (* yfix hanoi 'A' 'B' 'C' [] *)
Abs(
App(App(App(App(App(
App(yfix,hanoi),
rod_a),
rod_b),
rod_c),
nil),
Var 1
)
) |
Partager