3

如何确保序言列表的所有元素都是 0 或 1?

我需要生成一个给定长度的列表,并确保其中只有这两个数字:
例如 [0,0,0,0,0,0], [1,0,0,1,0,1,1 ] ETC

我想需要使用像ICFD这样的库,但我不太清楚如何使用每个方法中的方法来处理这个问题。

4

3 回答 3

5

假设 A 是一个列表。只是说 A ins 0..1 例子

 ?- [library(clpfd)].
 true.

 ?- length(A, 10),A ins 0..1.
 A = [_3820,_3826,_3832,_3838,_3844,_3850,_3856,_3862,_3868,_3874],
 _3820 in 0..1,
 _3826 in 0..1,
 _3832 in 0..1,
 _3838 in 0..1,
 _3844 in 0..1,
 _3850 in 0..1,
 _3856 in 0..1,
 _3862 in 0..1,
 _3868 in 0..1,
 _3874 in 0..1.
于 2017-05-08T15:24:13.523 回答
2

具体来说,对于ECLiPSe

?- lib(ic).
Yes (0.14s cpu)

?- length(Xs, 5), Xs :: 0 .. 1.
Xs = [_415{[0, 1]}, _429{[0, 1]}, _443{[0, 1]}, _457{[0, 1]}, _471{[0, 1]}]
Yes (0.00s cpu)

任何将列表元素实例化为 0 或 1 以外的值的尝试都将导致失败。

于 2017-05-09T22:28:06.733 回答
1

在基本的 Prolog 中很容易,假设有一个空列表是可以的:

allowed(0).
allowed(1).
zero_one(L) :- maplist(allowed,L).

?- length(L,10), zero_one(L).

也就是说,maplist/2 要求它的第一个参数 - 谓词 - 对于每个列表元素都为真。

没有 maplist,只限制为 0 或 1:

zero_one([]).
zero_one([0|T]) :- zero_one(T).
zero_one([1|T]) :- zero_one(T).

另一种选择,使用 library(yall) 和 maplist/2:

zero_one(L) :- maplist([X]>>(X=0;X=1), L).
于 2017-05-09T10:16:21.637 回答