List 如何使用append/3在prolog中递归地构建列表?

List 如何使用append/3在prolog中递归地构建列表?,list,recursion,prolog,tuples,List,Recursion,Prolog,Tuples,我需要了解一些事实的价值。那部分似乎起作用了 fact1(A, _, Val1, _, _), fact2(_, B, Val2, _, _), A = B, 但是,当我尝试使用append/3谓词将这些值[(Val1,Val2)]附加到列表(OutList)时,我只得到一个可能的解决方案,而不是一个包含所有值的列表 像这样追加:append(OutList,[(Val1,Val2)],OutList)也不起作用。我觉得我错过了一些基本的东西 这就是我的谓词到目前为止的样子 buildList

我需要了解一些事实的价值。那部分似乎起作用了

fact1(A, _, Val1, _, _),
fact2(_, B, Val2, _, _),
A = B,
但是,当我尝试使用append/3谓词将这些值
[(Val1,Val2)]
附加到列表(OutList)时,我只得到一个可能的解决方案,而不是一个包含所有值的列表

像这样追加:
append(OutList,[(Val1,Val2)],OutList)
也不起作用。我觉得我错过了一些基本的东西

这就是我的谓词到目前为止的样子

buildList(OutList):-
    fact1(A, _, Val1, _, _),
    fact2(_, B, Val2, _, _),
    A = B,
    append([], [(Val1,Val2)], OutList).
有人能指出我犯的一些错误吗。 我知道这个问题很容易找到,但我只是从Prolog/函数式编程开始


编辑:如果我有
fact1(a,b,c,d,e)。
fact2(f,a,g,h,I)
,那么我希望我的谓词将所有
fact2
第三位值和
fact1
第三位值作为一个元组,其中
a
fact1
匹配。我很难解释,抱歉。

您对使用的看法是正确的,应该坚持使用它。你的问题是你偏离了正确的道路。别担心,爱因斯坦对广义相对论也做了同样的事情,他后来意识到了自己的错误,回到了正确的道路上

第一部分是查找单个项目,第二部分是将它们收集到一个列表中

鉴于以下事实

fact1(1, _, a, _, _).
fact1(2, _, c, _, _).
fact1(3, _, d, _, _).
fact1(4, _, f, _, _).

fact2(_, 1, b, _, _).
fact2(_, 2, c, _, _).
fact2(_, 4, e, _, _).
查找各个项目:

find_item((Val1,Val2)):-
    fact1(A, _, Val1, _, _),
    fact2(_, A, Val2, _, _).
然后将它们收集到一个列表中:

findall(Item,find_item(Item),Items).
现在,为了便于使用,请将其放在谓词中:

test(Items) :-
    findall(Item,find_item(Item),Items).
运行示例:

?- test(Items).
Items = [(a, b),  (c, c),  (f, e)].


更简单的答案,请参见下文。

是不是您需要一些我尝试过findall/3的东西,但我从未让它按照我需要的方式工作。我有一个包含两种不同类型事实的知识库。我需要将一种类型的所有事实添加到一个列表中,如果它与另一组事实中的某个值相匹配。我不确定这是否有意义。非常感谢!这确实奏效了。你知道如何把它变成一个谓词吗?我已经尝试了一段时间了。我知道这可能不是最理想的方式,但会有很大帮助。不管怎样,我都非常感谢。是的,这是有道理的。我会写一个新的。