2017-12-18 2 views
0

Example of trace produced. Ich versuche ein Prädikat zu schreiben, listDouble(L1, L2), wobei jedes Element in L2 in L1 die Doppel seines entsprechenden Elements (dh, wenn L1 = [1, 2, 3], dann L2 = [2, 4, 6]), und dies ist mein Code so weit:Prolog - Erstellen einer neuen Liste der Elemente aus einer ursprünglichen Liste nach Verdoppelung jedes Wertes?

listDouble([], [L2]). 
listDouble([H|T], [L2|_]):- 
     L is H * 2, 
     listDouble(T, [L]). 

aber es funktioniert nicht, und ich glaube, ich bin kämpfen, um zu verstehen, wie die Doppel jedes Elements zu L2 hinzufügen?

+0

Erhalten Sie keine Singleton-Variablenwarnungen? Die Struktur sieht gut aus, Sie müssen nur die Verteilung der Variablennamen neu überdenken. –

+0

@TomasBy Ich bekomme ein paar Singleton Variable Warnungen - aber ich dachte, das könnte sein, weil ich es nicht richtig strukturiert habe. L2 soll eine Liste der Elemente in L1 sein, aber jedes Element ist verdoppelt. Dh wenn L1 = [1, 2, 3] dann L2 = [2, 4, 6] – Carol

+0

Nun, sie sind Warnungen, aber sie sind ususally weisen auf schwerwiegende Fehler in Prolog hin. Ich verstehe das Problem, denke ich, ich habe nur versucht, dich zu erkennen, dass es im Basisfall ein Problem gibt. –

Antwort

1
listDouble([],[]). 
listDouble([H|T], [D|L]):- 
     D is H * 2, 
     listDouble(T,L). 
+0

ooh ich sehe, danke! – Carol

+0

@Carol Dies ist ein sehr häufiges Muster in Prolog, um durch eine Liste zu recursen und seine Elemente einer entsprechenden Liste zuzuordnen. Also gibt es ein ISO-Prädikat namens "maplist", das dies für Sie tun wird. Wenn Sie ein Prädikat definieren, das einen Wert verdoppelt, können Sie 'maplist' verwenden. Zum Beispiel "double (X, D): - D ist X * 2." und "listDouble (List, DList): - maplist (double, List, DList)." – lurker

Verwandte Themen