我正在写一个练习练习的序言程序,我想写一个称为sum(A,B,C)的谓词,其中A,B和C是整数列表,并且在以下情况下,序言将返回true:
级联列表BC中的元素(即列表B和C被“粘合在一起”)形成A中元素的排列; B中所有整数之和等于C中所有整数之和。
如果在序言方面有更多经验的人可以给我一些有关如何完成此操作的建议,那将很好。我真的不知道从哪里开始。我想给出一个像sum([1,2,3],[3,2,1],[2,3,1])的输入。并且序言将返回true。但是,以sum([1,2,3],[4,5,6],[6,3,2])为例,这将返回false,因为在此示例中列表2和3并不相同对list1的数字进行排序(排列),并且list 3中的整数之和不等于list 2中的整数之和。
对代码有任何想法或建议吗?
答案 0 :(得分:0)
我认为您想得太多了。 :)直接将您的规范转换为代码,然后制定详细信息:
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规范外,您无需执行任何其他操作!
我应该注意,但是在任何情况下,列表的排列总和都不相同。至少在理论上和实践上都没有,只有在使用浮点数时,您才会发现情况确实如此。