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

时间:2019-04-10 11:23:03

标签: list recursion prolog tuples

我需要了解一些事实价值。该部分似乎正在工作。

fact1(A, _, Val1, _, _),
fact2(_, B, Val2, _, _),
A = B,

但是,一旦我尝试使用append / 3谓词将这些值[(Val1,Val2)]附加到List(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位为三元组,其中afact1相匹配。抱歉,我很难解释。

1 个答案:

答案 0 :(得分:2)

您正确地考虑使用findall/3,应该坚持使用它。您的问题是您走了正确的道路。别担心,爱因斯坦在广义相对论中也是如此,他后来意识到自己的错误,回到了正确的道路。

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

鉴于以下事实

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)].

请参见后续question,以获得更简单的答案。