;;;;;;;;; ;Exercice 7.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; 1.1 (gps '(son-at-home car-works) '(son-at-school) *school-ops*) ;; l'appel pour lequel la base d'actions est faite: (gps '(son-at-home car-needs-battery have-money have-phone-book) '(son-at-school) *school-ops*) (defparameter *op1* (make-op :action 'go-to-work :preconds '(son-at-school) :add-list '(at-work))) ;;; 1.2 ; suffisant: ; (push *op* *school-ops*) ; la solution suivante ne marche pas (pas d'effet de bord): ;(defun add-op (op ops) ; (push op ops)) ;(add-op op *school-ops*) ;; pour comprendre les effets de bords par des fonctions, vous pouvez tester: (defun f (l) (setf (cdr l) nil)) (defun add_in_2nd_position (x l) (let ((cdrl (cdr l))) (setf (cdr l) (list x)) (setf (cddr l) cdrl) l)) ;; possibilité avec une macro: (defmacro add-op (op ops) `(push ,op ,ops)) ;;;;;;;;;; Exercice 7.2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Une version simplifiée de la version originale du labyrinte ;;; sans "convert", sans notation en prédicats "(at n)" (cf. version finale de gps) ;;; sans symétrisation des règles. (defun op-simple (action preconds add-list del-list) "Make a new operator " (make-op :action action :preconds preconds :add-list add-list :del-list del-list)) (defun make-maze-op (here there) "Make an operator to move between two places" (op-simple `(move from ,here to ,there) `(,here) `(,there) `(,here))) (defun make-maze-ops (pair) (make-maze-op (first pair) (second pair))) (defparameter *laby0* '((1 2) (2 3) (3 4) (4 9) (9 14) (9 8) (8 7) (7 12) (12 13) (12 11) (11 6) (11 16) (16 17) (17 22) (21 22) (22 23) (23 18) (23 24) (24 19) (19 20) (20 15) (15 10) (10 5) (20 25))) (defparameter *maze-ops0* (mapcar #'make-maze-ops *laby0*)) ; (gps '(1) '(25) *maze-ops0*) ;; on rajoute une boucle: (defparameter *laby1* '((25 20) (1 2) (2 3) (3 4) (4 9) (9 14) (9 8) (8 7) (7 12) (12 13) (12 11) (11 6) (11 16) (16 17) (17 22) (21 22) (22 23) (23 18) (23 24) (24 19) (19 20) (20 15) (15 10) (10 5) (20 25))) (defparameter *maze-ops1* (mapcar #'make-maze-ops *laby1*)) ; (gps '(1) '(25) *maze-ops1*); boucle entre 20 et 25 ;;;;;;;;;; Exercice 7.3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; 3.1 ;; cf. la boucle dans le labyrinthe ci-dessus ;; ou, dans l'exemple de *school-ops*, une règle du genre: (push (make-op :action 'get-money :preconds '(have-money) :add-list '(have-money)) *school-ops*) ;;; 3.2 ;; un but avec deux sous-buts => ceux-ci ne sont pas réalisés simultanément ;; comme le laisse penser l'appel, mais séquentiellement. En fait, ;; l'argent sera dépensé par l'achieve du but son-at-school, et donc le ;; but ne sera pas réalisé: (gps '(son-at-home car-needs-battery have-money have-phone-book) '(have-money son-at-school) *school-ops*) ;(EXECUTING LOOK-UP-NUMBER) ;(EXECUTING TELEPHONE-SHOP) ;(EXECUTING TELL-SHOP-PROBLEM) ;(EXECUTING GIVE-SHOP-MONEY) ;(EXECUTING SHOP-INSTALLS-BATTERY) ;(EXECUTING DRIVE-SON-TO-SCHOOL) ;SOLVED ;;; 3.3 ;; Et donc, dans le cas où les deux sous-buts sont dans un ordre inversé, ;; la résolution échoue. (gps '(son-at-home car-needs-battery have-money have-phone-book) '(son-at-school have-money) *school-ops*) ;(EXECUTING LOOK-UP-NUMBER) ;(EXECUTING TELEPHONE-SHOP) ;(EXECUTING TELL-SHOP-PROBLEM) ;(EXECUTING GIVE-SHOP-MONEY) ;(EXECUTING SHOP-INSTALLS-BATTERY) ;(EXECUTING DRIVE-SON-TO-SCHOOL) ;NIL