2017-01-09 47 views
0

我把這部分代碼作爲遞歸謂詞中的基本情況。爲什麼prolog不能識別查詢中的參數?

riduci_lista_valori([[V, N]],m_var,Lr):- 
    member(V, m_var), 
    Lr =[N]. 

的問題是,當我執行我的查詢並不統一,其參數謂詞的正確的論點。

鑑於代碼,我的查詢是:riduci_lista_valori([[a, 5]], [c,e], F). 而且我希望Prolog返回F = [5]。 調試代碼似乎不能正確識別參數,因爲它不像統一一樣:V = a,N = 5m_var = [c,e]但它給出: 1 = [[a, 5]]2 = [c, e]

鑑於如果我提示:[[V, N]] = [[a,5]].它使正確的統一: V = a,N = 5

我在做什麼錯?謝謝!

回答

4

爲了檢測故障的原因在序言中,使用聲明調試

以下定義添加到您的程序:

:- op(920,fy, *). 
*_. 

現在,你可以使用(*)/1概括客場具體目標。

例如:

 
riduci_lista_valori([[V, N]], m_var, Lr) :- 
     *member(V, m_var), 
     *Lr =[N]. 

即使有這麼多的更一般的版本,我們得到:

 
?- riduci_lista_valori([[a, 5]], [c,e], F). 
false. 

這意味着,如果你希望查詢到在所有成功,你需要進一步概括你的程序。見依然是程序的究竟是什麼:

 
riduci_lista_valori([[V, N]], m_var, Lr) :- true. 

這個片段已經太具體。讓我們來概括它是這樣的:

 
riduci_lista_valori([[V, N]], Var, Lr) :- true. 

現在查詢成功

 
?- riduci_lista_valori([[a, 5]], [c,e], F). 
true. 

因此,您的從句頭的這第二個參數是一個很好的候選人徹底的檢查!

也許你想用一個變量代替原子m_var

+0

感謝您的回答,我學到了一些關於聲明性debbugging的新知識。但你的最後一行拯救了我的夜晚:) –

+0

s(X),這真是個好主意! –

+1

你能否包含一個參考文件來解釋\擴展關於Prolog的'declarative debugging';特別是使用'op(920,fy,*)。'這是一個很好的技術,我想將它融入到我的Prolog工具箱中。如果你想這是一個單獨的問題只是問。也許它應該是一個帶有參考標籤的標籤,如[tag:failure-slice] –

相關問題