###
### FILE : tower-of-hanoi7.soar
###
###
### AUTHOR(1) : Aladin.Akyurek [ Soar 6.1.0 ]
### AUTHOR(2) : Tim Chapman [ Soar 7.0.4 ]
### tidied Frank Ritter 10 Dec 97
###
### CREATED(1) : Aug 15, 93
###
###
### MODIFIED(3) : May 27, 97 [ soar 7.0.4 ] Tim Chapman
### MODIFIED(2) : Feb 18, 94 [ soar 6.1.x ] Aladin.Akyurek
### MODIFIED(1) : Jan 11, 94 [ soar 6.1.x ] Aladin.Akyurek
###
### May 27, 97 : Added Blocksworld problem space for Tower
### Noticing Strategy.
### Feb 18, 94 : Added the Pop operator, removed the Infer space.
### Jan 11, 94 : Collapsed two problem spaces into one from
### the version which was presented at the 7th EuroSoar Workshop
### (Nov 93, Nottingham, UK).
###
### Copyright (C) Aladin Akyurek (NISCALE, Leiden, The Netherlands).
###
### TOP GOAL:
### TOWER-OF-HANOI
###
watch learning -print
watch -chunks -print
learn -on
sp {top-goal*elaborate*goal*toh
"Create the top goal state"
(state ^superstate nil)
-->
( ^name tower-of-hanoi)}
###
### TOWER-OF-HANOI PROBLEM SPACE:
### TOWER-OF-HANOI
###
sp {toh*propose*space*tower-of-hanoi
"Propose the tower-of-hanoi problem space"
(state ^name tower-of-hanoi)
-->
( ^problem-space
)
(
^name tower-of-hanoi)}
###
### TOWER-OF-HANOI PROBLEM SPACE:
### INITIAL-STATE AND DESIRED-STATE
###
#prob.5d.1
#A 5-disk problem for the tower-of-hanoi system.
# 1
# 2
# 3
# 4
# 5
# --- --- ---
# A B C
#
# Initial State Desired State
# This can be modified to create larger or smaller towers
sp {toh*propose*state*initial-and-desired-states
"A 5-Disk Tower of Hanoi Problem."
(state ^name tower-of-hanoi ^problem-space
)
(
^name tower-of-hanoi)
-->
( ^taskstate )
( ^disk + &,
+ &,
+ &,
+ &,
+ &
^peg + &,
+ &,
+ &
^holds + &,
+ &,
+ &,
+ &,
+ & )
( ^disk ^above ^on )
( ^disk ^above ^on )
( ^disk ^above ^on )
( ^disk ^above ^on )
( ^disk ^above none ^on )
( ^name 1 ^size 1)
( ^name 2 ^size 2)
( ^name 3 ^size 3)
( ^name 4 ^size 4)
( ^name 5 ^size 5)
( ^name |A|)
( ^name |B|)
( ^name |C|)
( ^desired + &,
+ &,
+ &,
+ &,
+ & )
( ^disk ^above ^on )
( ^disk ^above ^on )
( ^disk ^above ^on )
( ^disk ^above ^on )
( ^disk ^above none ^on )}
###
### TOWER-OF-HANOI PROBLEM SPACE:
### STATE ELABORATION/INFERENCES:
### LARGER, UPPER-DISK, AND
### CLEAR
###
sp {toh*object*disk*elaborate*state*larger
"If size-of(i) > size-of(j), then larger(i,j)."
(state ^superstate nil
^problem-space.name tower-of-hanoi ^taskstate )
( ^disk { <> })
( ^size )
( ^size > )
-->
( ^larger + & )}
sp {toh*object*disk*elaborate*state*upper-disk
"If not(above(x,disk)), then upper-disk(disk)."
(state ^problem-space.name tower-of-hanoi ^taskstate )
( ^disk )
-{ ( ^holds )
( ^above ) }
-->
( ^upper-disk + & )}
sp {toh*object*peg*elaborate*state*clear
"If not(on(x,peg)), then clear(peg)."
(state ^problem-space.name tower-of-hanoi ^taskstate )
( ^peg )
-{ ( ^holds )
( ^on ) }
-->
( ^clear + & )}
###
### TOWER-OF-HANOI PROBLEM SPACE OPERATORS:
### SET-FOCUS AND MOVE-DISK
### For POP and GOAL-TEST, see below.
###
sp {toh*propose*operator*set-focus*disk-to-move
"If no focus [i.e., no disk-to-move], then create one."
(state ^problem-space ^taskstate )
( ^name tower-of-hanoi)
( -^disk-to-move)
-->
( ^operator + <, = )
( ^name set-focus ^previous-focus none ^done? no)}
## -fer moveable?
sp {toh*propose*operator*set-focus*disk-to-move*alternative
"If the disk in focus is not movable, change the focus."
(state ^problem-space ^taskstate )
( ^name tower-of-hanoi)
( ^disk-to-move )
# ( ^disk )
# ( -^moveable yes)
-->
( ^operator + <, = )
( ^name set-focus ^previous-focus ^done? no)}
sp {toh*propose*operator*move-disk*disk-to-move*onto
"Move disk when target peg is clear."
(state ^problem-space ^taskstate )
( ^name tower-of-hanoi)
( ^disk-to-move ^upper-disk
^peg
^clear
^holds )
( ^disk
^from { <> }
^to )
( ^disk ^on )
-->
( ^operator )
( ^name move-disk ^disk
^from
^to
^done? no)}
sp {toh*propose*operator*move-disk*disk-to-move*above
"Move disk where upper disk on the target peg is larger."
(state ^problem-space ^taskstate )
( ^name tower-of-hanoi)
( ^disk-to-move
^upper-disk
^peg
-^clear
^holds )
( ^disk
^from { <> }
^to )
( ^disk ^on )
( ^disk ^on )
( ^larger )
-->
( ^operator )
( ^name move-disk ^disk
^from
^to
^done? no)}
###
### TOWER-OF-HANOI PROBLEM SPACE:
### OPERATOR IMPLEMENTATION
###
sp {implement*move-disk*from-above*nodisk*target-peg*is-clear
"Carry out the move when target peg is clear"
(state ^operator )
(state ^problem-space ^taskstate )
( ^name move-disk ^disk
^from
^to
^done? no)
( ^name )
( ^upper-disk ^clear ^disk-to-move
^holds )
( ^disk ^from ^to )
( ^disk ^above none ^on )
-->
( ^on - )
( ^done? yes no - )}
sp {implement*move-disk*from-above*adisk*target-peg*is-clear
"Carry out the move from above a disk when target is clear"
(state ^operator ^problem-space ^taskstate )
( ^name move-disk ^disk ^done? no
^from ^to )
( ^name )
( ^upper-disk ^clear
^disk-to-move ^holds )
( ^disk ^from ^to )
( ^disk ^above { <> none } ^on )
-->
( ^above none - )
( ^on - )
( ^done? yes + no - )}
sp {implement*move-disk*from-above*adisk-or-nodisk*target-peg*is-not-clear
"Carry out the move to a non-clear target peg"
(state ^operator ^problem-space ^taskstate )
( ^name move-disk ^disk ^done? no
^from ^to )
( ^name )
( ^upper-disk { <> }
-^clear
^disk-to-move ^holds )
( ^disk ^from ^to )
(