我需要了解一些事实价值。该部分似乎正在工作。
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
位为三元组,其中a
与fact1
相匹配。抱歉,我很难解释。
答案 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,以获得更简单的答案。