2016-07-06 13 views
1

Ich weiß, dass dieses Thema mehrmals diskutiert wurde, aber es ist etwas immer noch unklar für mich. Ich habe diese Frage gelesen applicative-order/call-by-value and normal-order/call-by-name differences und es ist etwas, was ich würde einmal zu klären und für alle:Anruf nach Name vs normale Reihenfolge

Call-by-Name

Als normale Ordnung, aber keine Reduzierungen innerhalb Abstraktionen durchgeführt. Zum Beispiel ist λx (λx.x) x gemäß dieser Strategie in normaler Form, obwohl es den Redex (λx.x) x enthält.

Beim Aufruf mit dem Namen wird der Ausdruck λx. (Λx.x) x in Normalform angegeben; ist das so, weil "(λx.x) x" als der Körper betrachtet wird (da der Umfang von λ so weit wie möglich nach rechts reicht)? Und auf der anderen Seite, wenn ich die normale Reihenfolge anwende, was wäre das Ergebnis?

Antwort

1

Beim Aufruf nach Name wird der Ausdruck λx. (Λx.x) x in Normalform angegeben; ist das so, weil "(λx.x) x" als der Körper betrachtet wird (da der Umfang von λ so weit wie möglich nach rechts reicht)?

Ja, Sie haben Recht.

Und auf der anderen Seite, wenn ich die normale Reihenfolge anwende, was wäre das Ergebnis?

Sie tun Reduktion im Inneren des Körpers: (λx.x)x -> x, so dass die ganze Sache auf die Funktion Identität reduziert:

λx.(λx.x)x -> λx.x 

es ein bisschen weiter zu verdeutlichen, möchte ich tun, um diese noch einmal, renaming die Variablen mit dem Barendregt variable convention zu entsprechen: λx.(λx.x)x =α λx.(λy.y)x:

λx.(λy.y)x -> λx.[y := x](y) = λx.x