有没有办法比较序言中的三个列表?
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/2
和 permutation/2
都已经存在。所以程序已经完成,除了将您的自然语言规范转换为 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/2
和 permutation/2
都已经存在。所以程序已经完成,除了将您的自然语言规范转换为 Prolog 规范之外,您还不需要做任何事情!
我应该指出,在任何情况下,列表的排列总和都不会有不同的值。至少,理论上不是,实际上,只有当你使用浮点数时,你才会发现是这样。