2013-07-16 12 views
9

Sono rimasto molto sorpreso dalla potenza di Prolog. Ci è voluto un po 'di tempo per girare la testa, ma per me sembrava essere la lingua dichiarativa più bella là fuori. Ecco perché recentemente, dopo due anni di programmazione funzionale con Scala, ho deciso di dare di nuovo un'occhiata alla programmazione logica, per "allenare il mio cervello" o meglio per l'uso effettivo.La maggior parte del linguaggio logico-funzionale più utile e istruttivo da apprendere

La combinazione di programmazione logica e funzionale mi sembra interessante per apprendere/consolidare i concetti di entrambi i paradigmi dichiarativi. Trovo anche che i sistemi di tipo forte siano molto utili e affascinanti.

Scala davvero splenduto con interop. Non reinventiamo le ruote. Dovrebbe essere in grado di chiamare il codice in un'altra lingua principale, e preferibile anche essere chiamabile. Ma non deve essere Java. C o Haskell andrebbero bene anche loro.

Quindi, quali sono oggi i linguaggi FLP più utili e illuminanti e quali sono le vostre opinioni e raccomandazioni su di essi?

Ecco quello che ho trovato finora:

  1. Mercury: sostiene di essere veloce, fortemente tipizzato Prolog. Puro dichiarativo, ma nessuna variabile logica! Nessuna programmazione di vincoli? Sembra essere il FLP più utilizzato. Interop ??

  2. Curry: sembra promettente e il più avanzato, ma in questo momento un po 'basso sulla documentazione. "Sperimentale" significa immaturo/non pronto a tuffarsi? basato semplicemente su Haskell o in realtà una buona interazione con Haskell?

  3. Ciao: sembra fornire molte funzionalità che desidero, ma Stack Overflow non sembra nemmeno saperlo affatto, anche se esiste dal 1984? Che cosa c'è che non va? Interop?

  4. drools (libreria java/DSL): afferma che consente il concatenamento ibrido avanti e indietro. Maturo. Interop diretto con Java/Scala, ma basandosi su dati mutabili/costrutti imperativi? Quanto bene si integra con le lingue JVM funzionali?

  5. miniKanren: esistono implementazioni su diverse piattaforme. Come va l'interoperabilità? Efficiente?

  6. Lambda Prolog implementazioni quali:

    1. Caledon: potrebbe essere bello, ma la teoria pesante. Utilità? Interop efficace con Haskell? Documentazione?

    2. Teyjus. simile a Caledon.

buone ma teoriche legge e sbilanciata verso curry e non affrontare problemi pratici:

+0

Non sono esperto ma Curry sembra essere il più promettente: assomiglia ad Haskell quindi è più bello di Prolog & Mercury (ma YMMV); puoi scrivere funzioni pure "regolari" come in Haskell; e puoi chiamare Haskell da esso. - Tutto sommato, sembra semplicemente un Haskell con potenti funzioni di programmazione di vincoli e logica (come i modelli funzionali) aggiunto, al contrario di un paradigma completamente separato per adattarsi. –

risposta

4

Posso darti una raccomandazione (leggermente) parziale per Curry.

Come già accennato, Curry è abbastanza avanzato e, pur essendo ancora sperimentale, sicuramente pronto per essere utilizzato. Esistono già applicazioni in uso produttivo. Non troverai molte letture sugli aspetti pratici poiché Curry è principalmente un linguaggio di ricerca. Tuttavia, v'è una piccola ma utile lettura comunitaria e di rispondere alla Mailing List Curry:

http://www-ps.informatik.uni-kiel.de/currywiki/documentation/mailing

Per quanto riguarda l'interoperabilità, sembra che ci siano due scelte: Il Münster Curry Compiler (MCC) supporta un sottoinsieme del Haskell straniera interfaccia di funzione per chiamare il codice C.

L'implementazione di Curry più recente, Kiel Curry System 2 (KiCS2), compila Curry con Haskell. Esiste un modo schematico per chiamare il codice Haskell da Curry quando si utilizza KiCS2 (vedere KiCS2 Manual, Appendice D). Purtroppo, non sono a conoscenza di un modo per chiamare il codice Curry da un'altra lingua.

+1

Grazie per la risposta, curry era il mio preferito, sembra interessante, ma sono ancora un po 'scettico se questo è davvero pronto per i non-già-esperti. C'è qualche possibilità che la documentazione possa essere adattata e completata per i non accademici? Sto osservando il manuale, ma è piuttosto lungo. Qualche altra introduzione, pragmatico avvio e tutorial? Questo sarebbe molto utile. – ib84

+1

Penso che il tuo scetticismo sia legittimo. Ci sono pochissime risorse destinate ai principianti. Penso che la cosa migliore sarebbe cercare un tutorial Haskell, ad es. Http://learnyouahaskell.com/ e quindi esaminare le differenze con Curry. Wolfgang Jeltsch ha recentemente pubblicato un post sul blog su Curry che potrebbe essere utile: http://jeltsch.wordpress.com/2013/04/27/a-taste-of-curry/ E ci sono alcuni programmi di esempio che possono essere trovati alla pagina web Curry: http://www.informatik.uni-kiel.de/~curry/examples/ – Fabian

+1

Forse si vuole dare un'occhiata a un corso intensivo su Curry che è stato recentemente tenuto da Sebastian Fischer: http: //sebfisch.github.io/research/talks/CurryCrashCourse.pdf (i programmi corrispondenti: http://sebfisch.github.com/research/talks/CurryCrashCourse.zip) – ichistmeinname

0

Il nesso più utile di FP e LP è stato, per quanto ho trovato, Mercury + Erlang. Entrambe sono incidentalmente interessanti da un punto di vista accademico (hai davvero bisogno di avere i tuoi fondamentali se vuoi fare del bene con entrambi, o entrambi), ma entrambi danno anche un premio nell'ottenere prodotti sul mercato e mantenerli al contrario essere stranezze di ricerca.

Non sono sicuro che l'OP pesasse "utile" più di "istruttivo", e non so nemmeno se "utile" significhi "codice che risolva utilmente problemi nel mondo reale". Ma supponendo che questo sia parte dei criteri qui, Mercury + Erlang è di gran lunga la combinazione più interessante di LP e FP che si possano avere al momento.