Prolog - die erste Liste aus einer Liste von Listen
Ich habe eine Liste, bestehend aus kleineren Listen in der es, jede Liste, bestehend aus 2 Elemente:
[[a,1],[b,2],[c,3]]
Habe ich mit Hilfe einer Funktion namens nehmen(1,L,R), um das erste Element aus der Liste L und die Rücksendung R. Der code für die take-Funktion ist hier:
take(0,X,X).
take(N,[H|T],[H|R]):-
N>0, M is N-1,
take(M,T,R).
Im moment einen Lauf könnte wie folgt Aussehen:
1 ?- take(1,[[a],[b],[c]],Taken).
Taken = [[a], [b], [c]]
Das ist das gleiche wie die Eingabe! Dies ist das gleiche für eine "normale" 1-level-Tiefe Liste:
2 ?- take(1,[a,b,c],Taken).
Taken = [a, b, c]
Frage:
Die Frage ist, wie kann ich machen das Ergebnis so Aussehen:
1 ?- take(1,[[a],[b],[c]],Taken).
Taken = [a]
Will ich zurück, die ersten N Elemente von der Liste, die ich senden.
- Das sieht verdächtig nach Hausaufgabe...
- Es ist besser, verwenden Sie 0 als index für das erste element.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre base case
take(0, X, X).
tut genau das, was es sagt-gegeben ein beliebiger Wert X, das Ergebnis ist X. was ich glaube, Was Sie versucht haben zu sagen isttake(1, [H|T], H).
(die liefert das erste element einer Liste).Was ich glaube, du bist tatsächlich nach
take(0, _, [ ]).
das ergibt eine leere Liste, wenn die "Einnahme" 0 von Elementen aus einer Liste. Dies funktioniert auch mit Ihrer vorhandenen rekursiven Fall.Sagen Sie, dass Sie möchten, um die "ersten N Elemente von der Liste" - so ein Ergebnis gespeichert werden müssen, in einer Liste von N Elementen. Es folgt, dass
take(1, [a, b, c], Taken)
ergeben würdeTaken = [a]
, nichtTaken = a
. Ebensotake(1, [[a], [b], [c]], Taken).
ergeben würdeTaken = [[a]].
. Mit besonderer Fall nehmen(1, ...) bilden, um das erste Element nur (ohne das es eingewickelt in eine Liste) brechen würde deine Rekursion.take(1, [H|T], H).
verlassen, nehmen Sie(0) nicht definiert, wenn diese mehr Sinn macht, Sie (Sie würden ändern müssen, die N>0 subgoal N>1, die in Ihrem rekursiven Fall). Ich persönlich lieber nehmen, (0) eine leere Liste zurück, da das macht Sinn und scheint gültig zu mir ("give me 0 Elemente")