2017-05-08 1 views
0

Ich möchte die Tiefe oder Anzahl der verschachtelten Liste, wo bestimmte Element ist. Auch als Bedingung enthält die Liste keine wiederholten Elemente. Ich versuche, diese Lösung zu verstehen, wo ich zwei Haupt Zweifel haben:Prolog die Anzahl der verschachtelten Liste + 1, wo ein Element in eine Liste ist

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),!. 

Die richtige Ausgabe wäre:

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

Erstens, warum wir den Schnitt Betreiber tun setzen! von 1-3 Aussagen? Ich weiß, dass es den Compiler daran hindert, spätere Anweisungen zu berücksichtigen, wenn eine Lösung gefunden wird. Zweitens, wie könnten wir 4. und 5. Fälle in natürlicher Sprache lesen?

Die Tiefe eines Elements A, wenn die Liste durch den Kopf H und dem Rest _ gespaltet wird, ist gleich der Anzahl von Schritten sowie R 1.

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

und diese beiden Sätze Ich denke, sie sind die gleiche wie die vorherigen, aber nach vorne in die Liste zu gehen:

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

plus bin zu zweifeln ich jetzt, warum nicht [in rekursiven] aufgerufen setzen:

profundidad(X,A,N),!. 

Ich denke, es ist tief in die verschachtelten Listen zu gehen, aber ich bin mir nicht sicher. Danke.

Antwort

0

Es ist besser, Schnitte zu vermeiden, wenn möglich, in der folgenden Neufassung und Vereinfachung der Test H\=A machen die drei Klauseln disjunctive.

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). 

Die zweite Klausel müssen den Test nicht, da es sich um eine Ebene in der Liste geht nach unten, das heißt es gelingen wird, wenn es sich um eine Liste ist, und dann sowieso nicht mit dem Zielelement vereinigen kann. Aus Gründen der Übersichtlichkeit könnte es dort bleiben - es schadet nicht.

Wenn Ihr Prolog dif/2 hat, könnten Sie das anstelle von (\ =)/2 verwenden, abhängig von Ihren Anforderungen bezüglich der Allgemeingültigkeit (WRT-Variablen Instanziierung) der Lösung.

+0

Vielen Dank CapelliC für die Hilfe bei diesem Thema. Ich habe versucht, herauszufinden, wofür es \ = operator ist, und es sieht so aus, als ob es nicht bedeutet (A = B), also ist es disjunction, wie du sagst. Ich denke, der erste Fall ist der triviale, wenn wir eine Zahl erreichen, die auf der gleichen Ebene der äußeren Liste ist; das zweite bedeutet, tief in die verschachtelten Listen einzudringen, und das dritte bedeutet, auf der äußeren Liste vorwärts zu gehen, weil A und H verschieden sind. Aber ich kämpfe mit: H \ = A, profundidad (H, A, R), weil es merkwürdig ist, wenn du fragst, H ist anders als A, dann verwendest du H im rekursiven Ruf! – Enoy

+0

Ich versuchte in der Antwort zu erklären, warum der Test optional ist. Wenn "profundidad (H, A, R)" erfolgreich ist, muss "H" ** eindeutig eine Liste sein. Hilft das ? – CapelliC

+0

Ja, es hilft, weil es besagt, dass H eine Liste sein muss, anstatt mit dem angeforderten A verglichen zu werden. – Enoy

Verwandte Themen