Не член правила в прологе не работает, как ожидалось

Я пытаюсь написать простую программу поиска лабиринта в прологе, прежде чем добавить комнату в список посещенных, я проверяю, является ли она уже членом списка посещенных. Однако я не могу заставить это работать, даже если я использую код из книги:

d(a,b).
d(b,e).
d(b,c).
d(d,e).
d(c,d).
d(e,f).
d(g,e).


go(X, X, T).
go(X, Y, T) :-
    (d(X,Z) ; d(Z, X)),
    \+ member(Z,T),
    go(Z, Y, [Z|T]).

Что я делаю не так?

1 ответ

Решение

Ваша программа вроде бы в порядке. Я полагаю, проблема в том, что вы вызываете go/3 с необоснованным третьим аргументом. В этом случае член (X, T) всегда будет успешным, что приведет к неудаче в предложении.

Вы можете вызвать свой предикат с пустым списком в качестве третьего параметра: например,

?- go(a, g, []).
true

Если вы хотите вернуть путь, подумайте о добавлении другого параметра, например:

go(From, To, Path):-
  go(From, To, [], Path).

go(X, X, T, T).
go(X, Y, T, NT) :-
    (d(X,Z) ; d(Z, X)),
    \+ member(Z,T),
    go(Z, Y, [Z|T], NT).
Другие вопросы по тегам