在这个答案中,我们使用clpfd 和一点lambda:
:- use_module([library(clpfd),
library(lambda)]).
基于meta-predicate maplist/4 和我们定义的约束(ins)/2 和sum/3:
zs_selection_len_sum(Zs, Bs, L, S) :-
same_length(Zs, Bs),
Bs ins 0..1,
maplist(\Z^B^X^(X #= Z*B), Zs, Bs, Xs),
sum(Bs, #=, L),
sum(Xs, #=, S).
使用labeling/2 和选项max/1 的示例查询:
?- zs_selection_len_sum([1,1,4,4,6],Bs,L,8), labeling([max(L)],Bs)。
Bs = [1,1,0,0,1],
L = 3
; Bs = [0,0,1,1,0],L = 2
;错误的。
?- zs_selection_len_sum([1,1,3,4,5],Bs,L,7), labeling([max(L)],Bs)。
Bs = [1,1,0,0,1],
L = 3
; Bs = [0,0,1,1,0],L = 2
;错误的。
?- zs_selection_len_sum([1,1,2,2,3,2,4,5,6],Bs,L,6),标签([max(L)],Bs)。
Bs = [1,1,0,1,0,1,0,0,0],
L = 4
; Bs = [1,1,1,0,0,1,0,0,0],
L = 4
; Bs = [1,1,1,1,0,0,0,0,0],
L = 4
; Bs = [0,0,1,1,0,1,0,0,0],L = 3
; Bs = [0,1,0,0,1,1,0,0,0],L = 3
; Bs = [0,1,0,1,1,0,0,0,0],L = 3
; Bs = [0,1,1,0,1,0,0,0,0],L = 3
; Bs = [1,0,0,0,1,1,0,0,0],L = 3
; Bs = [1,0,0,1,1,0,0,0,0],L = 3
; Bs = [1,0,1,0,1,0,0,0,0],L = 3
; Bs = [1,1,0,0,0,0,1,0,0],L = 3
; Bs = [0,0,0,0,0,1,1,0,0],L = 2
; Bs = [0,0,0,1,0,0,1,0,0],L = 2
; Bs = [0,0,1,0,0,0,1,0,0],L = 2
; Bs = [0,1,0,0,0,0,0,1,0],L = 2
; Bs = [1,0,0,0,0,0,0,1,0],L = 2
; Bs = [0,0,0,0,0,0,0,0,1],L = 1
;错误的。