Фермер козий волк и капуста в Прологе через поиск в ширину

Я пытаюсь разгадать загадку Фермер, Козел, Волк, Капуста в Прологе, используя технику Первой ширины, и я сталкиваюсь с некоторыми проблемами. Когда я пытаюсь собрать все действительные комбинации для второго уровня дерева, это терпит неудачу. Вот соответствующий код,

extend([Node|Path], NewPaths) :-
    bagof([NewNode, Node|Path],
        (s(Node, NewNode), not(member(NewNode, [Node|Path]))),
        NewPaths),
    !.
extend(Path, []).

s(state(X,X,W,C), state(Y,Y,W,C))
    :- opp(X,Y), not(unsafe(state(Y,Y,W,C))).
s(state(X,G,X,C), state(Y,G,Y,C))
    :- opp(X,Y), not(unsafe(state(Y,G,Y,C))). 
s(state(X,G,W,X), state(Y,G,W,Y))
    :- opp(X,Y), not(unsafe(state(Y,G,W,Y))).
s(state(X,G,W,C), state(Y,G,W,C))
    :- opp(X,Y), not(unsafe(state(Y,G,W,C))).
s(state(F,G,W,C), state(F,G,W,C))
    :- fail.

opp(e,w).
opp(w,e).

unsafe(state(X,Y,Y,C)) :- opp(X,Y).
unsafe(state(X,Y,W,Y)) :- opp(X,Y).

not(P) :-
    P, !, fail
    ;
    true.

Предикат расширения - это то, где я вижу проблемы. Когда я запускаю его на первом уровне, он работает нормально,

?- extend([state(e,e,e,e)],[X]).
X = [state(w,w,e,e),state(e,e,e,e)]

Когда я запускаю второй уровень, он терпит неудачу,

?- extend([state(w,w,e,e)],[X]).
no

Он должен вернуть что-то вроде следующего,

X = [state(e,w,e,e),state(w,w,e,e),state(e,e,e,e)]

Заранее спасибо за вашу помощь, так как это очень ценится.

С Уважением,

Darian

1 ответ

Решение

Если я запрашиваю ваш код, я получаю

?- extend([state(w,w,e,e)],X).
X = [[state(e, e, e, e), state(w, w, e, e)], [state(e, w, e, e), state(w, w, e, e)]]

X это список списков. Затем я упростил предикат extend/2,

extend([Node|Path], [Node|NewPaths]) :-
    bagof(NewNode,
        (s(Node, NewNode), not(member(NewNode, Path))),
        NewPaths).

и я получаю

?- extend([state(w,w,e,e)],X).
X = [state(w, w, e, e), state(e, e, e, e), state(e, w, e, e)].

Обратите внимание, что я не использую [X] расширение запроса /2.

Кстати, этот пункт бесполезен

s(state(F,G,W,C), state(F,G,W,C))
    :- fail.
Другие вопросы по тегам