2012-09-25 35 views
8

Ich habe versucht, in einer Abfrage in core.logic eingeben:Wie mathematische Gleichungen lösen mit core.logic

(run* [q] (== 0 (+ (* q q) (* 4 q) 4))) 

Und die Aufforderung sagt

error: lvar cannot be cast to a number 

Für den Fall, dass ich nicht völlig falsch verstanden, worum es bei der Logikprogrammierung geht, gibt es Möglichkeiten, dieses Problem mit core.logic zu lösen?

Antwort

5

So weit ich finden kann core.logic kann die Algebra tun, um diese Gleichung zu lösen. Es kann grundlegende mathematische tun, obwohl die Eingänge zu diesem Mathe brauchen Istwerten nicht LVar s sein, weil die mathematischen Funktionen nicht auf diese arbeiten kann:

user> (run* [q] 
    (fresh [x] 
     (== x 1) 
     (project [x] (== q (+ (* x x) 4))))) 
(5) 

funktioniert, wenn x einen klaren Mehrwert hat und schlägt fehl, wenn x nicht :

user> (run* [q] 
    (fresh [x] 
     (== x q) 
     (project [x] (== q (+ (* x x) 4))))) 
ClassCastException clojure.core.logic.LVar cannot be cast to java.lang.Number 
5

Sie sollten The Reasoned Schemer für Ideen lesen. Im Grunde ist die Art und Weise, wie man Mathematik in einem Logikprogramm ausführt, listenbasierte Codierungen von Zahlen, die die Logikmaschine nach Bedarf erweitern kann, um Dinge auszuprobieren. Ich habe nicht das Buch praktisch, aber es kodiert ganze Zahlen als eine Liste von Bits, auf eine seltsame Art und Weise kann ich nicht recht erinnern: vielleicht (1) 0, (0) illegal ist, und das MSB in der Liste zuletzt?

Wie auch immer, das ist eine Menge Arbeit; David Nolen hat kürzlich auch etwas über finite Domains in core.logic eingeführt. Ich weiß nicht, wie diese funktionieren, aber ich denke, sie vereinfachen das Problem sehr, indem Sie angeben, welche Arten von Zahlen Sie als Lösung für Ihr Problem betrachten.

+0

ich eine Seite gefunden https://github.com/frenchy64/Logic-Starter/wiki/Arithmetik, die durch sie geht – zcaudate

+0

Ich denke, Arithmetik ist nicht wirklich die Domäne für core.logic atm – zcaudate

2

core.logic in seiner aktuellen Form ist nicht als numerische Gleichung Löser entwickelt - es ist besser geeignet für die Lösung von logischen und relationalen Ausdrücke.

Sie haben grundsätzlich zwei praktische Wege zur Lösung von mathematischen Gleichungen:

  • Analytical Solver - Lösungen lassen sich ganz einfach für einfache Fälle zum Beispiel gefunden werden quadratische Gleichungen wie die, die Sie oben haben, aber sie werden immer schneller komplex und werden dann für viele Gleichungen unmöglich/undurchführbar. Dies ist ein großes offenes Forschungsthema.
  • Numerische Löser - diese Techniken sind viel allgemeiner und kann auf so ziemlich jede Art von Gleichung verwendet werden. Allerdings sind die Ergebnisse nicht exakt und die Algorithmen können die richtige Lösung (en) nicht finden, wenn die Gleichung „nasty“ -Funktionen (Diskontinuitäten, ungeradee Steigungen, komplexe Sätze von lokalen Minima usw.)

Equation Solver hat erfordert besondere Intelligenz zum Verständnis der "Regeln" mathematischer Gleichungen, z wie man polynomische Ausdrücke faktorisiert (für analytische Lösungen) oder wie man eine Ableitung schätzt (für numerische Lösungen).

Einige Links, die interessant sein können:

Verwandte Themen