我是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).
答案 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).