Perché è importante che le funzioni siano anonime nel calcolo lambda?


19

Stavo guardando la conferenza di Jim Weirich, intitolata " Avventure nella programmazione funzionale ". In questa lezione, introduce il concetto di Y-combinatori, che trova essenzialmente il punto fisso per le funzioni di ordine superiore.

Una delle motivazioni, secondo lui, è quella di poter esprimere funzioni ricorsive usando il calcolo lambda in modo che la teoria della Chiesa (tutto ciò che è effettivamente calcolabile possa essere calcolata usando il calcolo lambda) rimanga.

Il problema è che una funzione non può chiamarsi semplicemente così, perché il calcolo lambda non consente funzioni nominate, ovvero

n(x,y)=x+y

non può recare il nome ' ', deve essere definito in modo anonimo:n

(x,y)x+y

Perché è importante che il calcolo lambda abbia funzioni che non hanno un nome? Quale principio viene violato se ci sono funzioni denominate? O è solo che ho frainteso il video di Jim?


4
Questo non suona affatto importante. È possibile assegnare a una variabile e quindi è stato assegnato un nome alla funzione. n(x,t)x+yn
Yuval Filmus,

@YuvalFilmus sì, puoi associare un nome a una funzione. Penso che la vera domanda qui, la perplessità, sia perché (nel calcolo lambda) una funzione non può chiamarsi con un nome simile? Perché abbiamo bisogno di una tecnica come l'operatore Y per eseguire funzioni ricorsive? Spero che la mia risposta qui sotto aiuti.
Jerry101,

1
@ Jerry101 La ragione storica dell'assenza di auto-applicazione è che -calculus era inteso come una base di matematica e la capacità di auto-applicare rende immediatamente tale base incoerente. Quindi questa apparente incapacità (che sappiamo ora può essere elusa) è una caratteristica del design di -calculus. λλλ
Martin Berger,

@MartinBerger, per favore, dì di più. Incoerente per la ragione nella mia risposta? O per un altro motivo?
Jerry101,

1
@ Jerry101 Incoerente nel senso che puoi dimostrare 0 = 1 in una tale base di matematica. Dopo Kleene e Rosser ha mostrato l'inconsistenza dei puri, non tipizzata -calcolo, il modo semplice digitato -calcolo è stato sviluppato come un'alternativa che non ci permette di definire combintors fix-point, come . Ma se aggiungi la ricorsione al semplice -calculus diventa di nuovo incoerente, perché ogni tipo è abitato da un programma non terminante. λ Y λλλYλ
Martin Berger,

Risposte:


24

Il teorema principale riguardo a questo problema è dovuto a un matematico britannico della fine del XVI secolo, chiamato William Shakespeare . Il suo documento più noto sull'argomento si intitola " Romeo e Giulietta " è stato pubblicato nel 1597, sebbene il lavoro di ricerca sia stato condotto alcuni anni prima, ispirato ma precursori come Arthur Brooke e William Painter.

Il suo risultato principale, dichiarato nell'atto II. Scena II , è il famoso teorema :

Cosa c'è in un nome? ciò che chiamiamo rosa
con qualsiasi altro nome avrebbe un profumo dolce;

Questo teorema può essere intuito in modo intuitivo come "i nomi non contribuiscono al significato".

La maggior parte dell'articolo è dedicata a un esempio che integra il teorema e mostra che, anche se i nomi non danno alcun significato, sono la fonte di infiniti problemi.

Come sottolineato da Shakespeare, i nomi possono essere cambiati senza cambiare significato, un'operazione che è stata successivamente chiamata -conversion da Alonzo Church e dai suoi seguaci. Di conseguenza, non è necessariamente semplice determinare ciò che è indicato da un nome. Ciò solleva una varietà di problemi come lo sviluppo di un concetto di ambiente in cui è specificata l'associazione nome-significato e le regole per sapere qual è l'ambiente corrente quando si tenta di determinare il significato associato a un nome. Ciò ha sconcertato gli informatici per un po ', dando origine a difficoltà tecniche come il famigerato problema Funargα. Gli ambienti rimangono un problema in alcuni linguaggi di programmazione popolari, ma generalmente si ritiene che non sia fisicamente sicuro essere più specifico, quasi letale come l'esempio elaborato da Shakespeare nel suo documento.

Questo problema è anche vicino ai problemi sollevati nella teoria del linguaggio formale , quando alfabeti e sistemi formali devono essere definiti fino a un isomorfismo , in modo da sottolineare che i simboli degli alfabeti sono entità astratte , indipendentemente da come "materializzano" come elementi da alcuni set.

Questo importante risultato di Shakespeare mostra anche che la scienza si stava quindi differenziando dalla magia e dalla religione, dove un essere o un significato potrebbe avere un vero nome .

La conclusione di tutto ciò è che per il lavoro teorico è spesso più conveniente non essere gravati dai nomi, anche se può sembrare più semplice per il lavoro pratico e la vita di tutti i giorni. Ma ricorda che non tutti quelli che si chiamano mamma sono tua madre.

Nota :
il problema è stato affrontato più recentemente dal logico americano del 20 ° secolo Gertrude Stein . Tuttavia, i suoi colleghi matematici stanno ancora riflettendo sulle precise implicazioni tecniche del suo teorema principale :

La rosa è una rosa è una rosa è una rosa.

pubblicato nel 1913 in una breve comunicazione intitolata "Sacra Emily".


3
Nota aggiuntiva: Negli ultimi decenni la "rosa" è stata (nell'informatica) per lo più sostituita da "foobar" (e parti di esse) come esempio canonico per un nome buono come un altro. Questa preferenza è stata apparentemente introdotta dagli ingegneri ferroviari americani.
FrankW

Detto questo, i nomi canonici per concetti usati spesso sono importanti per una comunicazione efficiente.
Raffaello

1
@Raphael Concordato, ma lo metterei nella categoria della vita quotidiana. E come possiamo conoscere i confini di ciò che è veramente canonico? Tuttavia, mi sento spesso preoccupato quando vedo gli studenti prendere tutta la terminologia, la notazione e le definizioni (o anche il modo in cui alcuni teoremi sono dichiarati) per una verità immutabile data da Dio. Anche qui, su SE, gli studenti fanno domande, senza rendersi conto che potremmo non conoscere le loro notazioni o le definizioni che usano in classe. La magia dei veri nomi non muore facilmente.
babou,

10

Vorrei avventurarmi in un'opinione diversa da quella di @babou e @YuvalFilmus: è essenziale che puro -calculus abbia funzioni anonime. Il problema di avere solo funzioni nominate è che devi sapere in anticipo di quanti nomi avrai bisogno. Ma nel puro -calculus non hai un limite a priori legato al numero di funzioni usate (pensa alla ricorsione), quindi o usi (1) funzioni anonime, o (2) segui il percorso -calculus e fornisci un nuovo combinatore di nomi ( in -calculus) che fornisce una scorta inesauribile di nomi freschi in fase di esecuzione.λλπνx.Pπ

La ragione per cui il puro -calculus non ha un meccanismo esplicito per la ricorsione è che il puro -calculus era originariamente inteso come una fondazione della matematica da A. Church, e la ricorsione rende tale fondamenta insignificante. Quindi è stato uno shock quando Stephen Kleene e JB Rosser hanno scoperto che il puro non è adatto come base della matematica ( paradosso di Kleene-Rosser ). Haskell Curry ha analizzato il paradosso di Kleene-Rosser e si è reso conto che la sua essenza è ciò che oggi conosciamo come Y-Combinator.λλλ

Aggiunto dopo il commento di @ babou: non c'è niente di sbagliato nell'avere funzioni nominate. Puoi farlo nel modo seguente: è una scorciatoia per nel call-by-value- lamb -calculus.letf=MinN(λf.N)Mλ


1
Penso che l'OP volesse la capacità di nominare le funzioni, non di vietare quelle anonime. Detto questo, ritengo che qualsiasi requisito di λ-calcolo relativo alla necessità di funzioni anonime verrebbe mostrato anche in lingue come Lisp / Scheme o ML. Nel caso di Lisp / Scheme, la meta-circolarità dei valutatori dovrebbe consentire di creare nuovi nomi secondo necessità, anche se non sono sicuro che lo vorrei in un sistema formale. L'uso di un numero illimitato di funzioni non è necessariamente un problema quando la ricorsione consente il riutilizzo locale di nomi già utilizzati.
babou,

@babou Scheme e ML hanno letrec, quindi possono facilmente vivere con un numero finito di funzioni nominate. Sarei interessato a vedere una presentazione del puro -calculus con uno schema esplicito per riutilizzare i nomi. E sì, la capacità di nominare funzioni (e altri termini) è perfettamente compatibile con il puro -calculus. λλλ
Martin Berger,

L'ultima riga dovrebbe contenere (lambda f. N) M?
Joe the Person

@JoethePerson Sì, ben individuato. Fisso. Grazie.
Martin Berger,

4

Credo che l'idea sia che i nomi non siano necessari. Tutto ciò che sembra richiedere nomi può essere scritto come funzioni anonime.

Puoi pensare al calcolo lambda come al linguaggio assembly. Qualcuno in una lezione sull'assemblea potrebbe dire "Non ci sono alberi ereditari orientati agli oggetti nel linguaggio assembly". Potresti quindi escogitare un modo intelligente per implementare alberi ereditari, ma non è questo il punto. Il punto è che gli alberi ereditari non sono richiesti al livello più elementare di come è programmato un computer fisico.

Nel calcolo lambda il punto è che i nomi non sono richiesti per descrivere un algoritmo al livello più elementare.


4

Mi sto godendo le 3 risposte qui finora - soprattutto l'analisi Shakespearen di @ babou - ma non fanno luce su ciò che penso sia l'essenza della domanda.

λ-calculus associa i nomi alle funzioni ogni volta che si applica una funzione a una funzione. Il problema non è la mancanza di nomi.

"Il problema è che una funzione non può chiamarsi semplicemente" facendo riferimento al suo nome.

(In puro Lisp, il nome -> l'associazione della funzione non rientra nell'ambito del corpo della funzione. Affinché una funzione si chiami con il suo nome, la funzione dovrebbe fare riferimento a un ambiente che si riferisce alla funzione. Pure Lisp non ha strutture di dati cicliche. Impure Lisp lo fa mutando l'ambiente a cui fa riferimento la funzione.)

Come ha sottolineato @MartinBerger, la ragione storica per cui λ-calculus non consente a una funzione di chiamarsi per nome era un tentativo di escludere il paradosso di Curry quando si cerca di utilizzare λ-calculus come base della matematica, compresa la logica deduttiva. Ciò non ha funzionato poiché tecniche come il combinatore Y consentono la ricorsione anche senza autoreferenziazione.

Da Wikipedia:

Se possiamo definire la funzione r = (λ.x x x ⇒ y)allora r r = (r r ⇒ y).

Se r rè vero, allora yè vero. Se r rè falso, allora r r ⇒ yè vero, il che è una contraddizione. Quindi yè vero e come ypuò essere qualsiasi affermazione, qualsiasi affermazione può essere dimostrata vera.

r rè un calcolo non terminante. Considerata come logica r rè un'espressione per un valore che non esiste.


λ.x xxxxx

@RohanPrabhu si λ.x x xtraduce in Lisp come (lambda (x) (x x))e in JavaScript come function (x) {return x(x);}. x⇒ysignifica x implies y, più o meno come (NOT x) OR y. Vedi en.wikipedia.org/wiki/Lambda_calculus
Jerry101

Grazie per aver risposto a questa imbarazzante domanda da principiante!
Rohan Prabhu,
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.