进行分区列表分为两个不重叠subsequences, 我们使用list_subseq_subseq/3
:
list_subseq_subseq([] ,[] ,[]).
list_subseq_subseq([X|Xs],[X|Ys],Zs) :-
list_subseq_subseq(Xs,Ys,Zs).
list_subseq_subseq([X|Xs],Ys,[X|Zs]) :-
list_subseq_subseq(Xs,Ys,Zs).
对于执行整数算术,我们使用clpfd:
:- use_module(library(clpfd)).
让我们把它放在一起!在下面的示例查询我们分区列表[1,2,3,4,5,6,7]
:
?- Xs = [1,2,3,4,5,6,7],
sum(Xs,#=,Total),
Half*2 #= Total,
list_subseq_subseq(Xs,Ys,Zs),
sum(Ys,#=,Half),
sum(Zs,#=,Half).
Xs = [1,2,3,4,5,6,7], Total = 28, Half = 14, Ys = [1,2,4,7], Zs = [3,5,6]
; Xs = [1,2,3,4,5,6,7], Total = 28, Half = 14, Ys = [1,2,5,6], Zs = [3,4,7]
; Xs = [1,2,3,4,5,6,7], Total = 28, Half = 14, Ys = [1,3,4,6], Zs = [2,5,7]
; Xs = [1,2,3,4,5,6,7], Total = 28, Half = 14, Ys = [1,6,7] , Zs = [2,3,4,5]
; Xs = [1,2,3,4,5,6,7], Total = 28, Half = 14, Ys = [2,3,4,5], Zs = [1,6,7]
; Xs = [1,2,3,4,5,6,7], Total = 28, Half = 14, Ys = [2,5,7] , Zs = [1,3,4,6]
; Xs = [1,2,3,4,5,6,7], Total = 28, Half = 14, Ys = [3,4,7] , Zs = [1,2,5,6]
; Xs = [1,2,3,4,5,6,7], Total = 28, Half = 14, Ys = [3,5,6] , Zs = [1,2,4,7]
; false.
,我意识到,我通过X和Y进入和谓语列表,当他们应该只是作为自己传递,所以我不再收到错误消息。然而,即使我通过partitionable([2,1,1]),谓词仍然返回false - 这应该返回true。这可能是因为我的总和谓词吗? – 2015-04-01 19:13:01
请[edit](http://stackoverflow.com/posts/29398593/edit)你的问题,而不是在评论中详细说明,否则会变得相当混乱。 'X'是单个元素,列表的头部是[X | Y]',而'Y'是列表的尾部(另一个列表)。所以'[Y]'是一个元素的列表,它本身就是一个单独的列表。这可能不是你想要的。您还需要明确说明元素的排序是否重要。例如,它应该如何在列表中成功,'[1,2,1]'? – lurker 2015-04-01 20:53:08
列表的排序很重要,因此只有一个分区可以在满足总和约束的列表中的任何地方生成(所以[1,2,1]将不起作用)。 – 2015-04-01 21:58:01