Указатели поиска пути Пролог

Мне нужно проверить, является ли путь действительным, истинным или ложным. Это дано так:

?-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).
Другие вопросы по тегам