Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
applikativ vs. normal
hi,
z. b. zur aufgabe 7a der klausur vom 04-95:
da ist dieses beispiel mit (add 1 (add 1 2)) gefragt. kann das bitte einer von denen, die’s gemacht und gecheckt haben (z. b. elzo, swarsron, …) hinschreiben?
ich hab zwar eine loesung, die ist aber glaube ich falsch.
thx, -steppenwolf
gute frage…
also bei applikativer Ordnung isses nicht schwer.
nur wie erkenn ich bei der normalen auswertung wann die Abbruchbedingung erreicht ist? ich darf die Argumente ja nie auswerten, und wenn ich dann da
(pred(pred(pred … (pred 2)
datehn hab dann wär das ja schon lang negativ!
Das IF ist eine Spezialform und laut der Auswertungsregel wird y (bzw. der Bedingungsausdruck) ausgewertet, dann entschieden, ob x zurückzugeben ist oder ob weiter durch (add …) zu substituieren ist. Also wird das sicher nicht in eine Endlosschleife laufen.
Die Auswertung müsste ungefähr so aussehen:
(add 1 (add 1 2)) => (add 1 (add (succ 1) (pred 2))) => (add 1 (add (succ (succ 1)) (pred (pred 2)))) =>
(add (succ 1) (pred (succ (succ 1))))
=>..... =>
(add (succ (succ (succ 1)))
(pred (pred (pred (succ (succ 1)))))) => (succ (succ (succ 1))) => 4
Applikativ:
(add 1 (add 1 2))
(add 1 (add 2 1))
(add 1 (add 3 0))
(add 1 3)
(add 2 2)
(add 3 1)
(add 4 0)
4
“Normal”:
(add 1 (add 1 2))
(add 1 (add (succ 1) (pred 2)))
(add 1 (add (succ (succ 1)) (pred (pred 2))))
(add 1 (succ (succ 1)))
(add (succ 1) (pred (succ (succ 1))))
(add (succ (succ 1)) (pred (pred (succ (succ 1)))))
(add (succ (succ (succ 1))) (pred (pred (pred (succ (succ 1))))))
(succ (succ (succ 1)))
4
Gruss,
Swarsron
Applikativ:
Einfach sobald möglich auswerten…
Normal:
Einfach bis auf die “Atome” zerlegen, und dann erst auswerten…
gaaaanz easy
thx nochmal!
so hatte ich es im prinzip auch. das wird schon gehen.