如何写好谓词(不在之间)

时间:2011-04-14 12:22:50

标签: prolog clpfd

我写下代码

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]}

效果很好,但我觉得效率不高

非常感谢:)

1 个答案:

答案 0 :(得分:2)

您可以将X的域限制在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/3替换为not_between/3。此定义可确保X无法准确显示LowerUpper值;如果您希望将它们包含在#<的域中,则可以使用范围约束#>X

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

:- use_module(library(clpfd)).