Prolog,如果接受基本案例,如何添加一个子句

时间:2018-01-03 12:16:13

标签: prolog transitive-closure

我是Prolog的新手。我正在尝试编写一个谓词,当存在从X到Z的路径时,该谓词为真,包括X到Y和Y到Z.

例如

    foo(b,Y,[[a,b],[b,c],[b,d],[d,e]]).
    Y = c ;
    Y = d ;
    Y = e ;

我可以编写代码,当存在从X到Y的路径时该代码是真的,但是如果基本情况为真,则无法弄清楚如何添加从Y到Z的代码。

    foo(Y, X, [Y, X]).
    foo(Y, X, [Head|_]) :- foo(Y, X, Head).
    foo(Y, X, [_|Tail]) :- foo(Y, X, Tail).

1 个答案:

答案 0 :(得分:2)

(假设你想要一般的传递闭包)

conn(XYss, X, Y) :-
   member([X,Y], XYss).

foo2(X, Y, XYss) :-
   closure(conn(XYss), X, Y).

使用closure/3。或者,使用library(lambda)

foo2(X, Y, XYss) :-
   closure({XYss}+\Xi^Yi^member([Xi,Yi], XYss), X, Y). 

从字面上理解你的问题,你只需要:

foo3(X, Y, XYss) :-
   member([X,Y], XYss).
foo3(X, Z, XYss) :-
   member([X,Y], XYss),
   member([Y,Z], XYss).