На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Lisp , рыцари и оруженосцы
      Здравствуйте. Очень прошу помощи в нахождении ошибки в программе. Имеет такая задача:
      Три рыцаря, каждый в сопровождении оруженосца, съехались на берегу реки, намереваясь переправиться на другую сторону. Им удалось найти маленькую двухместную лодку, и переправа произошла бы легко, ведь лошади могли перебраться вплавь. Но одно затруднение чуть было не помешало этому предприятию. Все оруженосцы, словно сговорившись, наотрез отказались оставаться в обществе незнакомых рыцарей без своих хозяев. Не помогли ни уговоры, ни угрозы. Трусливые оруженосцы упорно стояли на своём. И всё же переправа состоялась, все шесть человек благополучно перебрались на другой берег с помощью одной двухместной лодки. При этом соблюдалось условие, на котором настаивали оруженосцы. Как это было сделано?
      Программу делала по люгеру. После запуска функции solve решения не находит (nil). Очень расчитываю на Вашу помощь, заранее спасибо!
      ExpandedWrap disabled
        ;  Функция которая определят принадлежность элемента списку
         
        (defun member-l (x l)
            (cond ((null l) nil)
                    ((equal x (car l)) t)
                    (t (member-l x (cdr l)))
            )
        )  
         
         
         
         
         
        ; Функции для задания состояний для каждого персонажа
         
        (defun make-state (r1 r2 r3 o1 o2 o3 l) (list r1 r2 r3 o1 o2 o3 l))
         
        (defun r1-side (state)
            (nth 0 state))
         
        (defun r2-side (state)
            (nth 1 state))
         
        (defun r3-side (state)
            (nth 2 state))
         
        (defun o1-side (state)
            (nth 3 state))
         
        (defun o2-side (state)
            (nth 4 state))
         
        (defun o3-side (state)
            (nth 5 state))
         
        (defun l-side (state)
            (nth 6 state))
         
         
        ;  Функция которая задает состояние противоположное текущему
         
        (defun opposite (side)
            (cond ((equal side 'e) 'w)
                ((equal side 'w) 'e)))  
         
         
        ;   Функция которая проверяет безопасноть текущего состояния
         
         
         
        (defun safe (state)
            (cond ((and (equal (r1-side state) (o2-side state))
                        (not (equal (r2-side state) (o2-side state)))) nil)
         
                    ((and (equal (r1-side state) (o3-side state))
                        (not (equal (r3-side state) (o3-side state)))) nil)
         
                    ((and (equal (r2-side state) (o1-side state))
                        (not (equal (r1-side state) (o1-side state)))) nil)
         
                    ((and (equal (r2-side state) (o3-side state))
                        (not (equal (r3-side state) (o3-side state)))) nil)
         
                    ((and (equal (r3-side state) (o1-side state))
                        (not (equal (r1-side state) (o1-side state)))) nil)
         
                    ((and (equal (r3-side state) (o2-side state))
                        (not (equal (r2-side state) (o2-side state)))) nil)
         
            (t state))  )
         
         
        ;  Функции которые задают состояния при перемещении персонажей
        ; сами себя перевозят
         
        (defun r1-take-self (state)
            (cond ((equal (r1-side state) (l-side state))
                    (safe (make-state (opposite (r1-side state))
                                (r2-side state)
                                (r3-side state)
                                (o1-side state)
                                (o2-side state)
                                (o3-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )      
         
         
        (defun r2-take-self (state)
                (cond ((equal (r2-side state) (l-side state))
                        (safe (make-state (opposite (r2-side state))
                                    (r1-side state)
                                    (r3-side state)
                                    (o1-side state)
                                    (o2-side state)
                                    (o3-side state)
                                    (opposite (l-side state)))))
                    (t nil)
            )
        )  
         
        (defun r3-take-self (state)
            (cond ((equal (r3-side state) (l-side state))
                    (safe (make-state (opposite (r3-side state))
                                (r2-side state)
                                (r1-side state)
                                (o1-side state)
                                (o2-side state)
                                (o3-side state)
                                (opposite (l-side state)))))
                (t nil)
            )
        )  
         
        (defun o1-take-self (state)
            (cond ((equal (o1-side state) (l-side state))
                    (safe (make-state (opposite (o1-side state))
                                (r2-side state)
                                (r3-side state)
                                (r1-side state)
                                (o2-side state)
                                (o3-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )    
         
        (defun o2-take-self (state)
            (cond ((equal (o2-side state) (l-side state))
                    (safe (make-state (opposite (o2-side state))
        (r2-side state)
        (r3-side state)
        (o1-side state)
        (r1-side state)
        (o3-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )  
         
        (defun o3-take-self (state)
            (cond ((equal (o3-side state) (l-side state))
        (safe (make-state (opposite (o3-side state))
        (r2-side state)
        (r3-side state)
        (o1-side state)
        (o2-side state)
        (r1-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )  
         
         
         
        (defun r1-take-r2 (state)
                (cond (( and(equal (r1-side state) (r2-side state))
                        (equal (r1-side state) (l-side state)))
                (safe (make-state (opposite (r1-side state))
                                    (opposite(r2-side state))
                                (r3-side state)
                                (o1-side state)
                                (o2-side state)
                                (o3-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )  
        (defun r1-take-r3 (state)
        (cond (( and(equal (r1-side state) (r3-side state))
                        (equal (r1-side state) (l-side state)))
        (safe (make-state (opposite (r1-side state))
        (opposite(r3-side state))
        (r2-side state)
        (o1-side state)
        (o2-side state)
        (o3-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )  
        (defun r1-take-o1 (state)
        (cond (( and(equal (r1-side state) (o1-side state))
                        (equal (r1-side state) (l-side state)))
        (safe (make-state (opposite (r1-side state))
        (opposite(o1-side state))
        (r3-side state)
        (r2-side state)
        (o2-side state)
        (o3-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )  
         
        (defun r2-take-r3 (state)
        (cond (( and(equal (r2-side state) (r3-side state))
                        (equal (r2-side state) (l-side state)))
        (safe (make-state (opposite (r2-side state))
        (opposite(r3-side state))
        (r1-side state)
        (o1-side state)
        (o2-side state)
        (o3-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )  
         
        (defun r2-take-o2 (state)
        (cond (( and(equal (r2-side state) (o2-side state))
                        (equal (r2-side state) (l-side state)))
        (safe (make-state (opposite (r2-side state))
        (opposite(o2-side state))
        (r1-side state)
        (o1-side state)
        (r3-side state)
        (o3-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )  
        (defun r3-take-o3 (state)
        (cond (( and(equal (r3-side state) (o3-side state))
                        (equal (r3-side state) (l-side state)))
        (safe (make-state (opposite (r3-side state))
        (opposite(o3-side state))
        (r1-side state)
        (o1-side state)
        (o2-side state)
        (r2-side state)
        (l-side state))))
        (t nil)))
         
        (defun o1-take-o2 (state)
        (cond (( and(equal (o1-side state) (o2-side state))
                        (equal (o1-side state) (l-side state)))
        (safe (make-state (opposite (o1-side state))
        (opposite(o2-side state))
        (r1-side state)
        (o3-side state)
        (r2-side state)
        (r3-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )  
         
        (defun o1-take-o3 (state)
        (cond (( and(equal (o1-side state) (o3-side state))
                        (equal (o1-side state) (l-side state)))
                (safe (make-state (opposite (o1-side state))
                                (opposite(o3-side state))
        (r1-side state)
        (r2-side state)
        (o2-side state)
        (r3-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )  
        (defun o2-take-o3 (state)
        (cond (( and(equal (o2-side state) (o3-side state))
                        (equal (o2-side state) (l-side state)))
        (safe (make-state (opposite (o2-side state))
        (opposite(o3-side state))
        (r1-side state)
        (o1-side state)
        (r2-side state)
        (r3-side state)
                                (opposite (l-side state)))))
                    (t nil)
            )
        )  
         
         
        ;   Функция которая обходит в ширину все состояния до текущего до конечного (кроме последнего уровня) при задании списка просмотренных вершин
         
         
        (defun path (state goal been-list)
            ( cond ((null state) nil)
            ((equal state goal) (reverse (cons state been-list)))
            ((not (member-l state been-list))
                (or
                    (path (r1-take-self state) goal (cons state been-list))
                    (path (r2-take-self state) goal (cons state been-list))
                    (path (r3-take-self state) goal (cons state been-list))
                    (path   (o1-take-self state) goal (cons state been-list))
                    (path   (o2-take-self state) goal (cons state been-list))
                    (path   (o3-take-self state) goal (cons state been-list))
                    (path   (r1-take-r2 state) goal (cons state been-list))
                    (path   (r1-take-r3 state) goal (cons state been-list))
                    (path   (r1-take-o1 state) goal (cons state been-list))
                    (path   (r2-take-r3 state) goal (cons state been-list))
                    (path   (r2-take-o2 state) goal (cons state been-list))
                    (path   (r3-take-o3 state) goal (cons state been-list))
                    (path   (o1-take-o2 state) goal (cons state been-list))
                    (path   (o1-take-o3 state) goal (cons state been-list))
                    (path   (o2-take-o3 state) goal (cons state been-list))
                )
            )
        )
        )
                
        (defun solve (state goal)
            (path state goal nil)
        )
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0206 ]   [ 15 queries used ]   [ Generated: 20.04.24, 00:36 GMT ]