Prolog,如果接受基本情况,如何添加子句

Prolog,如果接受基本情况,如何添加子句,prolog,transitive-closure,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).

我不熟悉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).
(假设您想要一般传递闭包)

使用。或者,使用
库(lambda)

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

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

你的从句中的第三个论点有些混乱。你的从句的开头都表明第三个参数是一个简单的列表。但是你可以调用
foo(Y,X,Head)
其中
Head
是一个列表元素,大概不是列表。所以这可能不是你想要的。
foo(Y,X,[Head |)]:-foo(Y,X,Head)的语义有点不清楚。谢谢,你的回答帮助我提高了对Prolog的理解
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).