2017-05-08 79 views
0

我想返回特定元素所在的嵌套列表的深度級別或數量。同樣作爲條件,該列表沒有重複的元素。我想,我有兩個主要的疑慮瞭解此解決方案:Prolog獲取嵌套列表的數量+ 1,其中元素是一個列表

profundidad([],_,0):-!. 
profundidad([A],A,1):-!. 
profundidad([A|_],A,1):-!. 
profundidad([H|_],A,N):- 
    profundidad(H,A,R),N is R+1. 
profundidad([_|X],A,N):- 
    profundidad(X,A,N),!. 

正確的輸出將是:

profundidad([2,3,4,5,[[6]],10],6,X). 
X = 3 

首先,我們爲什麼把切割操作!從1-3個陳述?我知道它會阻止編譯器在找到解決方案時考慮後面的語句。 二,我們如何能夠閱讀自然語言中的第四和第五種情況?

元素A的當列表由頭部H和其餘_分裂的深度,等於步數R加1。

profundidad([H|_],A,N):- 
    profundidad(H,A,R),N is R+1. 

而那些兩個句子我認爲它們是同以前的,但前進到列表:

profundidad([_|X],A,N):- 
    profundidad(X,A,N),!. 

另外,我現在懷疑,爲什麼不把[]爲遞歸調用:

profundidad(X,A,N),!. 

我認爲這是深入嵌套列表,但我不確定。 謝謝。

回答

0

最好避免切割時儘可能在以下重寫和簡化測試H\=A使三個條款析取

profundidad([A|_],A,1). 
profundidad([H|_],A,N):- 
    % H\=A, 
    profundidad(H,A,R), 
    N is R+1. 
profundidad([H|T],A,N):- 
    H\=A, 
    profundidad(T,A,N). 

第二條款並不需要測試,因爲它下降的水平在列表中,這意味着當它是一個列表它會成功,再不能與目標元素反正統一。爲了清晰起見,它可以保持在那裏 - 它沒有傷害。

如果您的Prolog有dif/2,您可以使用它來代替(\ =)/ 2,具體取決於您對解決方案的一般性(WRT變量實例化)的要求。

+0

謝謝CapelliC幫助我解決這個問題。我試圖弄清楚什麼是\ =操作符,它看起來像不是(A = B),所以它就像你說的那樣是分離的。我認爲第一種情況是微不足道的,當我們達到與外部清單相同水平的數字時;第二種方法深入到嵌套列表中,第三種方法是在外部列表中前進,因爲傳遞的A和實際的H是不同的。不管我怎麼努力:H = A,profundidad(H,A,R),因爲奇怪的是,如果你問H不是A,那麼在遞歸調用中使用H! – Enoy

+0

我試圖在答案中解釋爲什麼測試是可選的。很明顯,如果'profundidad(H,A,R)'成功,'H' **必須是一個列表。這有幫助嗎? – CapelliC

+0

是的,它有幫助,因爲它表明H需要成爲一個列表,而不是與請求的答案進行比較。 – Enoy

相關問題