2012-09-25 17 views
8

我試着在core.logic鍵入查詢:如何使用解決數學方程式core.logic

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

和提示說,

error: lvar cannot be cast to a number 

倘若我沒有完全誤解了邏輯編程的內容,有沒有辦法用core.logic來解決這個問題?

回答

5

只要我能找到core.logic不能做代數來解決這個方程。它可以做基本的數學雖然投入到數學必須是實際值不LVar是因爲數學函數不能在這些操作:

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

作品當x有一個明確的值,當x不失敗:

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

你應該閱讀Reasoned Schemer的想法。基本上,在邏輯程序中進行數學運算的方法是創建數字的基於列表的編碼,邏輯引擎可以根據需要進行增長以進行嘗試。我沒有這本書的方便,但它編碼整數作爲一個位列表,以某種奇怪的方式,我不記得:也許(1)代表0,(0)是非法的,MSB是最後的名單?

無論如何,這是很多工作; David Nolen最近還介紹了一些關於有限域的內容到core.logic中。我不知道這些是如何工作的,但我認爲他們可以通過讓您指定哪種數字來解決您的問題,從而爲您簡化問題。

+0

我發現了一個網頁https://github.com/frenchy64/Logic-Starter/wiki /算術通過它 – zcaudate

+0

我猜算術不是真正的core.logic atm域 – zcaudate

2

core.logic它的當前形式並非設計爲數值方程求解器 - 它更適合解決邏輯和關係表達式。

你基本上解決數學方程兩個實際路線:

  • 分析求解 - 解決方案可以很容易地進行簡單的情況下可以找到例如二次方程就像你上面所說的一樣,但是開始變得越來越複雜,很快就變得越來越複雜,然後對許多方程變得不可能或不可行。這是一個巨大的開放性研究課題。
  • 數值求解器 - 這些技術更通用,可用於幾乎任何類型的方程。然而,結果並不準確,算法可能無法找到正確的解決方案(S)如果方程「討厭」的特點(不連續,奇梯度,復臺局部極小等)

方程求解器需要了解數學方程的「規則」的特殊情報,例如如何對多項式表達式進行分解(對於分析解)或如何估計導數(對於數值解)。

一些鏈接,可能是有趣: