如何使用 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)].

有关更简单的答案,请参阅后续问题。

最新更新