„Kolejność aplikacji” i „Normalna kolejność” w rachunku lambda


14

Kolejność aplikacji: Zawsze w pełni oceniaj argumenty funkcji przed oceną samej funkcji, na przykład -

(λx.x2(λx.(x+1)  2)))(λx.x2(2+1)) (λx.x2(3)) 32  9

Normalna kolejność: wyrażenie zostanie zmniejszone z zewnątrz, na przykład -

(λx.x2(λx.(x+1) 2)) (λx.(x+1)   2)2 (2+1)2 32  9

Niech M=(λx.y (λx.(x  x) λx.(x  x)))

Dlaczego w takiej kolejności nieskończona pętla, ale w normalnej kolejności M y ?M
My


1
Czy w ogóle próbowałeś je ocenić? Czy jest to pierwszy czy drugi przypadek, który jest niejasny?
Karolis Juodelė

@ KarolisJuodelė: 1st
URL87

1
Czy wyrażenia lambda nie powinny być pisane w nawiasach, aby zaznaczyć koniec pierwszego wyrażenia lambda i początek argumentu, np .:Let M = (λx.y) ((λx.(x x)) λx.(x x))
matgatycznie

Odpowiedzi:


7

(λx.y (λx.(x  x) λx.(x  x)))

λx.(x  x) λx.(x  x)λx.(x  x) λx.(x  x)
λx.(x  x)

15

Termin, który redukujesz to (K.yΩ) gdzie K.y jest funkcją stałą λx.y (zawsze wraca yignorując jego argument) i Ω=(λx.(xx)λx.(xx))jest terminem nieokreślającym. W pewnym sensieΩ jest ostatecznym terminem nie kończącym: zmniejsza się do siebie, tj ΩΩ. (Make sure to work it out on paper at least once in your life.)

Applicative order reduction must reduce the argument of the function to a normal form, before it can evaluate the top-level redex. Since the argument Ω has no normal form, applicative order reduction loops infinitely. More generally, for any term M, MΩMΩ, and this is the reduction chosen by the applicative order strategy.

Normal order reduction starts by reducing the top-level redex (because the function Ky is already in normal form). Since Ky ignores its argument, (KyΩ)y in one step. More generally, KyNy for any term N, and this is the reduction chosen by the normal order strategy.

This case illustrates a more general phenomenon: applicative order reduction only ever finds a normal form if the term is strongly normalizing, whereas normal order reduction always finds the normal form if there is one. This happens because applicative order always evaluates fully arguments first, and so misses the opportunity for an argument to turn out to be unused; whereas normal order evaluates arguments as late as possible, and so always wins if the argument turns out to be unused.

(The flip side is that applicative order tends to be faster in practice, because it's relatively rare for an argument to be unused; whereas it's common for an argument to be used multiple times, and under applicative order the argument is only evaluated once. Normal order evaluates the argument as often as it's used, be it 0, 1 or many times.)


I suppose you made a typo in paragraph 3. KyNN should be y, right? Regardless, +1.
Karolis Juodelė
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.