進行分區列表分爲兩個不重疊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