2009-11-03 92 views
1

我需要检查路径是否有效,是或否。它是这样给出的:Prolog Path搜索指针

?-path(a,b,[(a,c),(c,d),(d,b)]). 
true 

在列表部分,我如何访问a或c中的(a,c)?它是否就像一个字符串“(a,c)”?

一般来说,如何解决这种类型的路径查找?示例代码/伪赞赏。有没有办法让它解释列表中的元组()作为谓词?

+3

在询问之前,您可能会很方便地阅读您的老师确实提供的参考书目......您将了解更多信息! – fortran 2009-11-03 17:50:30

+1

你确实是对的。所以你不应该直接给出答案,只要指出我的方向是正确的。 – Algific 2009-11-03 17:57:17

回答

1

我给你当我是二年级的学生为例:

% 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);但它是一样的。

0

的(A,C)是一个复合词,您可以访问它的谓词是这样的:

my_predicate((A, B)) :- 
    print(A), 
    print(B). 
0

这已经有一段时间,但我的头的顶部,您可以下手:

path(S, G, [(P, Q) | R]) :- ...... 

用S表示开始,G意思是目标,P和Q是图中连接的节点,R是图的其余部分。

1

你在那里有几个问题...

是它像一个字符串 “(A,C)”?

“like”是什么意思?他们是否统一?不。

?- "(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,但您为什么要这么做?