List 可传递对的Prolog列表

List 可传递对的Prolog列表,list,prolog,List,Prolog,我已经尝试解决以下问题一段时间了,但似乎找不到正确的解决方案 假设有一个函数测试(X,Y,Z),X是一对数字,Y是对的列表,Z是可传递对的结果列表 例如: test((1,5), [(7,3),(5,2),(5,9)], Z). Z = [(1,2),(1,9)] (由于及物性1->5->2和1->5->9) 到目前为止,我已经成功地创建了以下代码: test(_,[],_):- false. test((X1,C),[(C,Y2)|_],(X1,Y2)). test((X1,X2),[_|

我已经尝试解决以下问题一段时间了,但似乎找不到正确的解决方案

假设有一个函数测试(X,Y,Z),X是一对数字,Y是对的列表,Z是可传递对的结果列表

例如:

test((1,5), [(7,3),(5,2),(5,9)], Z).

Z = [(1,2),(1,9)]
(由于及物性1->5->2和1->5->9)

到目前为止,我已经成功地创建了以下代码:

test(_,[],_):- false.
test((X1,C),[(C,Y2)|_],(X1,Y2)).
test((X1,X2),[_|YT],Result) :- test((X1,X2),YT,Result).
它返回每个单独的结果对,如下所示:

Z = (1, 2) ;
Z = (1, 9) ;
但我似乎无法将它们全部返回到一个列表中,如上例所示:

Z = [(1,2),(1,9)]

任何帮助都将不胜感激。

我认为问题在于您没有建立传递对列表。您只是返回一对作为
test/3
的第三个参数

这里有一个可能的解决方案:

我做了一个谓词来处理比较对和描述它们的传递婚姻,这样我就不必在后续规则中处理这些元组:

transit((X,T), (T,Y), (X,Y)).
然后就是使用递归谓词进行标准列表处理的问题:

t(_, [], []).
t(X, [T|ToTransit], [Y|Transited]) :-
    transit(X,T,Y),
    t(X,ToTransit,Transited).
t(X, [T|ToTransit], Transited) :-
    \+ transit(X,T,_),
    t(X,ToTransit, Transited).
当然,一旦您有了一个定义关系的谓词,比如
transit/3
,您还可以执行以下操作

findall( TP,
         ( member(T, [(2,2), (2,5), (1,5)]), transit((1,2), T, TP) ),
         Tps). 

我将把
t(X[t],[Y]):-…
替换为
t(u,[],[])。
:)我将进行更改。我认为后一种模式通常是首选的——这仅仅是因为它消除了在地面定义中添加子句的需要吗?这里它涵盖了“空”情况,否则就没有涵盖。