;;; -*- Mode: LISP; Syntax: Common-lisp; Package: sipe-cl; Base: 10; -*- (in-package :sipe) ;AUTHORS: Carla O. Ludlow and Karen M. Alguire and David E. Wilkins (setq *domain-name* 'Missionaries-and-Cannibals) (setq *DEFAULT-DEPTH-LIMIT* 14) ;extend default depth limit (DEFINE.DOMAIN) CLASS: river-banks INSTANCES: left-bank, right-bank END CLASS CLASS: people INSTANCES: cannibals, missionaries END CLASS CLASS: boats INSTANCES: two-people-boat END CLASS STOP (DEFINE.DOMAIN) static-predicates: (opposite-bank) PREDICATES: (opposite-bank left-bank right-bank) (opposite-bank right-bank left-bank) (state 3 3 0 0 left-bank) ;prevent the return to identical states, eg identical return trip (on two-people-boat left-bank) (level cannibals left-bank 3) (level cannibals right-bank 0) (level missionaries left-bank 3) (level missionaries right-bank 0) END PREDICATES STOP (DEFINE.DOMAIN) ;;==============================OPERATORS============================== ;;; These 2 operators instigate trips by (1) ordering of operators ;; (prefer 2 people when moving to goal, 1 person on return trips), and ;; (2) computing numerical values of state for use in move oprs. OPERATOR: SEND-TRIP-TO-RIGHT ARGUMENTS: continuous1, numerical1 is previous value of continuous1, continuous2, numerical2 is previous value of continuous2, continuous3, numerical3 is previous value of continuous3, continuous4, numerical4 is previous value of continuous4; PURPOSE: (move-everybody) PRECONDITION: (on two-people-boat left-bank) (level cannibals left-bank continuous1) (level cannibals right-bank continuous2) (level missionaries left-bank continuous3) (level missionaries right-bank continuous4); PLOT: CHOICEPROCESS: ACTION: move-mc, move-2-c, move-2-m, move-1-c, move-1-m; ARGUMENTS: numerical1,numerical3,numerical2,numerical4,right-bank; EFFECTS: (on two-people-boat right-bank); GOAL: (move-everybody) END PLOT END OPERATOR OPERATOR: SEND-TRIP-TO-LEFT ARGUMENTS: continuous1, numerical1 is previous value of continuous1, continuous2, numerical2 is previous value of continuous2, continuous3, numerical3 is previous value of continuous3, continuous4, numerical4 is previous value of continuous4; PURPOSE: (move-everybody); PRECONDITION: (on two-people-boat right-bank) (level cannibals left-bank continuous1) (level cannibals right-bank continuous2) (level missionaries left-bank continuous3) (level missionaries right-bank continuous4); PLOT: CHOICEPROCESS: ACTION: end-mc, move-1-m, move-1-c, move-mc, move-2-c, move-2-m; ARGUMENTS: numerical2,numerical4,numerical1,numerical3,left-bank; EFFECTS: (on two-people-boat left-bank); GOAL: (move-everybody) END PLOT END OPERATOR OPERATOR: END-MC ARGUMENTS: numerical1, numerical2, numerical3, numerical4, river-bank1; PRECONDITION: (level missionaries left-bank 0) (level cannibals left-bank 0); PLOT: PROCESS ACTION: no-human-stew EFFECTS: (move-everybody); END PLOT END OPERATOR ;;================================= Move Operators ================= OPERATOR: MOVE-MC ARGUMENTS: numerical3, numerical4, numerical1, numerical2, river-bank1, numerical5 is (sipe+ 1 numerical1), numerical6 is (sipe+ 1 numerical2), numerical7 is (sipe+ -1 numerical3), numerical8 is (sipe+ -1 numerical4), river-bank2; PRECONDITION: (opposite-bank river-bank1 river-bank2) (not (state numerical5 numerical6 numerical7 numerical8 river-bank1)) (level>= cannibals river-bank2 1) (level>= missionaries river-bank2 1) (or (level missionaries river-bank2 1) (level<= numerical7 numerical8)) (level<= numerical5 numerical6); PLOT: PROCESS ACTION: row-mc ARGUMENTS: numerical3, numerical4, numerical1, numerical2, river-bank1; EFFECTS: (on two-people-boat river-bank1) (produce cannibals river-bank1 1) (produce missionaries river-bank1 1) (state numerical5 numerical6 numerical7 numerical8 river-bank1); END PLOT END OPERATOR OPERATOR: MOVE-2-C ARGUMENTS: numerical3, numerical4, numerical1, numerical2, river-bank1, numerical5 is (sipe+ -2 numerical3), numerical6 is (sipe+ 2 numerical1), numerical7 is (sipe+ 0 numerical4), numerical8 is (sipe+ 0 numerical2), river-bank2 ; PRECONDITION: (opposite-bank river-bank1 river-bank2) (not (state numerical6 numerical8 numerical5 numerical7 river-bank1)) (level>= cannibals river-bank2 2) (or (level missionaries river-bank1 0) (level>= missionaries river-bank1 numerical6)); PLOT: PROCESS ACTION: row-2-c ARGUMENTS: numerical3, numerical4, numerical1, numerical2, river-bank1; EFFECTS: (on two-people-boat river-bank1) (produce cannibals river-bank1 2) (state numerical6 numerical8 numerical5 numerical7 river-bank1); END PLOT END OPERATOR OPERATOR: MOVE-1-C ARGUMENTS: numerical3, numerical4, numerical1, numerical2, river-bank1, numerical5 is (sipe+ -1 numerical3), numerical6 is (sipe+ 1 numerical1), numerical7 is (sipe+ 0 numerical4), numerical8 is (sipe+ 0 numerical2),river-bank2; PRECONDITION: (opposite-bank river-bank1 river-bank2) (not (state numerical6 numerical8 numerical5 numerical7 river-bank1)) (level>= cannibals river-bank2 1) (or (level missionaries river-bank1 0) (level>= missionaries river-bank1 numerical6)); PLOT: PROCESS ACTION: row-1-c ARGUMENTS: numerical3, numerical4, numerical1, numerical2, river-bank1; EFFECTS: (on two-people-boat river-bank1) (produce cannibals river-bank1 1) (state numerical6 numerical8 numerical5 numerical7 river-bank1); END PLOT END OPERATOR OPERATOR: MOVE-2-M ARGUMENTS: numerical3, numerical4, numerical1, numerical2, river-bank1, numerical5 is (sipe+ -2 numerical4), numerical6 is (sipe+ 2 numerical2), numerical7 is (sipe+ 0 Numerical3), numerical8 is (sipe+ 0 numerical1), river-bank2 ; PRECONDITION: (opposite-bank river-bank1 river-bank2) (not (state numerical8 numerical6 numerical7 numerical5 river-bank1)) (level>= missionaries river-bank2 2) (or (level missionaries river-bank2 2) (level<= cannibals river-bank2 numerical5)), (level<= cannibals river-bank1 numerical6); PLOT: PROCESS ACTION: row-2-m ARGUMENTS: numerical3, numerical4, numerical1, numerical2, river-bank1; EFFECTS: (on two-people-boat river-bank1) (produce missionaries river-bank1 2) (state numerical8 numerical6 numerical7 numerical5 river-bank1); END PLOT END OPERATOR OPERATOR: MOVE-1-M ARGUMENTS: numerical3, numerical4, numerical1, numerical2, river-bank1, numerical5 is (sipe+ -1 numerical4), numerical6 is (sipe+ 1 numerical2), numerical7 is (sipe+ 0 numerical3), numerical8 is (sipe+ 0 numerical1), river-bank2; PRECONDITION: (opposite-bank river-bank1 river-bank2) (not (state numerical8 numerical6 numerical7 numerical5 river-bank1)) (level>= missionaries river-bank2 1) (or (level missionaries river-bank2 1) (level<= cannibals river-bank2 numerical5)), (level<= cannibals river-bank1 numerical6); PLOT: PROCESS ACTION: row-1-m ARGUMENTS: numerical3, numerical4, numerical1, numerical2, river-bank1; EFFECTS: (on two-people-boat river-bank1) (produce missionaries river-bank1 1) (state numerical8 numerical6 numerical7 numerical5 river-bank1); END PLOT END OPERATOR ;;========================== Causal Theory ============================ CAUSAL-RULE: ON-BANK-NOT-ON-OTHER-BANK ARGUMENTS: boat1, river-bank1, river-bank2; TRIGGER: (on boat1 river-bank1); PRECONDITION: (on boat1 river-bank2) (opposite-bank river-bank1 river-bank2); EFFECTS: (not (on boat1 river-bank2)); END CAUSAL-RULE CAUSAL-RULE: PRODUCE-AND-CONSUME-CANNIBALS ARGUMENTS: cannibals, river-bank1, numerical3, river-bank2; TRIGGER: (produce cannibals river-bank1 numerical3); PRECONDITION: (opposite-bank river-bank1 river-bank2) EFFECTS: (consume cannibals river-bank2 numerical3); END CAUSAL-RULE CAUSAL-RULE: PRODUCE-AND-CONSUME-MISSIONARYS ARGUMENTS: missionaries, river-bank1, numerical3, river-bank2; TRIGGER: (produce missionaries river-bank1 numerical3); PRECONDITION: (opposite-bank river-bank1 river-bank2) EFFECTS: (consume missionaries river-bank2 numerical3); END CAUSAL-RULE STOP ;;========================= Problem ========================== (DEFINE.PROBLEM) PROBLEM: move-3-of-each Goal: (move-everybody) END PROBLEM STOP ;; ========== Customizes plan printing to use English-like phrases (setq name-flag :text-description args-flag nil) (setq *ACTION-DOCUMENTATION-STRINGS* '((row-1-m (5) "Row 1 missionary~% to ~A") (row-2-m (5) "Row 2 missionaries~% to ~A") (row-2-c (5) "Row 2 cannibals~% to ~A") (row-1-c (5) "Row 1 cannibal~% to ~A") (row-mc (5) "Row 1 cannibal and 1 missionary~% to ~A") )) (setq *DOCUMENTATION-STRINGS* '((move-everybody nil "Move everybody on the left-bank~% to the right-bank")))