home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0622.ZIP / CCE_0622.PD / CLIPS / MAB.CLP < prev    next >
Text File  |  1993-09-01  |  9KB  |  312 lines

  1.  
  2. ;;;======================================================
  3. ;;;   Monkees and Bannanas Sample Problem
  4. ;;;
  5. ;;;     This is an extended version of a
  6. ;;;     rather common AI planning problem.
  7. ;;;     The point is for the monkee to find
  8. ;;;     and eat some bannanas.
  9. ;;;
  10. ;;;     To execute, merely load, reset and run.
  11. ;;;======================================================
  12.  
  13. ;;;*************************
  14. ;;;* chest unlocking rules *
  15. ;;;*************************
  16.  
  17. (defrule unlock-chest-to-hold-object ""
  18.   (goal-is-to active holds ?obj)
  19.   (object ?chest ? ? ? ?obj ?)
  20.   (not (goal-is-to active unlock ?chest))
  21.   =>
  22.   (assert (goal-is-to active unlock ?chest)))
  23.  
  24. (defrule unlock-chest-to-move-object "" 
  25.   (goal-is-to active move ?obj ?)
  26.   (object ?chest ? ? ? ?obj ?)
  27.   (not (goal-is-to active unlock ?chest))
  28.   =>
  29.   (assert (goal-is-to active unlock ?chest)))
  30.  
  31. (defrule hold-chest-to-put-on-floor "" 
  32.   (goal-is-to active unlock ?chest)
  33.   (object ?chest ? light ~floor ? ?)
  34.   (not (goal-is-to active holds ?chest))
  35.   =>
  36.   (assert (goal-is-to active holds ?chest)))
  37.  
  38. (defrule put-chest-on-floor "" 
  39.   (goal-is-to active unlock ?chest)
  40.   ?f1 <- (monkey ?place ?on ?chest)
  41.   ?f2 <- (object ?chest held light held ?contains ?key)
  42.   =>
  43.   (printout "Monkey throws " ?chest " off " ?on " onto floor." crlf)
  44.   (retract ?f1 ?f2)
  45.   (assert (monkey ?place ?on blank))
  46.   (assert (object ?chest ?place light floor ?contains ?key)))
  47.  
  48. (defrule get-key-to-unlock "" 
  49.   (goal-is-to active unlock ?obj)
  50.   (object ?obj ?place ? floor ? ?key)
  51.   (monkey ? ? ~?key)
  52.   (not (goal-is-to active holds ?key))
  53.   =>
  54.   (assert (goal-is-to active holds ?key)))
  55.  
  56. (defrule move-to-chest-with-key "" 
  57.   (goal-is-to active unlock ?chest)
  58.   (monkey ?mplace ? ?key)
  59.   (object ?chest ?cplace&~?mplace ? floor ? ?key)
  60.   (not (goal-is-to active walk-to ?cplace))
  61.   =>
  62.   (assert (goal-is-to active walk-to ?cplace)))
  63.  
  64. (defrule unlock-chest-with-key "" 
  65.   ?f1 <- (goal-is-to active unlock ?chest-obj)
  66.   ?f2 <- (object ?chest-obj ?place ?weight ?on ?obj-in ?key)
  67.   (monkey ?place ?on ?key)
  68.   =>
  69.   (printout "Monkey opens chest with " ?key " revealing " ?obj-in crlf)
  70.   (retract ?f1 ?f2)
  71.   (assert (object ?chest-obj ?place ?weight ?on nil ?key))
  72.   (assert (object ?obj-in ?place light ?chest-obj nil nil)))
  73.  
  74. ;;;***********************
  75. ;;;* process hold object * 
  76. ;;;***********************
  77.  
  78. (defrule use-ladder-to-hold ""
  79.   (goal-is-to active holds ?obj)
  80.   (object ?obj ?place light ceiling ? ?)
  81.   (not (goal-is-to active move ladder ?place))
  82.   =>
  83.   (assert (goal-is-to active move ladder ?place)))
  84.  
  85. (defrule climb-ladder-to-hold ""
  86.   (goal-is-to active holds ?obj)
  87.   (object ?obj ?place light ceiling ? ?)
  88.   (object ladder ?place ? floor ? ?)
  89.   (not (goal-is-to active on ladder))
  90.   =>
  91.   (assert (goal-is-to active on ladder)))
  92.  
  93. (defrule grab-object-from-ladder "" 
  94.   ?f1 <- (goal-is-to active holds ?obj)
  95.   ?f2 <- (object ?obj ?place light ceiling ?contains ?key)
  96.   (object ladder ?place ? ? ? ?)
  97.   ?f3 <- (monkey ?place ladder blank)
  98.   =>
  99.   (printout "Monkey grabs the " ?obj crlf)
  100.   (retract ?f1 ?f2 ?f3)
  101.   (assert (object ?obj held light held ?contains ?key))
  102.   (assert (monkey ?place ladder ?obj)))
  103.  
  104. (defrule climb-to-hold "" 
  105.   (goal-is-to active holds ?obj)
  106.   (object ?obj ?place light ?on&~floor&~ceiling ? ?)
  107.   (monkey ?place ~?on ?)
  108.   (not (goal-is-to active on ?on))
  109.   =>
  110.   (assert (goal-is-to active on ?on)))
  111.  
  112. (defrule walk-to-hold ""
  113.   (goal-is-to active holds ?obj)
  114.   (object ?obj ?place light ~ceiling ? ?)
  115.   (monkey ~?place ? ?)
  116.   (not (goal-is-to active walk-to ?place))
  117.   =>
  118.   (assert (goal-is-to active walk-to ?place)))
  119.  
  120. (defrule drop-to-hold ""
  121.   (goal-is-to active holds ?obj)
  122.   (object ?obj ?place light floor ? ?)
  123.   (monkey ?place ? ~blank)
  124.   (not (goal-is-to active holds blank))
  125.   =>
  126.   (assert (goal-is-to active walk-to ?place)))
  127.  
  128. (defrule get-on-floor-to-hold ""
  129.   (goal-is-to active holds ?obj)
  130.   (object ?obj ?place light floor ? ?)
  131.   (monkey ?place ~floor ?)
  132.   (not (goal-is-to active on floor))
  133.   =>
  134.   (assert (goal-is-to active on floor)))
  135.  
  136. (defrule grab-object "" 
  137.   ?f1 <- (goal-is-to active holds ?obj)
  138.   ?f2 <- (object ?obj ?place light ?on ?contains ?key)
  139.   ?f3 <- (monkey ?place ?on blank)
  140.   =>
  141.   (printout "Monkey grabs the " ?obj crlf)
  142.   (retract ?f1 ?f2 ?f3)
  143.   (assert (object ?obj held light held ?contains ?key))
  144.   (assert (monkey ?place ?on ?obj)))
  145.  
  146. ;;;**************************
  147. ;;;* move object to a place * 
  148. ;;;**************************
  149.  
  150. (defrule hold-object-to-move ""  
  151.   (goal-is-to active move ?obj ?place)
  152.   (object ?obj ~?place light ? ? ?)
  153.   (monkey ? ? ~?obj)
  154.   (not (goal-is-to active holds ?obj))
  155.   =>
  156.   (assert (goal-is-to active holds ?obj)))
  157.  
  158. (defrule move-object-to-place "" 
  159.   (goal-is-to active move ?obj ?place)
  160.   (monkey ~?place ? ?obj)
  161.   (not (goal-is-to active walk-to ?place))
  162.   =>
  163.   (assert (goal-is-to active walk-to ?place)))
  164.  
  165. (defrule drop-object-once-moved "" 
  166.   ?f1 <- (goal-is-to active move ?obj ?place)
  167.   ?f2 <- (monkey ?place ?on ?obj)
  168.   ?f3 <- (object ?obj ? light ? ?contains ?key)
  169.   =>
  170.   (printout "Monkey drops the " ?obj "." crlf)
  171.   (retract ?f1 ?f2 ?f3)
  172.   (assert (monkey ?place ?on blank))
  173.   (assert (object ?obj ?place light floor ?contains ?key)))
  174.  
  175. (defrule already-moved-object ""
  176.   ?f1 <- (goal-is-to active move ?obj ?place)
  177.   (object ?obj ?place ? ? ? ?)
  178.   =>
  179.   (retract ?f1))
  180.  
  181. ;;;*************************
  182. ;;;* process walk-to place *
  183. ;;;*************************
  184.  
  185. (defrule already-at-place "" 
  186.   ?f1 <- (goal-is-to active walk-to ?place)
  187.   (monkey ?place ? ?)
  188.   =>
  189.   (retract ?f1))
  190.  
  191. (defrule get-on-floor-to-walk ""
  192.   (goal-is-to active walk-to ?place)
  193.   (monkey ~?place ~floor ?)
  194.   (not (goal-is-to active on floor))
  195.   =>
  196.   (assert (goal-is-to active on floor)))
  197.  
  198. (defrule walk-holding-nothing ""
  199.   ?f1 <- (goal-is-to active walk-to ?place)
  200.   ?f2 <- (monkey ~?place floor blank)
  201.   =>
  202.   (printout "Monkey walks to " ?place crlf)
  203.   (retract ?f1 ?f2)
  204.   (assert (monkey ?place floor blank)))
  205.  
  206. (defrule walk-holding-object ""
  207.   ?f1 <- (goal-is-to active walk-to ?place)
  208.   ?f2 <- (monkey ~?place floor ?obj&~blank)
  209.   =>
  210.   (printout "Monkey walks to " ?place " holding " ?obj crlf)
  211.   (retract ?f1 ?f2)
  212.   (assert (monkey ?place floor ?obj)))
  213.  
  214. (defrule drop-object ""  
  215.   ?f1 <- (goal-is-to active holds blank)
  216.   ?f2 <- (monkey ?place ?on ?obj&~blank)
  217.   ?f3 <- (object ?obj held light held ?inside ?key)
  218.   =>
  219.   (printout "Monkey drops " ?obj crlf)
  220.   (retract ?f1 ?f2 ?f3)
  221.   (assert (object ?obj ?place light ?on ?inside ?key))
  222.   (assert (monkey ?place ?on blank)))
  223.  
  224. ;;;*************************
  225. ;;;* process get on object * 
  226. ;;;*************************
  227.  
  228. (defrule jump-onto-floor "" 
  229.   ?f1 <- (goal-is-to active on floor)
  230.   ?f2 <- (monkey ?at ?on&~floor ?obj)
  231.   =>
  232.   (printout "Monkey jumps off " ?on " onto the floor." crlf)
  233.   (retract ?f1 ?f2)
  234.   (assert (monkey ?at floor ?obj)))
  235.  
  236. (defrule walk-to-place-to-climb "" 
  237.   (goal-is-to active on ?obj)
  238.   (object ?obj ?place ? ? ? ?)
  239.   (monkey ~?place ? ?)
  240.   (not (goal-is-to active walk-to ?place))
  241.   =>
  242.   (assert (goal-is-to active walk-to ?place)))
  243.  
  244. (defrule drop-to-climb "" 
  245.   (goal-is-to active on ?obj)
  246.   (object ?obj ?place ? ? ? ?)
  247.   (monkey ?place ? ~blank)
  248.   (not (goal-is-to active holds blank))
  249.   =>
  250.   (assert (goal-is-to active holds blank)))
  251.  
  252. (defrule climb-indirectly "" 
  253.   (goal-is-to active on ?obj)
  254.   (object ?obj ?place ? ?on ? ?)
  255.   (monkey ?place ~?on&~?obj blank)
  256.   (not (goal-is-to active on ?on))
  257.   =>
  258.   (assert (goal-is-to active on ?on)))
  259.  
  260. (defrule climb-directly ""  
  261.   ?f1 <- (goal-is-to active on ?obj)
  262.   (object ?obj ?place ? ?on ? ?)
  263.   ?f2 <- (monkey ?place ?on blank)
  264.   =>
  265.   (printout "Monkey climbs onto " ?obj crlf)
  266.   (retract ?f1 ?f2)
  267.   (assert (monkey ?place ?obj blank)))
  268.  
  269. (defrule already-on-object ""
  270.   ?f1 <- (goal-is-to active on ?obj)
  271.   (monkey ? ?obj ?)
  272.   =>
  273.   (retract ?f1))
  274.  
  275. ;;;**********************
  276. ;;;* process eat object * 
  277. ;;;**********************
  278.  
  279. (defrule hold-to-eat ""
  280.   (goal-is-to active eat ?obj)
  281.   (monkey ? ? ~?obj)
  282.   (not (goal-is-to active holds ?obj))
  283.   =>
  284.   (assert (goal-is-to active holds ?obj)))
  285.  
  286. (defrule satisfy-hunger ""
  287.   ?f1 <- (goal-is-to active eat ?obj)
  288.   ?f2 <- (monkey ?place ?on ?obj)
  289.   ?f3 <- (object ?obj ? ? ? ? ?)
  290.   =>
  291.   (printout "Monkey eats the " ?obj "." crlf)
  292.   (retract ?f1 ?f2 ?f3)
  293.   (assert (monkey ?place ?on blank)))
  294.  
  295. ;;;*****************
  296. ;;;* initial-state * 
  297. ;;;*****************
  298.  
  299. (defrule startup ""
  300.   (initial-fact)
  301.   =>
  302.   (assert (monkey t5-7 green-couch blank))
  303.   (assert (object green-couch t5-7 heavy floor foo foo))
  304.   (assert (object red-couch t2-2 heavy floor foo foo))
  305.   (assert (object big-pillow t2-2 light red-couch foo foo))
  306.   (assert (object red-chest t2-2 light big-pillow ladder red-key))
  307.   (assert (object blue-chest t7-7 light ceiling bananas blue-key))
  308.   (assert (object blue-couch t8-8 heavy floor foo foo))
  309.   (assert (object green-chest t8-8 light ceiling blue-key red-key))
  310.   (assert (object red-key t1-3 light floor foo foo))
  311.   (assert (goal-is-to active eat bananas)))
  312.