2016-10-24 4 views
0

Nun, ich bin sehr neu in Prolog und ich versuche, einige einfache rekursive Probleme wie das folgende zu lösen.Extrahiere erste k Zeichen der Zeichenfolge in Prolog

Implement firstKCharacters(Str, K, L) Funktion, die die ersten LK Zeichen der Zeichenkette Str in der Ergebniszeichenfolge erhält. Ich habe die folgende Lösung herausgefunden:

firstKCharacters(_, 0, _):- !. 
firstKCharacters([X|L1], K, L):- append([X], S1, L), 
    X1 is K - 1, firstKCharacters(L1, X1, S1). 

ich über Ergebnis bin verwirrt:

?- firstKCharacters([a,b,c,d,e,f,g], 1, X). 
X = [a|_1174] 

Kann mir jemand erklären, was ist der _1174 und warum ich bin immer a|_1174 isntead von a?

Antwort

2

Ihr Fehler ist in der Terminalversion von firstKCharacters/3; Schreiben

firstKCharacters(_, 0, _):- !. 

vergessen Sie, die Ausgabeliste zu einer leeren Liste zu beheben; Sie sollten es schreiben, wie

firstKCharacters(_, 0, []) :- !. 

Ohne sie Festsetzung folgt, bleiben eine Variable (die _ an dritter Stelle), die nicht einheitlich ist: Ihre _1174.

Ein (off Thema, nehme ich an) Vorschlag: vermeiden append und einfach X von der linken auf die rechte Liste zu übersetzen. Ich meine: die andere Version von firstKCharacters/3 schreiben als

firstKCharacters([X|L1], K, [X|L]):- 
    X1 is K - 1, firstKCharacters(L1, X1, L). 

folgt Weil ich wie der Schnitt donk, schlage ich vor, Sie eine Version ohne es

firstKCharacters(_, 0, []). 

firstKCharacters([X|L1], K, [X|L]):- 
    K > 0, 
    Km1 is K - 1, 
    firstKCharacters(L1, Km1, L). 
+0

cool !! Danke für die Erklärung –

+1

Niemand mag den Schnitt :) – Fatalize

Verwandte Themen