Advertisement
Guest User

Проблема Крестьянина (Ларионов Д.С)

a guest
Dec 8th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 4.77 KB | None | 0 0
  1. (defun make-state (f w g c) #|Собираем новое состояние из выражений, обозначающих берег реки(East or West) на котором находится тот|#
  2.     (list f w g c) #|или иной персонаж|#
  3. )
  4.  
  5. (defun member-lis (x lis) #|Проверяем принадлежность элемента списку списков|#
  6.     (cond ((null lis) nil)
  7.           ((equal x (car lis)) t)
  8.           (t (member-lis x (cdr lis)))
  9.     )
  10. )
  11.  
  12. (defun opposite (side) #|Возращаем берег реки(западный или восточный) противоположный переданному|#
  13.     (cond ((equal side 'e) 'w)
  14.           ((equal side 'w) 'e)
  15.     )
  16. )
  17.  
  18. (defun safe (state) #|Возвращаем переданное состояние, если оно не приводит к поеданию капусты ил козы, или null в ином случае|#
  19.     (cond ((and (equal (goat-side state) (wolf-side state))
  20.                 (not (equal (farmer-side state) (wolf-side state)))
  21.            ) nil)
  22.           ((and (equal (goat-side state) (cabbage-side state))
  23.                 (not (equal (farmer-side state) (goat-side state)))
  24.            ) nil)
  25.           (t state)
  26.      )
  27. )
  28.  
  29. (defun farmer-side (state) #|Возвращаем сторону берега, на которой находится крестьянин|#
  30.     (nth 0 state)
  31. )
  32.  
  33. (defun wolf-side (state) #|Возвращаем сторону берега, на которой находится волк|#
  34.     (nth 1 state)
  35. )
  36.  
  37. (defun goat-side (state) #|Возвращаем сторону берега, на которой находится коза|#
  38.     (nth 2 state)
  39. )
  40.  
  41. (defun cabbage-side (state) #|Возвращаем сторону берега, на которой находится капуста|#
  42.     (nth 3 state)
  43. )
  44.  
  45. (defun farmer-take-self (state) #|возвращаем состояние, когда крестьянин не берет в лодку никого|#
  46.     (safe (make-state (opposite (farmer-side state))
  47.                       (wolf-side state)
  48.                       (goat-side state)
  49.                       (cabbage-side state)
  50.           )
  51.     )
  52. )
  53.  
  54. (defun farmer-take-wolf (state) #|возвращаем состояние, когда крестьянин берет с собой волка|#
  55.     (cond ((equal (farmer-side state) (wolf-side state))
  56.                (safe (make-state (opposite (farmer-side state))
  57.                                  (opposite(wolf-side state))
  58.                                  (goat-side state)
  59.                                  (cabbage-side state))
  60.                )
  61.            )
  62.            (t nil)
  63.     )
  64. )
  65.  
  66. (defun farmer-take-goat (state) #|возвращаем состояние, когда крестьянин берет с собой козу|#
  67.     (cond ((equal (farmer-side state) (goat-side state))
  68.                (safe (make-state (opposite (farmer-side state))
  69.                                  (wolf-side state)
  70.                                  (opposite (goat-side state))
  71.                                  (cabbage-side state)
  72.                      )
  73.                )
  74.           )
  75.           (t nil)
  76.     )
  77. )
  78.  
  79. (defun farmer-take-cabbage (state) #|возвращаем состояние, когда крестьянин берет с собой капусту|#
  80.     (cond ((equal (farmer-side state) (cabbage-side state))
  81.                (safe (make-state (opposite (farmer-side state))
  82.                                  (wolf-side state)
  83.                                  (goat-side state)
  84.                                  (opposite (cabbage-side state))
  85.                      )
  86.                )
  87.           )
  88.           (t nil)
  89.     )
  90. )
  91.  
  92. (defun path (state goal been-list)
  93.     (cond ((null state) nil) #|При невозможности решения вернем null|#
  94.           ((equal state goal) (reverse (cons state been-list))) #|При достижении цели вернем список проделанных шагов|#
  95.           ((not (member-lis state been-list )) #|Иначе, при условии, что текущую позицию мы ранее не рассматривали, попробуем|#
  96.            (or (path (farmer-take-self state) goal (cons state been-list)) #|сделать каждое из 4-х действий, и вернем то из|#
  97.                (path (farmer-take-wolf state) goal (cons state been-list)) #|них, которое не null|#
  98.                (path (farmer-take-goat state) goal (cons state been-list))
  99.                (path (farmer-take-cabbage state) goal (cons state been-list))
  100.            )
  101.           )
  102.     )
  103. )
  104.  
  105. (defun solve-fwgc (state goal)
  106.     (path state goal nil)
  107. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement