Функциональное программирование




Поиск на лиспе. Функционалы. Свойства символов - часть 2


Однако могут быть опасные состояния: например, когда W, G или G, C находятся на одном берегу.

Программа должна найти в качестве решения только безопасные состояния. Проверка на опасные состояния должна производиться на разных cтадиях программы. В нашем случае это можно сделать в функциях движения.

Реализуем это, используя функцию safe, которая имеет следующее поведение:

* (safe '(w w w w)) ; состояние безопасно, возвращается без изменений


(w w w w)

Safe используется в каждой функции перемещения для отфильтрования опасных состояний. Таким образом, любое перемещение, которое ведет к опасному состоянию будет возвращать nil вместо состояния. Алгоритм формирования пути может проверять этот nil и использовать его для избегания этого состояния.

Используя safe, будем иметь:

(defun farmer-take-wolf (state)
(cond ((equal (farmer-side state) (wolf-side state))
(safe (make-state (opposite (farmer-side state))
(opposite(wolf-side state))
(goat-side state)
(cabbage-side state))))
(t nil)))

Оставшиеся функции движения определяются аналогично, но включают условный тест для определения, находятся ли фермер и предполагаемый пассажир на одной и той же стороне реки. Если нет, то перемещение не может быть сделано, то есть пассажир и фермер не находятся на одном берегу, эта функция будет возвращать nil.

(defun farmer-take-goat (state)
(cond ((equal (farmer-side state) (goat-side state))
(safe (make-state (opposite (farmer-side state))
(wolf-side state)
(opposite(goat-side state))
(cabbage-side state))))
(t nil)))

(defun farmer-take-cabbage (state)
(cond ((equal (farmer-side state) (cabbage-side state))
(safe (make-state (opposite (farmer-side state))
(wolf-side state)
(goat-side state)
(opposite(cabbage-side state)))))
(t nil)))

Теперь можно определить функцию opposite, которая возвращает другую сторону.

(defun opposite (side)
(cond ((equal side 'e) 'w)
((equal side 'w) 'e)))

Safe определена с использованием cond для проверки двух опасных состояний: F находится на противоположном берегу от W, G, и от G и C.




Содержание  Назад  Вперед