11

次のような述語を使用したいと思います。

range(X,0,5)
range(X,4,200)
range(X,-1000000,1000000)
dom_range(X,-1000000,1000000)

意味:

range(X,0,5) :- member(X,[0,1,2,3,4,5]).
range(X,4,200) :- member(X,[4,5,6...198,199,200]).
range(X,-1000000,1000000) :- member(X,[-1000000,...,1000000]).
dom_range(X,-1000000,1000000) :- domain(X, [-1000000,...,1000000]).

Prolog で適切にコーディングする方法 (ソリューションのパフォーマンスを考慮して - 再帰の深さなど) ?

ソリューションは GNU-Prolog で実行される予定です。

PSこの質問に触発された質問

4

3 に答える 3

14

SWI-Prolog には、述語between/3があります。上記の結果を得るには、 between(0,5,X) のように呼び出します。ただし、この述語は C で実装されているように見えます。

純粋なプロローグでそれを書かなければならない場合 (そして速度とスペースは要因ではありません)、次のことを試すことができます。

range(Low, Low, High).
range(Out,Low,High) :- NewLow is Low+1, range(Out, NewLow, High).
于 2011-08-24T13:00:29.010 に答える
12

Dave の答えはほぼ完璧です。低い < 高いかどうかを確認するチェックはありません。条件を追加したところ、正常に動作するようになりました (それ以外の場合は、低い値から無限大までの数値が生成されます)。

range(Low, Low, High).
range(Out,Low,High) :- NewLow is Low+1, NewLow =< High, range(Out, NewLow, High).

それが役立つことを願っています!

于 2011-12-22T18:42:08.050 に答える
1

rangeGnu-Prolog では、有限ドメインで解決できます

range(X,Low,High) :- fd_domain(X,Low,High).

かどうかはわかりませんdom_range(X,L,H) :- fd_domain(X,L,H)

PS 有限ドメインで遊ぶときは、 fd_set_vector_max/1を使用したいかもしれません

于 2011-08-27T09:49:45.917 に答える