Alcune centinaia di passi di riduzione sono troppi per ottenere la forma normale di Y fac ⌜3⌝?


9

Dato che ultimamente ho insegnato le basi del calcolo λ, ho implementato un semplice valutatore del calcolo λ in Common Lisp. Quando chiedo la forma Y fac 3normale di riduzione di ordine normale, ci vogliono 619 passaggi, il che sembrava un po 'troppo.

Naturalmente, ogni volta che ho fatto riduzioni simili sulla carta, non ho mai usato il calcolo λ non tipizzato, ma ho aggiunto numeri e funzioni operanti su di essi. In questo caso, fac è definito come tale:

fac = λfac.λn.if (= n 0) 1 (* n (fac (- n 1)))

In questo caso, tenendo conto =, *e -come funzioni strigliare, esso soltanto circa 50 passi per arrivare Y fac 3alla sua forma normale 6.

Ma nel mio valutatore, ho usato quanto segue:

true = λx.λy.x
false = λx.λy.y
⌜0⌝ = λf.λx.x
succ = λn.λf.λx.f n f x
⌜n+1⌝ = succ ⌜n⌝
zero? = λn.n (λx.false) true
mult = λm.λn.λf.m (n f)
pred = λn.λf.λx.n (λg.λh.h (g f)) (λu.x) (λu.u)
fac = λfac.λn.(zero? n) ⌜1⌝ (* n (fac (pred n)))
Y = λf.(λf.λx.f (x x)) f ((λf.λx.f (x x)) f)

In 619 passaggi, ottengo dalla Y fac ⌜3⌝forma normale di ⌜6⌝, vale a dire λf.λx.f (f (f (f (f (f x))))).

Da una rapida scrematura dei molti passaggi, immagino sia la definizione di predciò che merita una riduzione così lunga, ma mi chiedo ancora se potrebbe essere solo un grosso brutto bug nella mia implementazione ...

EDIT: inizialmente ho chiesto circa un migliaio di passaggi, alcuni dei quali hanno causato un'implementazione errata dell'ordine normale, quindi sono sceso a 2/3 del numero iniziale di passaggi. Come commentato di seguito, con la mia attuale implementazione, il passaggio dalla chiesa all'aritmetica di Peano in realtà aumenta il numero di passaggi ...

Risposte:


11

La codifica della chiesa è davvero brutta se si desidera utilizzare pred. Ti consiglierei di usare un codice più efficiente in stile Peano:

// aritmetica

: p_zero = λs.λz.z
: p_one = λs.λz.s p_zero
: p_succ = λn.λs.λz.sn
: p_null = λn.n (λx. ff) tt
: p_pred = λn.n (λp.p) p_zero
: p_plus = μ! f.λn.λm.n (λp. p_succ (! fpm)) m
: p_subs = μ! f.λn.λm.n (λp. p_pred (! fpm)) m
: p_eq = μ! f.λm.λn. m (λp. n (λq.! fpq) ff) (n (λx.ff) tt)
: p_mult = μ! f.λm.λn. m (λp. p_plus n (! fpn)) p_zero
: p_exp = μ! f.λm.λn. m (λp. p_mult n (! fpn)) p_one
: p_even = μ! f.λm. m (λp. not (! fp)) tt

// numeri

: p_0 = λs.λz.z
: p_1 = λs.λz.s p_0
: p_2 = λs.λz.s p_1
: p_3 = λs.λz.s p_2
...

Questo è un codice preso da una delle mie vecchie librerie, ed μ!f. …era solo una costruzione ottimizzata per Y (λf. …). (E tt, ff, notsono booleani.)

facTuttavia, non sono sicuro che otterresti risultati migliori .


Grazie per il suggerimento, lavorare con questa codifica alternativa mi ha aiutato a trovare alcuni bug nella mia implementazione. In realtà, non aiuta per il numero di passaggi, perché dopo aver risolto, trovare la forma normale di 3! fa 619 passi con i numeri della Chiesa e 687 con i numeri di Peano ...
Nessun uomo, il

Sì, è quello che ho pensato, perché usare una regola di riduzione speciale per Yqui sembra cruciale (specialmente per i numeri di Peano) per ottenere riduzioni brevi.
Stéphane Gimenez,

Solo curioso, che dire di 4 !, 5 !, 6! ?
Stéphane Gimenez,

1
Stranamente, dopo 3 !, la codifica Peano diventa più efficiente della codifica della Chiesa. Per ottenere la forma normale rispettivamente di 1 !, 2 !, 3 !, 4! e 5! con Peano / Church, richiede passi 10/10, 40/33, 157/134, 685/667, 3541/3956 e 21629/27311. Approssimazione del numero di passaggi per 6! interpolando dai dati precedenti viene lasciato come esercizio per il lettore.
Nessun uomo, il

1
Sembra che i sopracitati siano proprio i numeri di Scott "Peano + λ = Scott". Qualcos'altro che varrebbe la pena provare sono le loro varianti binarie (sia per Church che per <strike> Peano </strike> Scott).
Stéphane Gimenez,

2

Se penso a quante cose fa una CPU per calcolare il fattoriale di 3, diciamo in Python, allora alcune centinaia di riduzioni non sono affatto un grosso problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.