如何生成给定长度的只有两个 1 和其他 0 的列表?

Bak*_* A. 4 list prolog clpfd

我必须生成由 2 个“1”组成的列表,其他元素为“0”。我尝试了以下代码,但它不起作用:

count([], _, 0).
count([X|T], X, Y) :- count(T, X, Z), Y is 1+Z.
count([X1|T],X,Z):- X1\=X,count(T,X,Z).

two(X) :- count(X, 1, Counter), Counter =:= 2.
Run Code Online (Sandbox Code Playgroud)

查询length(Vs, 4), Vs ins 0..1, two(Vs).没有给出任何结果。

如何正确生成此类列表?我期望得到类似 [1, 1, 0, 0], [1, 0, 1, 0] ... [0, 0, 1, 1] 的结果。

fal*_*lse 5

twoones(Bs) :-
   Bs ins 0..1,
   sum(Bs, #=, 2).

?- length(Bs,4), twoones(Bs).
   Bs = [_A,_B,_C,_D], clpz:(_A+_B+_C+_D#=2),
      clpz:(_A in 0..1), clpz:(_B in 0..1),
      clpz:(_C in 0..1), clpz:(_D in 0..1).
?- length(Bs,4), twoones(Bs), labeling([], Bs).
   Bs = [0,0,1,1]
;  Bs = [0,1,0,1]
;  Bs = [0,1,1,0]
;  ... .
Run Code Online (Sandbox Code Playgroud)

在这里,我使用的library(clpz)是 的继承者library(clpfd)。对于像这样的简单示例来说,没有太大区别。