2017-03-07 31 views
2

我正在學習Prolog。我正在試驗elemindex謂詞,形式爲elemindex(element, index, list),例如,elemindex(1,0,[1,2,3,1]).elemindex(3,0,[1,2,3,1]).在謂詞的響應中評估s(N),而不會丟失功能

由於實例的限制,我結束了這一點:

elemindex(E, 0, [E|_]). 
elemindex(E, s(M), [_|L]) :- elemindex(E,M,L). 

不過,如果我查詢?- elemindex(1,N,[1,2,3,1]).,因爲在我的例子,Prolog的迴應:

N = 0 
N = s(s(s(0))) 
yes 

這肯定是工作,但我想s(s(s(0)))至少顯示爲3。此外,我無法執行像?- elemindex(E, 3, [1,2,3,4]).這樣的查詢,但將代碼更改爲使用N is M+1使我無法評估第1種查詢。

所以,我的問題是2倍:

  1. 我怎樣才能得到s(s(s(0)))顯示在我的結果3
  2. 我該如何實現elemindex這樣我可以查詢元素的索引?
+2

爲什麼你使用'S/1'在這種情況下?你嘗試過'N#= M + 1'嗎? (使用庫'clpfd') – lurker

+0

@lurker能解釋一下'#='會做什麼嗎?我對prolog很陌生。 – AJFarmar

回答

2

#=/2是CLPFD庫的一部分,這是你用來對整數進行「推理」的部分。 is/2運算符旨在評估一個完全已知的表達式,因此要求第二個參數完全綁定以便立即可評估。 #=/2沒有這個限制。你不會得到實例化錯誤,Prolog會嘗試解決這些變量。在「Prolog clpfd」上進行谷歌搜索。

下面是它的工作原理與您的代碼:

elemindex(E, 0, [E|_]). 
elemindex(E, Index, [_|L]) :- 
    Index #= N + 1, 
    N #>= 0, 
    elemindex(E, N, L). 

然後查詢:

| ?- elemindex(1,N,[1,2,3,1]). 

N = 0 ? a 

N = 3 

no 
| ?- elemindex(E, 3, [1,2,3,4]). 

E = 4 ? a 

no 
| ?- 
+1

這是行不通的,謝謝你的解釋。 – AJFarmar

+1

'elemindex(1,1,L)'不會終止 - 但它可能 – false

+1

@錯誤很好,趕上,謝謝! – lurker