2017-05-08 56 views

回答

5

假设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. 
+0

谢谢。而且,代替'ins',我们可以使用::/2吗? – Zap

+0

我不知道::/2 – joel76

+0

@ joel76:宁可说'use_module(library(clpfd))' – false

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). 
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以外的内容将会导致失败。

+0

这是完美的工作,谢谢! – Zap

相关问题