9

core.logicにクエリを入力してみました:

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

そしてプロンプトは言う、

error: lvar cannot be cast to a number

論理プログラミングとは何かを完全に誤解していない場合、core.logicを使用してこの問題を解決する方法はありますか?

4

3 に答える 3

7

アイデアについては、TheReasonedSchemerをお読みください。基本的に、論理プログラムで数学を行う方法は、リストベースの数値のエンコーディングを作成することです。これは、論理エンジンが必要に応じて拡張して試してみることができます。私はこの本を手元に持っていませんが、整数をビットのリストとしてエンコードしています。奇妙な方法で思い出せません。おそらく(1)0を表し、(0)違法であり、MSBはリストの最後にありますか?

とにかく、それは大変な作業です。David Nolenは最近、有限ドメインに関する何かをcore.logicに導入しました。それらがどのように機能するかはわかりませんが、問題の解決策として検討する数値の種類を指定できるようにすることで、問題を大幅に簡素化できると思います。

于 2012-09-25T23:44:11.353 に答える
6

私が見つけることができる限り、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
于 2012-09-25T23:20:05.303 に答える
4

現在の形式のcore.logicは、数値方程式ソルバーとして設計されていません。論理式や関係式を解くのに適しています。

基本的に、数学方程式を解くための2つの実用的なルートがあります。

  • 分析ソルバー-解は、上記のような2次方程式などの単純なケースでは非常に簡単に見つけることができますが、非常に急速に複雑になり始め、多くの方程式では不可能/実行不可能になります。これは巨大なオープンリサーチトピックです。
  • 数値ソルバー-これらの手法ははるかに一般的であり、ほとんどすべての種類の方程式で使用できます。ただし、結果は正確ではなく、方程式に「厄介な」特徴(不連続性、奇数勾配、極小値の複雑なセットなど)がある場合、アルゴリズムは正しい解を見つけることができない可能性があります。

方程式ソルバーは、数式の「規則」を理解するために特別なインテリジェンスを必要とします。たとえば、多項式の因数分解方法(分析解の場合)や導関数の推定方法(数値解の場合)などです。

興味深いかもしれないいくつかのリンク:

于 2012-09-27T03:21:14.030 に答える