Seite 1 von 1

Neunte Hausaufgabe

Verfasst: 1. Jul 2011 13:37
von vaidas
Die neunte Hausaufgabe ist jetzt im SVN hochgeladen. Der Abgabetermin ist wie üblich der nächste Donnerstag (7.7.).

Grüße,
Vaidas

Re: Neunte Hausaufgabe

Verfasst: 4. Jul 2011 20:42
von Michael Z
Ist das remove-first bei der 3.6 wirklich als remove-last gedacht?
Wenn bei '(2 3 1 3) die erste 3 rausfliegen soll, würde ich '(2 1 3) erwarten als ergebnis, der Testfall sagt aber '(2 3 1).

Die equals-Implementierung hat übrigens einen Tippfehler, der diesen netten Effekt hat:

Code: Alles auswählen

(tobool (equal zero one)) -> false
(tobool (equal one zero)) -> true
Einmal das (sub m n) durch (sub n m) ersetzen sollte das Problem beheben.

Re: Neunte Hausaufgabe

Verfasst: 6. Jul 2011 15:35
von vaidas
Michael Z hat geschrieben:Ist das remove-first bei der 3.6 wirklich als remove-last gedacht?
Wenn bei '(2 3 1 3) die erste 3 rausfliegen soll, würde ich '(2 1 3) erwarten als ergebnis, der Testfall sagt aber '(2 3 1).
Ja, es soll '(2 1 3) sein. Ich habe es falsch eingetippt.
Michael Z hat geschrieben: Die equals-Implementierung hat übrigens einen Tippfehler, der diesen netten Effekt hat:

Code: Alles auswählen

(tobool (equal zero one)) -> false
(tobool (equal one zero)) -> true
Einmal das (sub m n) durch (sub n m) ersetzen sollte das Problem beheben.
Ja, das ist ein Fehler. Ihr könnt die "equals" Implementierung korrigieren.

Danke für die Fehlermeldungen!

Vaidas

Re: Neunte Hausaufgabe

Verfasst: 6. Jul 2011 17:48
von Pan
Hallo,

ich bekomme irgendwie die Rekursion nicht zum laufen, noch nicht mal für die abgeänderte Fakultätsfunktion aus dem Script:

Code: Alles auswählen

(define fact
  (lambda (n)
    ((make-rec factStep) n)))

(define factStep
  (lambda (g)
    (lambda (n)
      ((isZero? n)
       one
       (prod n (g (pred n)))))))
Das führt zu einer Endlosschleife. :(

Re: Neunte Hausaufgabe

Verfasst: 6. Jul 2011 18:42
von Melkom
Also, ich denke mal, das liegt an einer eager Ausführung von isZero.

Re: Neunte Hausaufgabe

Verfasst: 6. Jul 2011 18:59
von spark
Wenn du (isZero? n) durch (if (equals (isZero? n) yes) .. ..) ersetzt, dürfte es gehen. Das liegt daran, dass die "Argumente" von if (als eingebautes Sprachkonstrukt) lazy evaluiert werden, wärend die Argumente der yes-Funktion eager ausgewertet werden. Die Vorlesungsfolien geben dazu den Tipp (zugegeben etwas durch die Blume...), dass (lambda ...) zu einer Art Lazy-Evaluation führt, weil der Body von lambda-Ausdrücken nicht direkt eager evaluiert wird.

Re: Neunte Hausaufgabe

Verfasst: 6. Jul 2011 19:08
von vaidas
Das haben wir am Freitag besprochen. Man muss die Lazy-Evaluierung explizit mittels Funktionen modelieren, z.B.:

Code: Alles auswählen

(define factStep
  (lambda (g)
    (lambda (n)
      (((isZero? n)
        (lambda (x) one) 
        (lambda (x) (prod n (g (pred n)))))
       zero))))

Re: Neunte Hausaufgabe

Verfasst: 6. Jul 2011 20:22
von blackcomb
spark hat geschrieben:Wenn du (isZero? n) durch (if (equals (isZero? n) yes) .. ..) ersetzt, dürfte es gehen.
Das dürfte aber im Rahmen der Aufgabenstellung nicht erlaubt sein, da das Scheme-"if" nicht zum Lambda-Kalkül gehört.
So wie von Vaidas vorgeschlagen funktioniert es jedenfalls auch.

Re: Neunte Hausaufgabe

Verfasst: 7. Jul 2011 16:47
von itportal2
Ich habe eine Frage bzgl. Aufgabe 2 - falls nach einem Aufruf von (throw) oder (retry) weitere Statements vorkommen, sollen diese dann NICHT ausgeführt werden?
Mein Code würde so eine Ausfürhung zulassen und der Text wird ausgegeben:

Code: Alles auswählen

(retry)
 (display "after retry!\n")

Re: Neunte Hausaufgabe

Verfasst: 7. Jul 2011 16:56
von vaidas
Ja, nach dem Aufruf von "throw" bzw. "retry" sollten keine weitere Befehle vom "try" bzw. "catch" Block ausgeführt werden.

Re: Neunte Hausaufgabe

Verfasst: 18. Jul 2011 14:32
von sewe
Die Punkte finden sich jetzt im SVN.