有没有办法比较序言中的三个列表?

Is there a way to compare three lists in prolog?

我正在为练习作业编写序言程序,我想编写一个名为 sum(A,B,C) 的谓词,其中 A、B 和 C 是整数列表,序言将 return如果:

则为真

连接列表 BC 中的元素(即列表 B 和 C 被“粘合在一起”)形成 A 中元素的排列;并且 B 中所有整数的总和等于 C 中所有整数的总和。

如果任何在 prolog 方面有更多经验的人可以就如何完成这项工作给我一些建议,那就太好了。我真的不知道从哪里开始。我想给出一个像 sum([1,2,3],[3,2,1],[2,3,1]) 这样的输入。 prolog 会 return 为真。但是,例如,sum([1,2,3],[4,5,6],[6,3,2]),这将 return false 因为在这个例子中列出了 2 和 3不是列表 1 中数字的不同排序(排列),列表 3 中整数的总和不等于列表 2 中整数的总和。

对代码有什么想法或建议吗?

我觉得你想多了。 :) 直接将你的规范转化为代码,然后计算细节:

sum(A, B, C) :- 
    append(B, C, BC),
    permutation(A, BC), 
    sumlist(B, Sum),
    sumlist(C, Sum).

这已经揭示了您的规范中的歧义:您仔细解释了 B 和 C 必须连接起来以形成 A 的排列,但您的示例并非如此 sum([1,2,3], [3,2,1], [2,3,1])。如果您的代码比您的话更接近事实,您的说明应该改为:

sum(A, B, C) :- 
    permutation(A, B), 
    permutation(A, C),
    sumlist(B, Sum),
    sumlist(C, Sum).

现在您很幸运,因为 sumlist/2permutation/2 都已经存在。所以程序已经完成,除了将您的自然语言规范转换为 Prolog 规范之外,您还不需要做任何事情!

我应该指出,在任何情况下,列表的排列总和都不会有不同的值。至少,理论上不是,实际上,只有当你使用浮点数时,你才会发现是这样。