Указатели поиска пути Пролог
Мне нужно проверить, является ли путь действительным, истинным или ложным. Это дано так:
?-path(a,b,[(a,c),(c,d),(d,b)]).
true
В части списка, как я могу получить доступ к a или c в (a,c)? Это как строка "(a,c)"?
И вообще, как можно решить этот тип поиска пути? Пример кода / псевдо оценивается. Есть ли способ заставить его интерпретировать кортежи () в списке как предикаты?
4 ответа
Я приведу вам пример, когда я учился на втором курсе:
% Representation [[a,b],[b,a],[b,c]]:
%
% a <--> b -->c
%
% Does aexists a path beetween X and Y?
% Example: path(c,b,[[a,b],[b,c],[d,e],[c,d],[b,e],[e,c],[e,f],[a,a]]). No
% path(c,f,[[a,b],[b,c],[d,e],[c,d],[b,e],[e,c],[e,f],[a,a]]). Yes
path(X,Y,G):-pathAux(X,Y,G,[]).
pathAux(X,Y,G,_T):-member([X,Y],G).
pathAux(X,Y,G,T) :-member([X,Z],G),not(member([X,Z],T)),
append([[X,Z]],T,Tt),pathAux(Z,Y,G,Tt).
Я использовал [a,b] вместо (a,b); но это то же самое.
У вас есть несколько вопросов там...
Это как строка "(a,c)"?
Что вы подразумеваете под "как"? Они объединяются? Нету.
?- "(a, c)" = (a, c).
No
В части списка, как я могу получить доступ к a или c в (a,c)?
?- L = [(a, c) | _], L = [(A, C) | _].
L = [ (a, c)|_G184],
A = a,
C = c
Есть ли способ заставить его интерпретировать кортежи () в списке как предикаты?
Может быть, используя call/N
но зачем тебе это делать?
Это было какое-то время, но с моей головы ты начнешь:
path(S, G, [(P, Q) | R]) :- ......
С S означает начало, G означает цель, P и Q - это связанные узлы в вашем графе, а R - остальная часть вашего графа.
(A, c) является составным термином, доступ к нему можно получить в предикате, например:
my_predicate((A, B)) :-
print(A),
print(B).