Risolvere equazioni funzionali per funzioni sconosciute nel calcolo lambda


14

Esistono tecniche per risolvere equazioni funzionali per funzioni sconosciute nel calcolo lambda?

Supponiamo che io abbia la funzione di identità definita in modo esteso come tale:

Ix=x

(cioè, scrivendo un'equazione per il comportamento previsto di quella funzione) e ora voglio risolverlo per facendo qualche trasformazione algebrica per ottenere la formula intensionale per quella funzione:I

I=λx.x

che dice come fa esattamente la funzione a fare ciò che era previsto (ovvero, come implementarlo nel calcolo lambda).

Naturalmente la funzione identità viene utilizzata solo come esempio. Sono interessato a metodi più generali per risolvere tali equazioni. In particolare, vorrei trovare una funzione che soddisfi i seguenti requisiti:B

Bf(λx.M)=(λx.fM)

cioè "inietta" la data funzione nella data funzione lambda ( λ x . M ) prima del suo "corpo" M (che è qualche espressione lambda arbitraria), possibilmente smontandola e costruendone una nuova, in modo che è diventato un parametro a cui viene applicata la funzione f .f(λx.M)Mf

Risposte:


13

Questo è un problema noto, noto come unificazione di ordine superiore .

Sfortunatamente, questo problema è indecidibile in generale. C'è un frammento decidibile, noto come Miller Pattern Fragment. È ampiamente utilizzato, tra l'altro, nel controllo dei tipi di programmi tipicamente dipendenti con metavariabili o pattern matching. Questo frammento è il punto in cui le variabili di unificazione vengono applicate solo a variabili di programma associate distinte.

Questo documento fornisce un ottimo tutorial su come funziona l'unificazione di ordine superiore e illustra una sua implementazione (relativamente) semplice.

Sfortunatamente, non sembra che la tua funzione rientri in questo frammento di pattern. Detto questo, quello che sto vedendo è abbastanza simile alla composizione delle funzioni. La seguente funzione soddisfa la tua proprietà?

B=λf g x .f (g x)

Abbiamo:

  • B f (λx.M)
  • di α=B f (λy.[y/x]M)α equivalenza
  • =λx.f ((λy.[y/x]M)x)
  • =λx.f ([x/y][y/x]M)
  • =λx.f M

1
Sì, sembra così :) La cosa divertente è che ho quasi trovato quella soluzione, ma per qualche ragione ho pensato che chiamare su qualcosa avrebbe "eseguito", incasinando l'espressione: q Quello che mi sono perso è che possiamo sostituire la variabile con un'altra variabile associata all'esterno. (λx.M)
BarbaraKwarc,

1
Grazie anche per il link al documento, lo controllerò e accetterò la tua risposta tra un paio di giorni per dare anche agli altri la possibilità.
BarbaraKwarc,

3
Questa è l'unificazione di ordine superiore? La domanda sembra riguardare il calcolo lambda non tipizzato piuttosto che il calcolo lambda semplicemente tipizzato.
Peter Taylor,

2

Penso di avere una risposta parziale, per quanto riguarda l'equazione con la funzione identità:

Ix=x

Vogliamo risolverlo trovando la formula per , che sarà della forma ( λ p . M ) con qualche espressione ancora sconosciuta M come suo corpo. Sostituiamolo con I nell'equazione originale:I(λp.M)MI

(λp.M)x=x

quindi applica la funzione a sul lato sinistro:x

M[p/x]=x

Ma cosa abbiamo qui? :> Questa equazione è la formula per l'espressione che stiamo cercando, dopo aver sostituito ogni occorrenza di p in essa con x , e dice che dovrebbe apparire come il lato destro in seguito :) In altre parole, la funzione che stavamo cercando è:Mpx

I=(λx.x)

che ovviamente è la risposta giusta :)


Proviamo lo stesso approccio per trovare la formula per il combinatore . Vogliamo che funzioni in modo tale che, se applicato a se stesso, produca se stesso applicato a se stesso:ω

ωω=ωω

Ora cerchiamo di trovare la formula per , che è della forma ( λ x . M ) per alcuni ancora sconosciuti espressione M . Sostituendo questo nell'equazione otteniamo:ω(λx.M)M

(λx.M)ω=ωω

Applicandolo al parametro sul lato sinistro si ottiene la formula per :M

M[x/ω]=ωω

Questo dice che dopo aver sostituito ogni occorrenza di in M con ω ha prodotto ωxMω , quindi possiamo dedurre che l'espressione originale M prima della sostituzione avrebbe dovuto essere xωωM , quindi la funzione che stavamo cercando dovrebbe assomigliare a questa:xx

ω=(λx.xx)

che è davvero il caso :)


Ho la sensazione, tuttavia, che potrebbe essere così facile solo perché il lato destro era già nella forma che stiamo cercando.


Esiste un modo algoritmico di andare da a ω = ( λ x .M[X/ω]=ωωω=(λX.XX)

In questi due semplici casi - sì, c'è: basta invertire la sostituzione. Ma come ho detto, questi casi potrebbero funzionare per pura "fortuna": il lato destro è già nella forma richiesta. Quando l'ho provato con alcuni esempi più complessi, non ha funzionato. Questo è quello che sto cercando, però: per un modo algoritmico.
BarbaraKwarc,

1
ωω=ωωωω
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.