【发布时间】:2015-04-01 18:54:30
【问题描述】:
我正在尝试创建一个 Prolog 谓词,在给定列表的情况下,可以看到该列表是否可以分成两个总和相同的列表。
我有一个工作列表总和谓词,所以我在我的分区谓词中使用它。我首先尝试对谓词进行编码,以查看列表的第一个元素是否等于列表其余部分的总和 ([2,1,1])。这就是我对这种情况的看法。
partitionable([X|Y]) :-
sum([X],SUM),
sum([Y],SUM2),
SUM = SUM2.
但是,我收到以下错误消息:
ERROR: is/2: Arithmetic: `[]/0' is not a function.
我想在深入研究列表其余部分的递归之前让这部分工作,尽管我对这条消息的含义感到困惑,因为我还没有写过'[]/0' function。任何帮助表示赞赏。
【问题讨论】:
-
我意识到我将 X 和 Y 作为列表传递到 sum 谓词中,而它们本应作为自己传递,所以我不再收到错误消息。但是,即使我传入 partitionable([2,1,1]),谓词仍然返回 false - 这应该返回 true。这可能是因为我的求和谓词吗?
-
请edit 您的问题,而不是在 cmets 中详细说明,否则会变得相当混乱。
X是单个元素,列表的头部[X|Y],Y是列表的尾部(另一个列表)。所以[Y]是一个元素的列表,它本身就是一个列表。这可能不是你想要的。您还需要明确元素的顺序是否重要。例如,它是否应该在列表中成功,[1,2,1]? -
列表的顺序确实很重要,因此在列表中满足求和约束的任何位置只能创建一个分区(因此 [1,2,1] 不起作用)。
标签: list prolog sum subset-sum