4

私はPrologの世界に不慣れで、特定の範囲のすべての要素を返すルールを書きたいと思います。

私は次のようなことをするつもりです

元:

foo(X, Low, High) :- X > Low, X < High.

そして、foo(X、2、5)と入力すると、3を返し、次に4を返すはずです。

私のアプローチは間違っているようですが、どちらが正しい方法か知りたいです。

4

4 に答える 4

7

そのように書かれたとき、Prologはあなたがどんな種類の数字が欲しいか(そしてあなたが数字さえ欲しいかどうか)を知りません。

これを実装する1つの方法は次のとおりです。

range(X, L, H) :- X is L + 1, X < H.
range(X, L, H) :- L1 is L + 1, L1 < H, range(X, L1, H).
于 2011-10-09T21:10:08.050 に答える
6

簡単な答えbetween/3::

?- between(3,4,X).
X = 3 ;
X = 4.

このように正確な動作を実装するのは簡単です。

アプローチが機能しない理由は、次の定義です</2。両方の引数をインスタンス化する必要があります。したがって、使用せずに実装したい場合は、between/3svickの提案のようなことを行う必要があります。

于 2011-10-09T21:22:37.550 に答える
2

SWI-Prologとを使用してlibrary(clpfd)、あなたは書くことができます

:- use_module(library(clpfd)).

foo(X,Low,High) :-
    X #> Low,
    X #< High,
    label([X]).
于 2011-10-10T06:50:49.283 に答える
1

これを行うこともできます(3の間のほぼ再実装:

range( X , Y , Z ) :-
  integer(X) ,
  integer(Y) ,
  range1(X,Y,Z)
  .

range1( X , X , X ) .              % X equals Y
range1( X , Y , X ) :- X < Y .
range1( X , Y , Z ) :- X < Y , X1 is X+1 , range( X1 , Y , Z ) .
range1( X , Y , X ) :- X > Y .
range1( X , Y , Z ) :- X > Y , X1 is X-1 , range( X1 , Y , Z ) .
于 2011-10-10T22:28:44.063 に答える