Prolog,如果接受基本情况,如何添加子句
我不熟悉Prolog。我试图写一个谓词,当有一条从X到Z的路径时,它是真的,包括X到Y和Y到Z 比如说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).
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).