Questo articolo suggerisce che ci sono combinatori (che rappresentano calcoli simbolici) che non possono essere rappresentati dal calcolo Lambda (se capisco le cose correttamente):
Questo articolo suggerisce che ci sono combinatori (che rappresentano calcoli simbolici) che non possono essere rappresentati dal calcolo Lambda (se capisco le cose correttamente):
Risposte:
Ci sono molte cose che si potrebbero voler fare in pratica e che non possono essere espresse direttamente nel calcolo lambda.
Il calcolo SF è un esempio. Il suo potere espressivo non è una novità; la parte interessante del documento (non mostrato nelle diapositive) è la teoria delle categorie dietro di essa. Il calcolo SF è analogo a un'implementazione lisp in cui si consente alle funzioni di ispezionare la rappresentazione del loro argomento, in modo da poter scrivere cose come (print (lambda (x) (+ x 2)))
⟹ "(lambda (x) (+ x 2))"
.
Un altro esempio importante è il parallelo di Plotkin o . Intuitivamente parlando, c'è un risultato generale che afferma che il calcolo lambda è sequenziale: una funzione che accetta due argomenti deve sceglierne uno da valutare per primo. È impossibile scrivere un termine lambda or
tale che ( or
⊤ ⊥) ⟹ ⊤
, ( or
⊥ ⊤) ⟹ ⊤ e or
⊥ ⊥ ⟹ ⊥ (dove ⊥ è un termine non terminante e ⊤ è un termine terminante). Questo è noto come "parallelo o" perché un'implementazione parallela potrebbe fare un passo di ogni riduzione e arrestarsi ogni volta che uno degli argomenti termina.
Un'altra cosa che non puoi fare nel calcolo lambda è l'input / output. Dovresti aggiungere primitivi extra per questo.
Naturalmente, tutti questi esempi possono essere rappresentati nel calcolo lambda aggiungendo un livello di riferimento indiretto, rappresentando essenzialmente i termini lambda come dati. Ma poi il modello diventa meno interessante: perdi la relazione tra le funzioni nel linguaggio modellato e le astrazioni lambda.
La risposta alla tua domanda dipende da come definisci "calcoli" e "rappresentato". Il thread su LtU che sclv ha menzionato , d'altra parte, consiste principalmente di persone che parlano l'una accanto all'altra a causa di definizioni disallineate di vari termini.
La distinzione non è certamente una potenza computazionale: ogni sistema in esame è equivalente a Turing. La questione è che la semplice equivalenza di Turing in realtà non dice nulla sulla struttura o sulla semantica di un'espressione. Del resto, in modelli di calcolo estremamente minimalisti che richiedono codifiche complesse o stati iniziali non banali, potrebbe anche non essere chiaro se un sistema sia in grado di calcolare universalmente o se un'illusione dell'universalità sia creata dall'interpretazione di qualcuno del sistema . Ad esempio, vedi questa discussione sulla mailing list riguardante una macchina di Turing a 2 stati e 3 simboli, in particolare le preoccupazioni sollevate da Vaughan Pratt.
Ad ogni modo, la distinzione tracciata è tra qualcosa come:
L'equivalenza di Turing implica solo che un sistema soddisfa il terzo criterio per qualsiasi funzione calcolabile, mentre è spesso il primo criterio a cui teniamo, in un sistema formale di logica o in un linguaggio di programmazione (nella misura in cui questi differiscono effettivamente).
Questa è una descrizione molto informale, ma l'idea essenziale può essere definita in modo più preciso. Nel suddetto thread LtU è possibile trovare un paio di riferimenti a lavori esistenti lungo linee simili.
Sia la logica combinatoria di Schönfinkel che il calcolo λ di Church furono inizialmente concepiti come astrazioni distillate di ragionamento logico, e come tali, la loro struttura si mappa in modo molto accurato sul ragionamento logico e viceversa. Portano anche un'ipotesi di estendibilità , come descritto dalla regola di riduzione dell'eta:, λx. f x
dove x
non si verifica f
, è equivalente al solo f
solo.
In pratica, una nozione molto rigorosa di estendibilità può essere troppo limitante, mentre l'intensionalità sfrenata rende difficile o impossibile il ragionamento locale sulle sottoespressioni.
Il calcolo SF è un calcolo combinatore modificato che fornisce, come operazione primitiva, una forma limitata di analisi intensionale: la capacità di decostruire espressioni parzialmente applicate, ma non valori primitivi o espressioni non normalizzate. Ciò accade per essere ben mappato su idee come la corrispondenza dei modelli come si trova nei linguaggi di programmazione in stile ML o nelle macro come si trova in Lisps, ma non può essere descritto in calcolo SK o λ senza, effettivamente, implementare un interprete per valutare termini "intensionali".
Quindi, in sintesi: il calcolo SF non può essere rappresentato direttamente nel calcolo λ, nel senso che la migliore rappresentazione possibile molto probabilmente comporta l'implementazione di un interprete di calcolo SF, e la ragione di ciò è una fondamentale differenza semantica: le espressioni hanno interno struttura o sono definiti semplicemente dal loro comportamento esterno?
Il calcolo SF di Barry Jay è in grado di esaminare la struttura dei termini a cui è applicato, che non è funzionale. Il calcolo lambda e la logica combinatoria tradizionale sono puramente funzionali e quindi non possono farlo.
Esistono molte estensioni del calcolo lambda che fanno cose che violano la purezza, la maggior parte delle quali richiede un certo grado di correzione della strategia di riscrittura, come l'aggiunta di stato, controlli (ad es. Tramite continuazioni) o variabili logiche.