The solution
; Towers of Hanoi in CLIPS
(defrule move-disk
?old-list <- (goals disk ?number ?from ?to $?rest)
=>
(retract ?old-list)
; (printout t "move disk from " ?from " to " ?to crlf)
(assert (goals ?rest)))
(defrule move-single-disk-tower
?old-list <- (goals tower 1 ?from ?to $?rest)
=>
(retract ?old-list)
(assert (goals disk 1 ?from ?to ?rest)))
(defrule move-tower
?old-list <- (goals tower ?number&1 ?from ?to $?rest)
=>
(retract ?old-list)
(assert (goals tower =(- ?number 1) ?from =(- 7 ?from ?to)
tower 1 ?from ?to
tower =(- ?number 1) =(- 7 ?from ?to) ?to ?rest)))
(defrule completed
?old-list <- (goals done)
=>
(retract ?old-list))