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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用append / 3以递归方式在prolog中构建列表?相关的知识,希望对你有一定的参考价值。

我需要得到一些事实的价值观。那部分似乎有效。

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匹配。对不起,我有点难以解释。

答案

你是正确的看看使用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以获得更简单的答案。

以上是关于如何使用append / 3以递归方式在prolog中构建列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何以递归方式思考?

LOG4J2 - 如何以编程方式创建File appender?

如何使用LXML以递归方式查找XML标记?

如何停止递归复合组件以递归方式包含自身

如何在严格评估的语言中实现保护递归?

007---归并排序