我需要检查路径是否有效、真或假。它是这样给出的:
?-path(a,b,[(a,c),(c,d),(d,b)]).
true
在列表部分,如何访问 (a,c) 中的 a 或 c?它像字符串“(a,c)”吗?
一般来说,如何解决这种类型的寻路问题?示例代码/伪表示赞赏。有没有办法让它将列表中的元组 () 解释为谓词?
我需要检查路径是否有效、真或假。它是这样给出的:
?-path(a,b,[(a,c),(c,d),(d,b)]).
true
在列表部分,如何访问 (a,c) 中的 a 或 c?它像字符串“(a,c)”吗?
一般来说,如何解决这种类型的寻路问题?示例代码/伪表示赞赏。有没有办法让它将列表中的元组 () 解释为谓词?
你有几个问题在那里......
它像字符串“(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
,但你为什么要这样做?
举一个我二年级时的例子:
% 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) 是一个复合词,您可以像这样在谓词中访问它:
my_predicate((A, B)) :-
print(A),
print(B).
已经有一段时间了,但我想你会开始:
path(S, G, [(P, Q) | R]) :- ......
S 表示开始,G 表示目标,P 和 Q 是图中的连接节点,R 是图中的其余部分。