Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defun make-state (f w g c) #|Собираем новое состояние из выражений, обозначающих берег реки(East or West) на котором находится тот|#
- (list f w g c) #|или иной персонаж|#
- )
- (defun member-lis (x lis) #|Проверяем принадлежность элемента списку списков|#
- (cond ((null lis) nil)
- ((equal x (car lis)) t)
- (t (member-lis x (cdr lis)))
- )
- )
- (defun opposite (side) #|Возращаем берег реки(западный или восточный) противоположный переданному|#
- (cond ((equal side 'e) 'w)
- ((equal side 'w) 'e)
- )
- )
- (defun safe (state) #|Возвращаем переданное состояние, если оно не приводит к поеданию капусты ил козы, или null в ином случае|#
- (cond ((and (equal (goat-side state) (wolf-side state))
- (not (equal (farmer-side state) (wolf-side state)))
- ) nil)
- ((and (equal (goat-side state) (cabbage-side state))
- (not (equal (farmer-side state) (goat-side state)))
- ) nil)
- (t state)
- )
- )
- (defun farmer-side (state) #|Возвращаем сторону берега, на которой находится крестьянин|#
- (nth 0 state)
- )
- (defun wolf-side (state) #|Возвращаем сторону берега, на которой находится волк|#
- (nth 1 state)
- )
- (defun goat-side (state) #|Возвращаем сторону берега, на которой находится коза|#
- (nth 2 state)
- )
- (defun cabbage-side (state) #|Возвращаем сторону берега, на которой находится капуста|#
- (nth 3 state)
- )
- (defun farmer-take-self (state) #|возвращаем состояние, когда крестьянин не берет в лодку никого|#
- (safe (make-state (opposite (farmer-side state))
- (wolf-side state)
- (goat-side state)
- (cabbage-side state)
- )
- )
- )
- (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)
- )
- )
- (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)
- )
- )
- (defun path (state goal been-list)
- (cond ((null state) nil) #|При невозможности решения вернем null|#
- ((equal state goal) (reverse (cons state been-list))) #|При достижении цели вернем список проделанных шагов|#
- ((not (member-lis state been-list )) #|Иначе, при условии, что текущую позицию мы ранее не рассматривали, попробуем|#
- (or (path (farmer-take-self state) goal (cons state been-list)) #|сделать каждое из 4-х действий, и вернем то из|#
- (path (farmer-take-wolf state) goal (cons state been-list)) #|них, которое не null|#
- (path (farmer-take-goat state) goal (cons state been-list))
- (path (farmer-take-cabbage state) goal (cons state been-list))
- )
- )
- )
- )
- (defun solve-fwgc (state goal)
- (path state goal nil)
- )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement