2011-12-02 63 views
2

我是一個完整的初學者,我想知道如何使用ground/1如何使用地面/ 1?

目前,我有這樣的代碼:

intertwine([], [], []). 
intertwine([E|Es], Fs, [E|Gs]) :- intertwine(Es, Fs, Gs). 
intertwine(Es, [F|Fs], [F|Gs]) :- intertwine(Es, Fs, Gs). 

但是當我嘗試在外殼調用這個:

intertwine([1,2],X,[1,a,2,b]). 

我得到正確的答案X=[a,b],但查詢不最終,好像它認爲還有另一個答案。所以,我按「;」我得到「假」作爲輸出。我在另一個問題的答案中讀到,我應該使用ground/1來檢查第三個列表是否已經完全實例化以處理該案例。

事情是,作爲一個完整的初學者,我不知道該怎麼做。那麼是否有足夠的人向我解釋工作原理以及如何使用它來檢查特定參數的實例化,以及如何使用代碼檢查不存在的答案?

回答

2

這種行爲完全沒問題。有時候,Prolog能夠發現沒有進一步的解決方案,有時候沒有。細節對所描述的內容沒有影響。試想一下:

?- X = 1 ; 2 = 3. 
X = 1 ; 
false. 

這裏,很明顯告訴我們,2 = 3不是解決辦法,還是序言要求我們繼續。

順便說一句,而不是;您也可以按SPACE獲取下一個解決方案。

0

就像虛假說的那樣,這種行爲確實沒問題。謂詞與實際的問題無關。

沒有代碼檢查不存在的答案嗎?

Cut可以在這裏幫助,如果我得到您的問題的權利。

intertwine([], [], []). 
intertwine([E|Es], Fs, [E|Gs]) :- intertwine(Es, Fs, Gs), !. 
intertwine(Es, [F|Fs], [F|Gs]) :- intertwine(Es, Fs, Gs), !. 

所以,你有你的唯一的答案。

?- intertwine([1,2],X,[1,a,2,b]). 
X = [a, b]. 

?- 
+0

@Dimitri:intertwine(Xs,Ys,[1])。應該有兩個解決方案,而不是一個。有一個簡單的經驗法則:沒有任何模式相關的測試單獨切割幾乎總是削減有效的解決方案。 – false

+0

是的。其實我並沒有完全明白OP的真正需要。 –

0

相反的ground/1,檢查參數的instatiation你應該考慮使用var/1(或相關nonvar/1)。 var/1它是基本的metapredicate,它將Prolog的功能擴展到已知的純粹的語言的子集。它允許推理程序本身,根據變量等基本實體的「狀態」選擇適當的行爲。

一個非常簡單的使用這些metapredicate的,從實際編程POV,允許實施默認具體參數值:例如

%% gunzip(+Gz, ?Ex) is det. 
% 
% uncompress the file Gz in Ex 
% if Ex is var strip .gz extension 
% 
gunzip(Gz, Ex) :- 
    ( nonvar(Ex) 
    -> true 
    ; atom_codes(Gz, Cs), 
     phrase(string(ExCs), Cs, ".gz"), 
     atom_codes(Ex, ExCs) 
    ), 
    gzopen(Gz, read, I, [type(binary)]), 
    setup_call_cleanup(open(Ex, write, O, [type(binary)]), 
       copy_stream_data(I, O), 
       (close(I), close(O)) 
      ). 

如果我們調用gunzip解(「file.gz」 ,F),F得到實例化(希望)與充氣數據的名稱。

相關問題