【问题标题】:Is there a way to compare three lists in prolog?有没有办法比较序言中的三个列表?
【发布时间】:2019-11-22 10:37:16
【问题描述】:

我正在为练习作业编写一个 prolog 程序,我想在其中编写一个谓词 sum(A,B,C),其中 A、B 和 C 是整数列表,如果满足以下条件,prolog 将返回 true:

连接列表 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 没有不同list1的个数的排序(permutation),list 3中的整数之和不等于list 2中的整数之和。

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

【问题讨论】:

    标签: list prolog integer comparison


    【解决方案1】:

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

    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 规范外,您还不需要做任何事情!

    我应该注意到,列表的排列不会产生不同的值。至少,理论上不是,在实践中,只有当你使用浮点数时,你才会发现这种情况。

    【讨论】:

    • 感谢您的解释和代码!这已经非常有用了。但是,当我在输入总和([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] 的排列。
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多