In che modo sono collegati i linguaggi di programmazione e le basi della matematica?


30

Fondamentalmente sono a conoscenza di tre basi per la matematica

  1. Insiemistica
  2. Teoria dei tipi
  3. Teoria delle categorie

Quindi, in che modo sono correlati i linguaggi di programmazione e le basi della matematica?

MODIFICARE

La domanda originale era "Linguaggi di programmazione basati su basi matematiche"

con l'aggiunta del paragarfo di

E implementazioni della teoria
1. Teoria dei tipi in Coq
2. Teoria degli insiemi in SETL
3. Teoria delle categorie in Haskell

Sulla base di un suggerimento, questo è stato modificato in "In che modo sono correlati i linguaggi di programmazione e le basi della matematica"

Dal momento che questa è una di quelle domande in cui non sapevo abbastanza su cosa stavo chiedendo ma volevo imparare qualcosa, sto modificando la domanda per renderla più preziosa per l'apprendimento e gli altri, lasciando comunque i dettagli in modo da non rendere il l'attuale risposta di Andrej Bauer sembra fuori tema.

Grazie per tutti i commenti e la risposta finora, sto imparando da loro.


1
Non sono sicuro di aver compreso la domanda o le ipotesi in essa contenute. Coq non è un linguaggio di programmazione per quanto ho capito. I programmi possono essere estratti dalle prove Coq ma ciò non lo rende un linguaggio di programmazione. Anche la teoria delle categorie e la teoria dei tipi sono strettamente correlate, quindi non sono sicuro che possiamo classificarle come hai fatto tu. Non so di SETL. Vedi anche l'elenco degli assistenti di prova su Wikipedia.
Kaveh,

3
Haskell non è "un'implementazione della teoria delle categorie" e, in ogni caso, le basi della matematica hanno uno scopo diverso rispetto ai linguaggi di programmazione. Mentre si può fare una sorta di confronto, non è così buono cercare di forzare il confronto in una relazione formale.
Andrej Bauer,

1
Legame

Risposte:


29

[Nota: questo paragrafo è ormai obsoleto.] Il titolo della tua domanda contiene un'ipotesi ingiustificata, vale a dire che i linguaggi di programmazione sono "basati su basi matematiche". Questo non è generalmente il caso, sebbene le due aree abbiano relazioni importanti. Un'affermazione più accurata sarebbe che (alcuni) linguaggi di programmazione sono stati progettati usando tecniche di base. Una domanda migliore da porsi sarebbe "come sono correlati i linguaggi di programmazione e le basi della matematica?"

La connessione più generale è racchiusa nello slogan prove-come-programmi , che può essere fatto funzionare in diversi modi. La corrispondenza Curry-Howard è la più ovvia. Con esso ci colleghiamo subito alla teoria dei tipi, alla logica e alla programmazione. Ma va sottolineato che la corrispondenza Curry-Howard non funziona molto bene in presenza di una ricorsione generale (perché ogni tipo viene abitato), che supporta ogni linguaggio di programmazione generico.

Un modo più sottile di far funzionare lo slogan prove-come-programmi consiste nell'utilizzare la realizzabilità . Anche in questo caso mettiamo in relazione prove e programmi, ma ora la direzione va dalle prove ai programmi: ogni prova fornisce un programma, ma non tutti i programmi sono necessariamente una prova.

L'esempio principale di un linguaggio di programmazione basato su una base è Agda , che è semplicemente un'implementazione della teoria dei tipi dipendenti. Tuttavia, Agda non è un linguaggio di programmazione generico perché non supporta la ricorsione generale. Ogni funzione in Agda è totale e ci sono funzioni calcolabili che non possono essere implementate in Agda. In pratica, i programmatori non lo noteranno, ma noteranno che Agda non consente valori indefiniti, ad esempio loop infiniti.

Coq non è un linguaggio di programmazione ma piuttosto un assistente di prova. Tuttavia, ha anche capacità di estrazione che forniscono programmi dalle prove. Assistenti di prova e linguaggi di programmazione non devono essere confusi tra loro.

Non dovremmo dimenticare che il prologo e altri linguaggi di programmazione logica si ispirano all'idea che il calcolo sia la ricerca di prove . Questo ovviamente li collega strettamente alla logica.

Haskell è un linguaggio di programmazione generico che si basa sulla teoria dei domini . Vale a dire, la sua semantica è di dominio teorico perché deve tenere conto delle funzioni parziali e della ricorsione. La comunità di Haskell ha sviluppato una serie di tecniche ispirate alla teoria delle categorie, di cui le monadi sono più conosciute ma non devono essere confuse con le monadi . Più in generale, le funzionalità di programmazione avanzata sono generalmente trattate con una combinazione di teoria dei domini e teoria delle categorie, ma questo non è qualcosa a cui il programmatore Haskell in strada è abile. La cosiddetta "categoria sintattica" dei tipi di Haskell è il punto di vista di un laico su come Haskell e teoria delle categorie corrispondano tra loro.

La teoria degli insiemi (classica o costruttiva) sembra ispirare le idee nel linguaggio di programmazione in misura minore. Naturalmente, la teoria degli insiemi costruttiva ha la sua connessione con la programmazione attraverso la logica costruttiva. Un'importante applicazione della teoria degli insiemi intuitivi ai linguaggi di programmazione è stata data da Alex Simpson che l'ha usato per far funzionare la teoria dei domini sintetici. Ma questa è roba abbastanza avanzata, forse vedi queste diapositive . Jean-Louis Krivine ha sviluppato un marchio molto interessante di realizzabilità per la teoria dell'insieme classico. Questo sembra un buon modo per mettere in relazione la teoria e la programmazione dell'insieme classico.

In sintesi, la teoria dei linguaggi di programmazione utilizza tecniche di base. Ciò non sorprende, poiché riteniamo che il calcolo sia un concetto fondamentale. Ma è troppo ingenuo dire che i linguaggi di programmazione sono "basati" su determinate basi. In effetti, la tricotomia delle fondazioni "teoria dell'insieme - teoria dei tipi - teoria delle categorie" è di nuovo solo un'utile osservazione di alto livello che può essere resa matematicamente precisa in vari modi, ma non c'è nulla di necessario al riguardo. È un incidente storico.


"l'idea che il calcolo sia la ricerca di prove ". Sono confuso da questa affermazione. Sicuramente, la ricerca di prove è una forma di calcolo, ma non tutto il calcolo è ricerca di prove? Nel contesto di questa domanda, c'è anche la verifica delle prove, il controllo del tipo. Più in generale, semplicemente l'aggiunta di 5 + 3. Cosa intendi con questa affermazione?
user56834

6

questo è un argomento molto complesso e ci sono molti grandi libri sull'argomento, uno recente si chiama Cattedrale di Turings, origini dell'universo digitale e anche motori di logica, matematici e origini del computer .

i linguaggi informatici si sono evoluti nel corso di molti decenni, ma che ci crediate o no ci sono due linguaggi di programmazione originali che mostrano che la matematica e l'informatica sono strettamente intrecciate:

  • Il documento di Turing del 1936 sul problema dell'arresto . una costruzione teorica per risolvere il problema proposto da Hilbert all'inizio del secolo, il problema di Entscheidungs , ovvero una procedura automatizzata per risolvere i problemi matematici!

  • Il calcolo lambda di Church sviluppato allo stesso tempo sopravvive ancora in lingue come lisp e schema

ci sono due figure chiave che hanno attraversato i confini matematici e informatici con "linguaggi di programmazione":

  • la teoria dell'informazione introdotta da Shannon mostra le profonde connessioni tra matematica e informatica

  • un'altra figura chiave che attraversa la matematica e l'informatica è Von Neumann . ha inventato l'architettura von neumann di memorizzazione dei programmi in memoria.

"linguaggi di programmazione" ancora precedenti:

  • la parola inglese "computer" originariamente significava qualcosa di più simile a una "calcolatrice" che utilizzava operazioni matematiche sui numeri e il suo significato si è sostanzialmente spostato sul concetto di programmazione generale di oggi. quindi esiste una connessione tra i linguaggi di programmazione e i primi calcolatori.
  • le schede perforate utilizzate nei telai per tessitura tra la fine del XIX e l'inizio del XX secolo erano un "linguaggio di programmazione" per i motivi di tessitura. si noti che le schede perforate sono state utilizzate per programmare i mainframe molto negli anni '60. originariamente erano visti come "macchine calcolatrici" (usando la matematica!) non così moderni computer per scopi generici.
  • Babbage e Ada Lovelace svilupparono i primi rudimentali concetti di "linguaggi di programmazione" a metà del 1800 su un "motore di calcolo"
  • l'algebra booleana era originariamente un concetto puramente matematico inventato da Boole
  • l'antico abaco millenario per il calcolo matematico è visto come un precursore del computer moderno. ma si potrebbe dire che le operazioni per manipolarlo erano una sorta di "linguaggio di programmazione" (seguito dagli umani)

tuttavia, nei moderni linguaggi di programmazione man mano che l'astrazione è aumentata e ridimensionata, la chiara e diretta connessione con la matematica è in qualche modo diminuita nel corso dei decenni, ma sarà sempre abbastanza intrinseca e in qualche modo rafforzata. ad esempio linguaggi come Java con i suoi tipi rigorosi ha connessioni con la matematica e all'inizio della fine degli anni '90 i linguaggi informatici tradizionali (ad es. c ++, Java, Ruby ecc.) hanno iniziato a implementare esplicitamente molti oggetti matematici di livello superiore come quasi primitivi nel lingue come insiemi, alberi (ad esempio Btrees o hashmaps), ecc.

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.