core.logicにクエリを入力してみました:
(run* [q] (== 0 (+ (* q q) (* 4 q) 4)))
そしてプロンプトは言う、
error: lvar cannot be cast to a number
論理プログラミングとは何かを完全に誤解していない場合、core.logicを使用してこの問題を解決する方法はありますか?
core.logicにクエリを入力してみました:
(run* [q] (== 0 (+ (* q q) (* 4 q) 4)))
そしてプロンプトは言う、
error: lvar cannot be cast to a number
論理プログラミングとは何かを完全に誤解していない場合、core.logicを使用してこの問題を解決する方法はありますか?
アイデアについては、TheReasonedSchemerをお読みください。基本的に、論理プログラムで数学を行う方法は、リストベースの数値のエンコーディングを作成することです。これは、論理エンジンが必要に応じて拡張して試してみることができます。私はこの本を手元に持っていませんが、整数をビットのリストとしてエンコードしています。奇妙な方法で思い出せません。おそらく(1)
0を表し、(0)
違法であり、MSBはリストの最後にありますか?
とにかく、それは大変な作業です。David Nolenは最近、有限ドメインに関する何かをcore.logicに導入しました。それらがどのように機能するかはわかりませんが、問題の解決策として検討する数値の種類を指定できるようにすることで、問題を大幅に簡素化できると思います。
私が見つけることができる限り、core.logicはこの方程式を解くための代数を行うことができません。LVar
基本的な数学を行うことができますが、数学関数はこれらを操作できないため、その数学への入力はsではなく実際の値である必要があります。
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
現在の形式のcore.logicは、数値方程式ソルバーとして設計されていません。論理式や関係式を解くのに適しています。
基本的に、数学方程式を解くための2つの実用的なルートがあります。
方程式ソルバーは、数式の「規則」を理解するために特別なインテリジェンスを必要とします。たとえば、多項式の因数分解方法(分析解の場合)や導関数の推定方法(数値解の場合)などです。
興味深いかもしれないいくつかのリンク: