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

次のようにして、 のドメインをXの範囲外にV1限定することができますV2

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が取ることができず、Lower正確Upperな値が得られないことが保証されます。のドメインに含めたい場合は、代わりに#<範囲制約を使用できます。#>X

これはテスト済みで、SWI-Prolog で動作します。SWI-Prolog ファイルで CLP(FD) を使用するには、次のように、ディレクティブでソース ファイルの先頭にある CLP(FD) ライブラリを必ずインポートしてください。

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