如何为Prolog指定列表的所有元素都必须是1或0?
问题描述:
如何确保序言列表中的所有元素都是0或1?如何为Prolog指定列表的所有元素都必须是1或0?
我需要生成一个给定长度的列表,并确保它只有这两个数字:
E.g. [0,0,0,0,0,0],[1,0,0,1,0,1,1]等
答
假设A是一个列表。 只是说,一个插件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.
答
在基本的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).
另一种替代方法,使用库(亚勒)和MAPLIST/2:
zero_one(L) :- maplist([X]>>(X=0;X=1), L).
谢谢。而且,代替'ins',我们可以使用::/2吗? – Zap
我不知道::/2 – joel76
@ joel76:宁可说'use_module(library(clpfd))' – false