Prolog有没有办法限制列表中的元素是否在范围内?

Liu*_*han 2 prolog clpfd

有没有办法约束列表中的元素是否在范围内,例如1-6而不是使用between(1,6,X)

Wil*_*sem 6

clpfd库有一个ins/2谓词,您可以在其中指定变量列表 - 元素的范围.

喜欢:

all_between(Low, High, Vars) :-
    Vars ins Low..High.
Run Code Online (Sandbox Code Playgroud)

打电话时all_between(1,6,[X1,X2,X3]).我们得到:

X1 in 1..6,
X2 in 1..6,
X3 in 1..6.
Run Code Online (Sandbox Code Playgroud)

如果我们想要枚举元素,我们也可以使用label(L).它来分配值:

all_between_enumerate(Low, High, Vars) :-
    Vars ins Low..High,
    label(Vars).
Run Code Online (Sandbox Code Playgroud)

为此all_between_enumerate(1,2,[X1,X2,X3]).生成:

?- all_between_enumerate(1,2,[X1,X2,X3]).
X1 = X2, X2 = X3, X3 = 1 ;
X1 = X2, X2 = 1,
X3 = 2 ;
X1 = X3, X3 = 1,
X2 = 2 ;
X1 = 1,
X2 = X3, X3 = 2 ;
X1 = 2,
X2 = X3, X3 = 1 ;
X1 = X3, X3 = 2,
X2 = 1 ;
X1 = X2, X2 = 2,
X3 = 1 ;
X1 = X2, X2 = X3, X3 = 2.
Run Code Online (Sandbox Code Playgroud)

如果您已经为变量添加了约束,例如X1 #< X3,这些也被考虑在内:

?- X1 #< X3, all_between_enumerate(1,2,[X1,X2,X3]).
X1 = X2, X2 = 1,
X3 = 2 ;
X1 = 1,
X3 = X2, X2 = 2.
Run Code Online (Sandbox Code Playgroud)