2

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

1 回答 1

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).
于 2018-01-03T12:59:21.217 回答