Prolog路径搜索指针

时间:2009-11-03 17:40:43

标签: prolog

我需要检查路径是否有效,是真还是假。它是这样给出的:

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

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

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

4 个答案:

答案 0 :(得分:1)

你有几个问题......

  

它是否像字符串“(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,但为什么要这样做呢?

答案 1 :(得分: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);但它是一样的。

答案 2 :(得分:0)

(a,c)是一个复合词,你可以在这样的谓语中访问它:

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

答案 3 :(得分:0)

已经有一段时间了,但是我会从头开始:

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

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