私はPrologの世界に不慣れで、特定の範囲のすべての要素を返すルールを書きたいと思います。
私は次のようなことをするつもりです
元:
foo(X, Low, High) :- X > Low, X < High.
そして、foo(X、2、5)と入力すると、3を返し、次に4を返すはずです。
私のアプローチは間違っているようですが、どちらが正しい方法か知りたいです。
そのように書かれたとき、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).
簡単な答えbetween/3
::
?- between(3,4,X).
X = 3 ;
X = 4.
このように正確な動作を実装するのは簡単です。
アプローチが機能しない理由は、次の定義です</2
。両方の引数をインスタンス化する必要があります。したがって、使用せずに実装したい場合は、between/3
svickの提案のようなことを行う必要があります。
SWI-Prologとを使用してlibrary(clpfd)
、あなたは書くことができます
:- use_module(library(clpfd)).
foo(X,Low,High) :-
X #> Low,
X #< High,
label([X]).
これを行うこともできます(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 ) .