2016-05-12 24 views
0

Ich versuche, die Summe einer Liste innerhalb der vorgegebenen Liste anzuhängen, aber nicht genau das bekommen, was ich mit diesem benötigen: Wie füge ich die Summe der Liste innerhalb der gegebenen Liste im Prolog an?

list_sum([[list1,[1,1]],[list2,[2,2]]],X). 

Meine Ausgabe ist

:

list_sum([],[]). 
list_sum([[Lname|[Lvalues|_]]|List],X):- 
    sum(Lvalues,Sum), 
    app([Lname,Lvalues,Sum],[Out],X), 
    list_sum(List,Out). 

meine Eingabe sein Let :

X = [list1, [1, 1], 2, [list2, [2, 2], 4, []]]. 

Aber erwartete:

X = [[list1, [1, 1], 2], [list2, [2, 2], 4]]. 

Ich habe dieses Beispiel für zwei Listen gezeigt, aber ich versuche auch, es für eine beliebige Anzahl von Listen, einschließlich einer, funktionieren zu lassen, aber meine Ausgabe wird nur noch schlechter.

Antwort

1

Was Sie haben, ist ziemlich nah, aber es gibt ein paar Probleme.

Ihr Base Case ist gut (list_sum([], []).). Der Kopf Ihrer rekursive Klausel seltsam angegeben:

list_sum([[Lname|[Lvalues|_]] | List], X) :- ... 

Der Leiter der ersten Argumentliste, [Lname | [Lvalues|_]] entspricht [Lname, Lvalues | _]. Da Sie für jedes Element eine Zwei-Element-Liste planen, wäre _ immer []. Also entspricht es [Lname, Lvalues]. So der Leiter der rekursive Klausel wird:

list_sum([[Lname, Lvalues] | List], X) :- ... 

Die nächste Anweisung, sum(Lvalues,Sum) sieht gut aus. Die folgende append ist falsch:

app([Lname,Lvalues,Sum],[Out],X) 

Ihre Absicht ist [Lname, Lvalues, Sum] zu haben den Kopf einer neuen Liste zu sein, mit Out als Schwanz. Das sieht so aus, [[Lname, Lvalues, Sum]|Out]. Aber das obige Append wird Ihnen [Lname, Lvalues, Sum | Out] geben, was nicht das Gleiche ist. Und Sie brauchen den app Anruf nicht. Einfach, X = [[Lname, Lvalues, Sum]|Out] wird tun.

nun Ihre rekursiven Aufruf sieht wie folgt aus:

list_sum([[Lname, Lvalues] | List], X) :- 
    sum(Lvalues, Sum), 
    X = [[Lname, Lvalues, Sum]|Out], 
    list_sum(List, Out). 

, die die Ergebnisse Sie nach ergeben sollte. Sie können dies ein wenig vereinfachen, indem Sie die Vereinheitlichung von X direkt in den Kopf der Klausel einfügen:

Verwandte Themen