2017-05-08 6 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 

我々はカットオペレータを置くなぜ第一に、私は私は2つの主要な疑問を持ってこのソリューションを理解しようとしています! 1-3文から?私はそれが解決策が見つかったとき、コンパイラが後のステートメントを考慮しないことを知っています。 2番目に、4番目と5番目のケースを自然言語でどのように読み取ることができましたか?

リストがヘッドH、残り_によって分割される要素Aの深さは、数ステップのRプラス1

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

に等しく、これらの2つの文は、私は彼らがいると思います前のものと同じですが、リストの中に前進する:

profundidad(X,A,N),!. 

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

プラス、私がにと呼ばれる再帰的に[]を入れないようにする理由について、今疑っています0

ネストされたリストに深く入ると思うが、わからない。 ありがとうございます。

答えて

0

それは次の書き換えや簡素化にテストH\=Aは3節選言を行い、可能な場合はカットを避ける方が良いでしょう。

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がある場合、ソリューションの一般性(WRT変数のインスタンス化)に関する要件に応じて、(\ =)/ 2の代わりにその値を使用できます。

+0

このトピックで私を助けてくれてありがとうございました。私は\ =演算子が何であるかを調べようと苦労しました。それはそうではない(A = B)のように見えますので、あなたが言うように不平等です。私は最初のケースは外のリストの同じレベルにある番号に達すると、些細なものだと思う。第2の手段はネストされたリストに深く入り、第3の手段はAを渡し、実際のHが異なるため外側のリストに進むことです。どのように私は苦労しますか:H \ = A、profundidad(H、A、R)、あなたがHよりもdefferentであることを尋ねるなら、あなたは再帰呼び出しでHを使います。 – Enoy

+0

私は答えがなぜテストがオプションかを説明しようとしました。明らかに、 'profundidad(H、A、R)'が成功すれば、 'H' **はリストでなければなりません。これは役に立ちますか? – CapelliC

+0

はい、それはHが要求されたAと比較されるのではなく、リストでなければならないと述べているので役立ちます。 – Enoy

関連する問題