Не член правила в прологе не работает, как ожидалось
Я пытаюсь написать простую программу поиска лабиринта в прологе, прежде чем добавить комнату в список посещенных, я проверяю, является ли она уже членом списка посещенных. Однако я не могу заставить это работать, даже если я использую код из книги:
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).