2011-08-24 73 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]). 

如何Prolog的代碼它很好地(考慮解決方案的性能成賬戶 - 遞歸深度等)?

解決方案預計在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)上閱讀過有關「域名」的內容,但我是不確定細節,因爲我是Prolog初學者。在檢查Gnu-Prolog手冊時,我發現[fd_domain/3](http://www.gprolog.org/manual/gprolog.html#htoc321),指定爲[fd_domain(+ fd_variable_list_or_fd_variable,+ integer,+ integer) ](http://www.gprolog.org/manual/gprolog.html#htoc321) - 你覺得如何?可能是另一種解決方案? –

0

在GNU的序言range可以用有限域

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

來解決,我不知道是否dom_range(X,L,H) :- fd_domain(X,L,H)

P.S.當有限域玩,你可能會想用fd_set_vector_max/1

9

戴夫的回答幾乎是完美的:沒有檢查,看看是否低<高。我添加了一個條件,現在它工作正常(否則它會生成數字從低到無窮):

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

希望幫助!