41

Ich arbeite an einer Anwendung in Java, die einige komplexe logische Regelabzüge als Teil ihrer Funktionalität tun muss. Ich möchte meine Logikableitungen in Prolog oder einer anderen Logik-/Constraint-Programmiersprache anstelle von Java codieren, da ich glaube, dass der resultierende Code wesentlich einfacher und wartungsfreundlicher sein wird.Embedded Prolog Interpreter/Compiler für Java

Ich googelte für eingebettete Java-Implementierungen auf Prolog und fand eine Anzahl von ihnen, jede mit sehr wenig Dokumentation. Meine (bescheiden) Auswahlkriterien sind:

  • in Java embeddable sein sollte (zB mit meinem Java-Paket werden kann, anstatt dass irgendwelche nativen Installationen auf externe Programme gebündelt)
  • einfache Schnittstelle von Java verwenden (für Initiieren Abzüge, die Kontrolle Ergebnisse und das Hinzufügen von Regeln)
  • kommen mit mindestens einige Beispiele, wie man es verwenden
  • nicht unbedingt Prolog sein müssen, aber auch andere Logik/Einschränkungs Programmiersprachen mit den oben genannten Kriterien passen würde meine Bedürfnisse auch.

Welche Möglichkeiten habe ich und welche Vor- und Nachteile haben sie?

+1

Ich habe noch nie einen Prolog-in-Java verwendet, aber eine andere Möglichkeit ist, Ihre eigenen zu schreiben. Ich kenne mindestens 2 Lisp-Bücher, die das auf nicht zu vielen Seiten machen (On Lisp und PAIP), also kann es auch in Java nicht so hart sein. – Ken

+4

Sicher, Sie können eine Spielzeug Logik Programmiersprache in ein paar Seiten Code, aber ich bin auf der Suche nach etwas robuster. Jetzt können Sie ein Spielzeug lispeln in ein paar Seiten Code auch, so denke ich, ich brauche nur vier Seiten und ich werde gut gehen :-) – Sami

+0

Das sind einige geladene Worte, die Sie herumwerfen! Ich bin mir nicht sicher, was eine kleine Prolog-Implementierung zu einem "Spielzeug" macht oder auf welche Weise sie nicht "robust" genug ist. Eine von Norvigs Lektionen war "Prolog ist Lisp in den Hauptpunkten ähnlich"; Ein kleines Prolog-on-Lisp ist also kein "Spielzeug", sondern eine andere Benutzeroberfläche für Ihren Compiler. In Java wird es nicht so viel Spaß machen, aber ich glaube nicht, dass er das mit Makros gemacht hat. – Ken

Antwort

21

Die folgenden Versionen von Prolog verfügen gemäß Wikipedia über Java-Schnittstellen. Ich habe für sie zu den wichtigsten Seiten verlinkt:

Viel Glück bei Ihrer Suche!

+0

TuProlog scheint die einzige zu sein, bei der keine externen Anwendungen installiert werden müssen. Ich werde das untersuchen. Vielen Dank. – Sami

+0

Ich mag TuProlog sehr. Dokumentation ist vielleicht nicht so heiß, aber die Implementierung ist ziemlich nett und, wie Sie sagten, es erfordert keine Vermischung. –

+2

Wikipedia listet viel mehr Prolog-Systeme mit Java-Schnittstelle auf: JIProlog, Jekejeke Prolog, JLog, jTrolog, XSB Prolog, YAP Prolog. –

7

SWI-Prolog Eine sehr populäre Implementierung scheint eine Java interface as does SiCStus zu haben, die einfacher wäre als die Verwendung von JNI, um eine Instanz in Ihrem Java-Prozess zu instanziieren. Ich habe beide schon vor einiger Zeit benutzt und empfehle sie. Meine Präferenz wäre SWI, da es open-source ist und aus meiner Erfahrung die de facto Implementierung.

Die Dokumentation für die SWI-Java-Schnittstelle scheint angemessen zu sein, und der Einbettungsprozess ist ziemlich einfach.

+1

SWI Prolog und SiCStus erfordern eine native Installation, um von Java aus verwendet werden zu können. – Sami

+2

Ich bin sicher, Sie können die ausführbaren Dateien oder DLLs in Ihren JAR-Dateien enthalten. SWI startete als eine Unix-Anwendung, also würde ich annehmen, dass es Dinge nicht tut, die von echten Installern benötigt werden - d. H. Registrierungsänderungen vornehmen oder com-Objekte installieren. –

3

Amzi prolog gibt es schon seit einiger Zeit. Ich habe es kurz benutzt, aber nicht die Embedded-Version. Sie haben jedoch eine gute Dokumentation und es kann Support gekauft werden. Sie haben Java-Port, so dass es einen Blick wert sein könnte.

5

Ich musste das gleiche vor 2 Jahren tun. Ich habe SWI interface which is called JPL verwendet. Sie können eine Prolog-Datei laden, auf ihr setzen und danach abfragen. Es erfordert eine Installation von SWI Prolog, aber das ist überhaupt kein Problem. SWI Prolog ist available for many platforms.

Ich habe auch Alternativen ausprobiert, die zu 100% in Java implementiert waren und keine externen Programme benötigten. Alle waren buggy oder schwer zu gebrauchen. Verschwende keine Zeit.

+1

und funktioniert auch für YAP Prolog – Sergio

1

Prova 3.0 http://www.prova.ws nähert sich der Fertigstellung. Es ist jedoch nicht nur ein weiterer Prolog, sondern eine Mischung aus Programmierstilen, insbesondere nützlich für die einfache bidirektionale Java-Integration, reaktive Agentenprogrammierung, Integration mit ESBs, Workflow-Logik und Ereignisverarbeitung. Diese Version ist eine komplette Neuschreibung von Null, daher fehlen einige ältere Funktionen, wie die OWL-Integration, die aber in der nächsten Revision zurückkehren müssen.

1

Es gibt Mini-Kanren for Scala, die Ihnen eine native JVM-Implementierung einer schlanken, hackbaren, modernen Horn-Klausel-basierten Logik-Programmiersprache bietet.

2

LPA funktioniert die LPA Intelligence Server als eine Möglichkeit bieten, die Einbettung seinen Prolog-Engine in einer ganzen Reihe von Mainstream-Sprachen wie Java, .Net etc.

Clive

http://www.lpa.co.uk/int.htm

1

Eine weitere lohnende Option I vor kurzem kam JSetL. Es ist kein Prolog, sondern eine Constraint-Programmierbibliothek für Java, mit Unterstützung für Logikvariablen, Vereinheitlichung, Constraint-Lösung und Nicht-Determinismus.

http://prmat.math.unipr.it/~gianfr/JSetL/index.html

2

Sie können auch einen Blick auf the Prol engine werfen, die ich erstellt habe. Es erlaubt Ihnen, Prolog in Ihre Java-Programme einzubetten (aber es ist nicht sehr schnell)

2

Zwei kommerzielle Prologs in Java geschrieben: Minerva von IF Computer Japan und Jekejeke. Beide sind sehr nah an ISO.

2

Clojure ist eine JVM-basierte Lisp-ähnliche Sprache mit einer Bibliothek (core.logic), die Logik- und Constraint-basierte Programmierung unterstützt. Clojure hat auch eine große Anzahl von Einrichtungen zum Erzeugen von Java-Klassen und working with java code, so dass Interoperabilität zwischen den beiden Sprachen trivial ist.