Associatività in lambda calcolo
-
28-09-2019 - |
Domanda
Sto lavorando sulle domande di esercizio di libro Il Lambda calcolo . Una delle domande che mi sono bloccato sta dimostrando quanto segue: Mostrare che l'applicazione non è associativa; infatti, x (yz) non è uguale a (xy) z
Ecco quello che ho lavorato su finora:
Let x = λa.λb. ab
Let y = λb.λc. bc
Let z = λa.λc. ac
(xy)z => ((λa.λb. ab) (λb.λc. bc)) (λa.λc. ac)
=> (λb. (λb.λc. bc) b) (λa.λc. ac)
=> (λb.λc. bc) (λa.λc. ac)
=> (λc. (λa.λc. ac) c)
x(yz) => (λa.λb. ab) ((λb.λc. bc) (λa.λc. ac))
=> (λb. ((λb.λc. bc) (λa.λc. ac)) b)
=> (λb. (λc. (λa.λc. ac) c) b)
È corretto? Ti prego, aiutami a capire.
Soluzione
Le derivazioni sembrano bene, a colpo d'occhio.
Concettualmente, basti pensare che x, yez possono rappresentare qualsiasi funzioni calcolabili, e chiaramente, alcune di queste funzioni non sono associativo. Per esempio, X è 'sottrattivo 2', y è 'divisione per 2', e z 'doppio'. Per questo esempio, x (yz) = 'sottrarre 2' e (xy) z = 'sottrarre 1'.
Altri suggerimenti
Credo anche che la vostra contro-esempio è corretto.
Probabilmente si potranno ottenere un contro-esempio più semplice in questo modo:
lasciò x = λa.n e y , z variabili allora:
(xy) z => ((λa.n) y) z => n z
x (yz) => (λa.n) (y z) => n
Sembra ok, ma per semplicità, che ne dici di provare per assurdo?
Si supponga (xy) z = x (yz), e lasciare che
x = λa.λb. a # x = const
y = λa. -a # y = negate
z = 1 # z = 1
e mostra che ((xy) z) 0 ≠ (x (yz)) 0.
Il libro si parla da Barendregt è estremamente formale e preciso (un grande libro), quindi sarebbe bello avere la precisa indicazione del esercizio.
Credo che il vero obiettivo era quello di trovare istanze per x, y, z tali che x (y z) riduce al boolean true = \ xy.x e (x y) z riduce al falso booleano = \ xy.y
Quindi, si può prendere ad esempio x = \ z.true ez = I = \ z.z (y arbitraria).
Ma come possiamo dimostrare che vale non è convertibile con falso? Non hai modo di dimostrarlo all'interno del calcolo, dal momento che non si ha la negazione: si può dimostrare solo uguaglianze e disuguaglianze non. Tuttavia, osserviamo che, se veri = false allora tutti i termini sono uguali.
Infatti, per ogni M e N, se vero = falso allora
true M N = false M N
ma vero M N riduce a M, mentre falsa M N riduce a N, quindi
M = N
Quindi, se veri = false tutti i termini sarebbero uguali, e il calcolo sarebbe banale. Dal momento che siamo in grado di trovare modelli non banali della lambda calcolo, tale modello può equiparare vero e falso (più in generale possono equiparare i conti con diverse forme normali, che ci richiederebbe di parlare del Bohm-out tecnica).