0

我写代码如下

testb :-
    X::1..10,
    V1 = 3,
    V2 = 6,
    testbb(X,V1,V2),
    writeln(X).

testbb(X,V1,V2) :-
    (
      count(I,V1,V2),param(X,V1,V2) do 
      X#\=I 
    ).


?- testb.
Yes (0.00s cpu)
_385{[1, 2, 7 .. 10]}

它运作良好,但我认为它效率不高

非常感谢 :)

4

1 回答 1

2

您可以通过以下方式将域限制在toX范围之外: V1V2

not_between(X, Lower, Upper) :-
     % it is not the case that X is both greater and 
     % equal to Lower, and less than or equal to Upper: 
    #\ ((X #>= Lower) #/\ (X #=< Upper)).

将您的替换testbb/3not_between/3. 该定义确保X不能取值准确LowerUpper您可以使用范围约束#<#>如果您希望它们包含在X.

这是经过测试并与 SWI-Prolog 一起使用的。要在 SWI-Prolog 文件中使用 CLP(FD),请确保在指令中导入源文件顶部的 CLP(FD) 库,如下所示:

:- use_module(library(clpfd)).
于 2011-04-15T03:52:50.343 回答