Linguaggi di programmazione con funzioni canoniche


29

Esistono linguaggi di programmazione (funzionali?) In cui tutte le funzioni hanno una forma canonica? Cioè, ogni due funzioni che restituiscono gli stessi valori per tutto l'insieme di input è rappresentata allo stesso modo, ad esempio se f (x) restituisce x + 1 e g (x) restituisce x + 2, quindi f (f (x )) e g (x) genererebbero file eseguibili indistinguibili durante la compilazione del programma.

Forse ancora più importante, dove / come potrei trovare maggiori informazioni sulla rappresentazione canonica dei programmi (Googling "programmi di rappresentazione canonica" è stato meno che fruttuoso)? Sembra una domanda naturale da porre, e temo di non conoscere il termine corretto per quello che sto cercando. Sono curioso di sapere se è possibile che Turing sia completo e, in caso contrario, quanto sia espressivo un linguaggio di programmazione, pur mantenendo una tale proprietà.

Il mio background è piuttosto limitato, quindi preferirei fonti con meno prerequisiti, ma anche i riferimenti a fonti più avanzate potrebbero essere interessanti, in questo modo saprò su cosa voglio lavorare.

Risposte:


38

La misura in cui ciò è possibile è in realtà una grande questione aperta nella teoria del calcolo lambda. Ecco un breve riassunto di ciò che è noto:

  • Il calcolo lambda tipicamente semplice con unità, prodotti e spazio delle funzioni ha una semplice proprietà di forme canoniche. Due termini sono uguali se e solo se hanno la stessa forma beta-normale, eta-lunga. Anche il calcolo di queste forme normali è abbastanza semplice.

  • L'aggiunta di tipi di somma complica notevolmente le cose. Il problema dell'uguaglianza è ancora decidibile (la parola chiave da cercare è "uguaglianza coprodotta"), ma gli algoritmi noti funzionano per ragioni estremamente complicate e per quanto ne so non esiste un teorema di forma normale totalmente soddisfacente. Ecco i quattro approcci che conosco:

  • L'aggiunta di tipi illimitati, come i numeri naturali, rende il problema indecidibile. Fondamentalmente, ora puoi codificare il decimo problema di Hilbert.

  • L'aggiunta della ricorsione rende il problema indecidibile, perché avere forme normali rende l'uguaglianza decidibile e ciò consentirebbe di risolvere il problema di arresto.


Questo documento estende l'equivalenza con i coprodotti all'equivalenza con le somme ma non esiste una "singola" sintassi della forma canonica, si sceglie una "funzione di saturazione" che è abbastanza intelligente da rilevare quando i due termini che si stanno confrontando hanno dei subterm che si rivelano falsi. È molto simile a Ahmed-Licata-Harper in quanto entrambi usano la messa a fuoco.
Max New

Con solo unità, prodotti e funzioni, la cardinalità di tutto ciò che è possibile annotare è 1, mentre se si aggiungono somme, si ottengono improvvisamente molte cardinalità diverse (e si può fare un "calcolo utile"). Questi fatti sono correlati?
glaebhoerl,

1
BλX:B.λy:B.X eλX:B.λy:B.ysono forme normali diverse, ma (b) non influenza nessuno degli algoritmi che conosco.
Neel Krishnaswami,
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.