2011-08-24 5 views
6

を当てはめる番号のリストを生成する:意味でプロローグ - 私のような述語を使用したいのですが与えられた範囲

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]). 

アカウント - 再帰の深さなど)?

解決策はGNU-Prolog上で実行される予定です。

P.S.質問はthis questionに触発されました。

答えて

11

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

純粋なプロローグで書かなければならない場合(速度は、&です)、これを試すことができます。ヌー・プロローグで

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

'domain()'にも当てはまりますか? –

+0

ドメインとは何ですか?私は上記のシナリオでdom_rangeが何を期待するかは分からなかった。これは引数を範囲に渡すための単なる別の方法ですか? dom_range(Out、[Low、High]): - 範囲(Out、Low、High)です。 – DaveEdelstein

+0

[このチュートリアル](http://wazniak.mimuw.edu.pl/index.php?title=Sztuczna_inteligencja/SI_Modu%C5%82_3_-_Wnioskowanie_w_PROLOG-u)で「ドメイン」について読んだことがありますが、詳細についてわからない、私はプロローグの初心者です。 [fd_domain(+ fd_variable_list_or_fd_variable、+ integer、+ integer)]として指定された[fd_domain/3](http://www.gprolog.org/manual/gprolog.html#htoc321)のGnu-Prologマニュアルを確認しながら、 ](http://www.gprolog.org/manual/gprolog.html#htoc321) - どう思いますか?それは別の解決策かもしれませんか? –

0

rangedom_range(X,L,H) :- fd_domain(X,L,H)場合、私は知らない有限領域

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

で解決することができます。

P.S.有限のドメインで遊んでいるときは、fd_set_vector_max/1

9

と答えてください。Daveの答えはほぼ完璧です:低い数字の場合はチェックがありません。<私は条件を追加し、今は正常に動作します(それ以外の場合は、低から無限に番号が生成されます)。

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

希望に役立ちます。

関連する問題