У меня есть следующая рабочая программа: (Ее можно протестировать на этом сайте: http://swish.swi-prolog.org, я удалил прямую ссылку на сохраненную программу, так как заметил, что кто угодно может ее редактировать.)
Он ищет путь между двумя точками в неориентированном графе. Важная часть заключается в том, что результат возвращается в области видимости «основного» предиката. (В переменной Track)
edge(a, b).
edge(b, c).
edge(d, b).
edge(d, e).
edge(v, w).
connected(Y, X) :-
(
edge(X, Y);
edge(Y, X)
).
path(X, X, _, []) :-
connected(X, _).
path(X, Y, _, [X, Y]) :-
connected(Y, X).
path(X, Z, Visited, [X|Track]) :-
connected(X, Y),
not(member(X, Visited)),
path(Y, Z, [X|Visited], Track).
main(X, Y) :-
path(X, Y, [], Track),
print(Track),
!.
Полученные результаты:
?- main(a, e).
[a, b, d, e]
true
?- main(c, c).
[]
true
?- main(b, w).
false
Мои вопросы:
Список посещенных узлов передается предикатам двумя разными способами. В связанной переменной Visited и в несвязанной переменной Track. Как называются эти 2 разные формы передачи параметров?
Обычно я хотел использовать только несвязанную передачу параметров (переменную Track), чтобы результаты попадали в область действия основного предиката. Но мне также пришлось добавить переменную Visited, потому что проверка элементов не работала с переменной Track (я не знаю почему). Можно ли сделать так, чтобы он работал только при прохождении трека без ограничений? (без переменной Visited)
Большое спасибо!
edge(a, b). edge(b,a).
вместо простоedge(a,b).
имеет некоторые желательные свойства. - person   schedule 11.10.2016