2013-07-16 22 views
9

Ich war ziemlich erstaunt über die Kraft von Prolog. Es hat einige Zeit gedauert, um den Kopf herumzukriegen, aber für mich schien es die coolste deklarative Sprache da draußen zu sein. Deshalb habe ich mich vor kurzem, nach zwei Jahren funktionaler Programmierung mit Scala, erneut mit der logischen Programmierung beschäftigt, um "mein Gehirn zu trainieren" oder besser für den tatsächlichen Gebrauch.Am nützlichsten und lehrreichsten funktional-Logik Sprache zu lernen

Die Kombination von funktionaler und logischer Programmierung scheint für mich attraktiv zu sein, Konzepte beider deklarativer Paradigmen zu lernen/zu festigen. Ich finde auch starke Typsysteme sehr nützlich und faszinierend.

Scala wirklich mit Interop geglänzt. Lasst uns die Räder nicht neu erfinden. Es sollte in der Lage sein, Code in einer anderen Hauptsprache aufzurufen und vorzugsweise auch aufrufbar zu sein. Aber es muss nicht Java sein. C oder Haskell wäre auch in Ordnung.

Also, welche sind die nützlichsten und aufschlussreichsten FLP-Sprachen heute, und was sind Ihre Meinungen und Empfehlungen zu ihnen?

Hier ist, was ich bisher gefunden:

  1. Mercury: behauptet, schnell zu sein, getippt stark Prolog. Rein deklarativ, aber keine logischen Variablen! Keine Einschränkung Programmierung? Scheint der am weitesten verbreitete FLP zu sein. Interop ??

  2. Curry: scheint vielversprechend und am weitesten fortgeschritten, aber im Moment ein wenig niedrig in der Dokumentation. Ist "experimentell" unreif/nicht bereit zu tauchen? nur basierend auf Haskell oder eigentlich gute Interop mit Haskell?

  3. Ciao: scheint viele Features zu bieten, die ich will, aber Stack Overflow scheint es überhaupt nicht zu wissen, obwohl es seit 1984 existiert? Was stimmt damit nicht? Interop?

  4. Drools (Java-Bibliothek/DSL): behauptet, es ermöglicht hybride Vorwärts- und Rückwärtsverkettung. Reifen. Direktes Interop mit Java/Scala, aber auf veränderbare Daten/Imperativ-Konstrukte angewiesen? Wie gut integriert es sich in funktionale JVM-Sprachen?

  5. miniKanren: Implementierungen existieren auf verschiedenen Plattformen. Wie ist Interop? Effizient?

  6. Lambda Prolog-Implementierungen wie zum Beispiel:

    1. Caledon: Könnte nett sein, aber schwere Theorie. Nützlichkeit? Effektive Interop mit Haskell? Dokumentation?

    2. Teyjus. ähnlich wie Caledon.

Gut, aber theoretisch liest und voreingenommen gegenüber Curry und befasst sich nicht mit praktischen Anliegen:

+0

Ich bin kein Experte, aber Curry scheint der vielversprechendste zu sein: es sieht aus wie Haskell, also liest es sich schöner als Prolog & Mercury (aber YMMV); Sie können "normale" reine Funktionen darin schreiben wie in Haskell; und Sie können Haskell davon anrufen. Alles in allem fühlt es sich einfach wie eine Haskell an, mit leistungsfähigen Logik- und Constraint-Programmierfunktionen (wie funktionalen Mustern), im Gegensatz zu einem völlig separaten Paradigma, an das man sich anpassen kann. –

Antwort

4

Ich kann Ihnen eine (leicht) voreingenommene Empfehlung für Curry geben.

Wie bereits erwähnt, Curry ist ziemlich fortgeschritten und, obwohl noch experimentell, definitiv bereit, verwendet zu werden. Es gibt bereits Anwendungen im produktiven Einsatz. Sie werden nicht viele Lesungen zu praktischen Aspekten finden, da Curry hauptsächlich eine Forschungssprache ist. Allerdings gibt es eine kleine, aber hilfreiche Community Lesen und Beantworten der Curry-Mailingliste:

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

Hinblick auf die Interoperabilität scheint es zwei Möglichkeiten zu sein: Das Münster Curry Compiler (MCC) unterstützt eine Teilmenge der Haskell ausländischen Funktionsschnittstelle zum Aufruf von C-Code.

Die neueste Curry-Implementierung, das Kiel Curry System 2 (KiCS2), kompiliert Curry nach Haskell. Es gibt eine schematische Möglichkeit, den Haskell-Code von Curry aus aufzurufen, wenn KiCS2 verwendet wird (siehe , Anhang D). Leider ist mir keine Möglichkeit bekannt, Curry-Code aus einer anderen Sprache aufzurufen.

+1

Danke für die Antwort, Curry war mein Favorit, klingt interessant, aber ich bin immer noch ein bisschen skeptisch, wenn das wirklich bereit für Nicht-bereits-Experten ist. Gibt es eine Chance, dass die Dokumentation für Nicht-Akademiker angepasst und ergänzt wird? Ich schaue in das Handbuch, aber es ist ziemlich lang. Weitere Einführungen, pragmatische Einstiegs-Tutorials und Tutorials? Dies wäre sehr hilfreich. – ib84

+1

Ich denke, Ihre Skepsis ist legitim. Es gibt sehr wenige Ressourcen für Anfänger. Ich denke, das Beste wäre, nach einem Haskell-Tutorial zu suchen, z. B. http://learnyouahaskell.com/, und dann die Unterschiede zu Curry zu betrachten. Wolfgang Jeltsch hat kürzlich einen Blogbeitrag über Curry veröffentlicht, der hilfreich sein könnte: http://jeltsch.wordpress.com/2013/04/27/a-taste-of-curry/ Und es gibt einige Beispielprogramme, die gefunden werden können auf der Curry-Webseite: http://www.informatik.uni-kiel.de/~curry/examples/ – Fabian

+1

Vielleicht möchten Sie sich einen Crash-Kurs zu Curry ansehen, der kürzlich von Sebastian Fischer gehalten wurde: http: //sebfisch.github.io/research/talks/CurryCrashCourse.pdf (die entsprechenden Programme: http://sebfisch.github.com/research/talks/CurryCrashCourse.zip) – ichistmeinname

0

Der am meisten nützliche Nexus von FP und LP war, soweit ich gefunden habe, Mercury + Erlang. Beide sind übrigens aus akademischer Sicht interessant (Sie müssen wirklich Ihre Grundlagen haben, wenn Sie gute Dinge mit beiden oder beides tun wollen), aber beide legen auch einen großen Wert darauf, Produkte auf den Markt zu bringen und sie im Gegensatz zu erhalten zu Kuriositäten.

Ich bin nicht wirklich sicher, ob das OP "nützlicher" größer als "lehrreich" gewichtet wurde, und ich weiß auch nicht, ob "nützlich" bedeutet "Code, der nützlich Probleme in der realen Welt löst". Geht man davon aus, dass dies hier zu den Kriterien gehört, ist Merkur + Erlang bei Weitem die interessanteste Kombination von LP und FP, die es derzeit zu geben gilt.