Curry (informatica)
Curry linguaggio di programmazione | |
---|---|
Ultima versione | 3.6.0 (10 novembre 2023) |
Paradigmi | programmazione funzionale, programmazione a vincoli e programmazione logica |
Tipizzazione | statica, forte, dedotta |
Influenzato da | Haskell e Prolog |
Implementazione di riferimento | |
Licenza | BSD 3-clausole |
Sito web | www.curry-language.org/ |
Curry è un linguaggio di programmazione logico-funzionale derivato da Haskell e tuttora in fase di standardizzazione. Il linguaggio fu chiamato così in onore del logico statunitense Haskell Curry. Esso eredita la sintassi e le caratteristiche funzionali del padre, integrando alcuni componenti logiche che ne aumentano le potenzialità espressive.
Nel seguito si riportano solo le differenze rispetto ad Haskell.
Non-determinismo
[modifica | modifica wikitesto]Mentre nei linguaggi funzionali (o anche quelli imperativi) l'esecuzione di una funzione ritorna un solo preciso valore (si dice che la funzione è deterministica), in Curry una funzione può ritornare zero, uno o più valori (si dice che la funzione è non-deterministica). Il programma al termine restituisce non deterministicamente tutti i possibili risultati.
Ad esempio, considerando il seguente frammento Haskell,
listEmpty [] = True
listEmpty _ = False
l'esecuzione di listEmpty [] ritorna True in Haskell, in quanto essendo deterministico esegue la prima espressione capace di unificarsi con i parametri attuali. In Curry l'esecuzione ritorna entrambi i valori True e False.
In pratica quando più espressioni possono essere unificate con i parametri attuali (si dice che sono in overlap) il Curry le esegue tutte. Questa è la caratteristica che potenzialmente rende i programmi scritti in Haskell incompatibili con Curry.
In questo semplice esempio, per correggere il problema è necessario eliminare il non-determinismo rafforzando gli argomenti o aggiungendo delle guardie. Ad esempio,
listEmpty [] = True
listEmpty (_:_) = False
L'operatore ?
[modifica | modifica wikitesto]Un altro modo per generare il non determinismo è mediante l'operatore ?. Si tratta di semplice zucchero sintattico, in quanto
x = 1 ? 2 ? 3
equivale a
x = 1
x = 2
x = 3
L'operatore è definito molto semplicemente con
x ? _ = x
_ ? y = y
È possibile, ad esempio, ottenere non-deterministicamente tutti gli elementi di una lista nel modo seguente:
get (x:xs) = x ? get xs
Variabili logiche
[modifica | modifica wikitesto]Il Curry introduce la parola chiave free, che permette di dichiarare una variabile come "libera". Il motore interno della macchina astratta si preoccuperà di istanziare opportunamente tale variabile ritornando tutte le possibili soluzioni.
Ad esempio z && (y || not x) where x, y free restituisce tutte le possibilità:
x | y | risultato |
---|---|---|
True | True | True |
True | False | False |
False | False |
L'implementazione utilizza due approcci per la risoluzione delle variabili logiche: narrowing e residuation.
Vincoli
[modifica | modifica wikitesto]Voci correlate
[modifica | modifica wikitesto]Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Il sito ufficiale del linguaggio, su informatik.uni-kiel.de.
- (EN) Il compilatore di Curry implementato da Wolfgang Lux, su danae.uni-muenster.de. URL consultato il 31 dicembre 2009 (archiviato dall'url originale il 16 gennaio 2007).
Controllo di autorità | GND (DE) 1122372914 |
---|