問題タブ [minikanren]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
prolog - プロローグのマッチング vs ミニカンレンの統一
Prolog - Programming for Artificial Intelligence で、Bratko は 58 ページで次のように述べています。
「Prolog でのマッチングは、論理の統一と呼ばれるものに対応します。ただし、ほとんどの Prolog システムでは効率上の理由から、マッチングは統一に正確に対応しない方法で実装されるため、統一という言葉は避けます。適切な統一には、そのようにする必要があります。 -呼び出された発生チェック: 与えられた変数が与えられた用語で発生しますか?発生チェックはマッチングを非効率にします."
私の質問は、miniKanren での統合がこの効率の低下に悩まされているかどうか、またはこの問題はどのように解決されているかということです。
prolog - 論理プログラミングで繰り返される更新をどのように処理すればよいですか?
特に、次のタイプの問題を解決するための最良のアプローチを決定しようとしています。
私が興味を持っている例は、Mitchell の機械学習の本にある find-s アルゴリズムで、4 つのトレーニング例に適用されます。
基本的な考え方は、各トレーニング例 x と仮説 h について、h' を決定することです。これは、x をより一般的にすることによって x を組み込む場合に当てはまります。トレーニング セット内の x ごとに h を h' にマッピングする必要があります。私が抱えている問題は、論理プログラミング言語でこれに最もよく取り組む方法です。私はスキームに大まかにプロローグを埋め込んだミニカンレンを使用しています。
各 h' を計算したら、次に設定する必要があります。それをグローバル変数 h に代入し、次のトレーニング例 x に進みます。以下のコードは、プログラムの主要部分です。
h はグローバル変数であり、seto は h0 から次に計算された仮説である h1 で h を変更し、find-s アルゴリズム (find-so) を使用して x のトレーニング例を作成します。
プロローグでは、各トレーニング例 X (前のものを上書き) の後にassert('hypothesis'(H))を呼び出し、すべてのトレーニング例が終了した後にrettract('hypothesis'(H))を呼び出すことと同等です (私が思うに)。適用。
繰り返しますが、私の質問は、これがこの種の問題を解決するための (副作用による) 最良のアプローチであるかどうかです。
編集: @mat の回答を彼のコメントと共に受け入れました。要約すると、トレーニング例をリストとして扱い、空のリストに到達するまでそのリストで前方再帰を使用する必要がありました。私が立ち往生していたのは、空になるまで繰り返すことができるリストにそれらを含めるのではなく、次の仮説を見つけることと一緒にバックトラックの一部としてトレーニングの例を持っていたことでした.
clojure - clojureのcore.logicは解決にどのアルゴリズムを使用しますか?
ウィキペディアによると、プロローグはSLD Resolutionを使用しています。core.logic で解決を推進する主なアルゴリズムは何ですか?
clojure - MiniKanren には「not」演算子がありますか?
MiniKanren には「not」演算子がありますか?
たとえば、Prolog の
a
が真であり、そうでない場合b
は真ですc
(Prolog では否定を失敗として使用します。つまり 、証明できないnot(c)
場合は証明済みと見なされます)c
Prolognot
は、地面以外の表現でも機能します。