2017-09-26 3 views
1

私はいくつかのPrologコードのテストを書いて、 "Test succeeded with choicepoint"という警告を出しました。ここに私のテストの一つだ:ノンセットで範囲を指定する方法(PLユニットテストの選択肢を避けるため)

test(overlap_intervals):- 
    overlap_intervals([0, 10], [5, 15]). 

はここのコードです:

%% precondition: X1<Y1 and X2<Y2 
overlap_intervals([X1,Y1], [X2,Y2]):- 
    (X1<X2, Y1<Y2, Y1>X2); !, 
    (X1>X2, Y1>Y2, Y1<X2). 

私のような私が選択のポイントを避けるために、「nondet」test(foo, nondet) :- ....を使用することができ、他のポストから見た:

test(member, all(X == [a,b,c])) :- 
    member(X, [a,b,c]). % quoting Prolog document 

しかし、私は私の場合の間隔を扱っています。 「ノンセット」は、徹底的なリストではなく、数字の範囲になります。 (これは明らかに動作しませんが、私の目標は全体の取得を)例えば:

test(overlap_intervals, all(Y<10, Y>0)):- 
    overlap_intervals([0, 10], [Y, 15]). 

は、誰かがchoicepointsがあり、どのように私の場合には、それらを避けるために理由を説明することはできますか?

答えて

1

;!を混ぜるときに優先順位を混同してしまったため、選択肢があります。通常のように、,)は、または;)より強い結合をします。あなたの述語を書くの

より良い方法は、次のようになります。

overlap_intervals_2([X1,Y1], [X2,Y2]):- 
    ( (X1<X2, Y1<Y2, Y1>X2), 
     ! 
    ; (X1>X2, Y1>Y2, Y1<X2)). 

か(推奨):

overlap_intervals_3([X1,Y1], [X2,Y2]):- 
    (X1<X2, Y1<Y2, Y1>X2), 
    !. 
overlap_intervals_3([X1,Y1], [X2,Y2]):- 
    (X1>X2, Y1>Y2, Y1<X2). 

これらの代替定義は、それはあなたの中に置き忘れたことを強調し、カットが属するところそれをより明確にバージョン。試験:

?- overlap_intervals([0, 10], [5, 15]). 
true ; 
false. 

?- overlap_intervals_2([0, 10], [5, 15]). 
true. 

?- overlap_intervals_3([0, 10], [5, 15]). 
true. 

注これらの定義のいずれも1つの区間は別のものの中に含まれている場合をカバーしていません。私はoverlap_intervals([0, 10], [1, 9])が真でなければならないと言っていますが、述語の正確な意味はアプリケーションに依存します。

テストヘッドでallを使用している場合は、all(between(0, 10, Y))が動作するはずです(テストされていないと思います)。

+0

ありがとう、イザベル! ';'と '、'を切り替えて問題を解決しました。 'すべて((0、10、Y)の間に)'は残念ながら動作しませんが問題ではありません。 – vw511

関連する問題