我需要从可能如下所示的知识库中创建一个列表:
fact1(3,3).
fact1(2,3).
fact1(3,5).
fact1(2,2).
fact1(2,10).
fact1(3,1).
fact1(1,1).
fact1(1,6).
fact2(3,a,b)
fact2(2,c,d)
fact2(1,e,f)
该列表需要包含元组,每个元组都包含 fact2 的第二个和第三个值,以及 fact2 的添加数,只要 fact1 和 fact2 的第一个值匹配。
当我展示我到目前为止所拥有的东西时,也许它会变得更清楚。这是我使用 findall 语句的谓词,对我来说,这似乎让我最接近我需要得到的地方:
collect_items(List):-
findall((Out1,Out2,Nr),
(fact2(Val1,Out1,Out2),
fact1(Val1,Nr)),
List).
我从中收到的列表如下所示:
List = [(a,b,3),(a,b,5),(a,b,1),(c,d,3),(c,d,2),(c,d,10),(e,f,1),(e,f,6)]
但实际上我需要列表看起来像这样:
List = [(a,b,9),(c,d,15),(e,f,7)]
这意味着,每当元组的前两个元素匹配时,作为元组的第三个元素的数字应该加在一起。
但是,我什至不知道如何处理这样的事情,正如我一直读到的那样,一旦设置了列表,就无法更改它,因为 prolog 是功能性的和声明性的。
所以我认为我需要以某种方式将每个元素与它之前或之后的元素进行匹配(因为列表将始终由 Out1 和 Out2 变量排序),如果它们匹配,则将元组中的第三个值加在一起。问题是,我不知道怎么做。
对我来说,这似乎无法在 findall 本身内完成,但需要在 findall 之后完成。我是一个真正的初学者,希望能提供任何帮助。在这种情况下,如果解决方案都在一个谓词中,那将是最好的。