List 有没有办法在prolog中比较三个列表?

List 有没有办法在prolog中比较三个列表?,list,prolog,integer,comparison,List,Prolog,Integer,Comparison,我正在为一个实践作业编写一个prolog程序,其中我想编写一个名为sum(a,B,C)的谓词,其中a,B和C是整数列表,如果: 串联列表BC中的元素(即列表B和C“粘合在一起”)形成a中元素的排列;B中所有整数的和等于C中所有整数的和 如果在prolog方面有更多经验的人能给我一些关于如何完成这项工作的建议,那就太好了。我真的不知道从哪里开始。我想给出一个类似sum([1,2,3],[3,2,1],[2,3,1])的输入。prolog将返回true。然而,以sum([1,2,3],[4,5,6]

我正在为一个实践作业编写一个prolog程序,其中我想编写一个名为sum(a,B,C)的谓词,其中a,B和C是整数列表,如果:

串联列表BC中的元素(即列表B和C“粘合在一起”)形成a中元素的排列;B中所有整数的和等于C中所有整数的和

如果在prolog方面有更多经验的人能给我一些关于如何完成这项工作的建议,那就太好了。我真的不知道从哪里开始。我想给出一个类似sum([1,2,3],[3,2,1],[2,3,1])的输入。prolog将返回true。然而,以sum([1,2,3],[4,5,6],[6,3,2])为例,这将返回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/2
permutation/2
都已经存在。因此,程序已经完成,除了将自然语言规范转换为Prolog规范之外,您还不需要做任何事情


不过我应该注意到,在任何情况下,列表的排列都不会和不同的值相加。至少,在理论上不是这样,在实践中,只有当您使用浮点数时,您才会发现情况确实如此。

感谢您的解释和代码!这已经非常有用了。但是,当我在输入和上使用代码时([1,2,3],X,Y)。我希望得到的结果是:X=[1,2],Y=[3];X=[2,1],Y=[3];X=[3],Y=[1,2];X=[3],Y=[2,1]。但是我得到了结果:X=Y,Y=[1,2,3]。关于如何更改代码以获得正确的输出,有什么想法吗?我猜我需要使用append。@PervySage我可以想象如何做到这一点;这就是我给出的第一个解决方案。我无法想象如何使它适用于那个例子和你问题中的例子,因为你想要
sum([1,2,3],[3,2,1],[2,3,1])
成功,但[3,2,1,2,3,1]不是[1,2,3]的排列。