問題タブ [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.
functional-programming - ロジック プログラミングの最適な用途は何ですか?
ロジック プログラミングとは、宣言型プログラミング言語のサブパラダイムを意味します。この質問を「if-then-else で解決できる問題は何ですか?」と混同しないでください。
Prolog のような言語は非常に魅力的であり、学習のために学習する価値はありますが、現実世界の問題のどのクラスがそのような言語で最もよく表現され、解決されるのか疑問に思う必要があります。もっと良い言語はありますか?論理プログラミングは、より流行のプログラミング言語で別の名前で存在しますか? 答えの冷笑的なバージョンはPython Paradoxの変形ですか?
clojure - mini-kanren cond-a cond-uとcond-eの違いは何ですか?
私はclojureでミニかんれんの実装を使おうとしました。しかし、cond-acond-uとcond-eの違いを理解するのに苦労しています。cond-eについてはかなりはっきりしているようですが、cond-aとcond-uの理解はひどく悪いです。
cond-eは一連の目標を取得し、それぞれを試行します...つまり、成功するすべてのブランチを試行します。
それどころか、cond-aとcond-uは、最初の述語が成功するブランチにコミットし、cond-aは、その後に成功する可能性のあるすべての統合を返します。cond-uは最初の成功した統合のみを返しますが...しかし、私がそれを使用すると、この理解は正しくないようです。誰かが私がこの理解を明確にするのを手伝ってもらえますか?
clojure - core.logicで「外部結合」をシミュレートする方法は?
私はcore.logicで遊んで始めたばかりで、それに取り組むために、現在専門的に取り組んでいる問題に似た単純なものを実装しようとしています。しかし、問題の一部が私を困惑させました...
例を単純化すると、アイテムのカタログがあり、そのうちのいくつかは特定の国でしか入手できず、一部は特定の国では入手できないとします。アイテムのリストと例外を次のように指定できるようにしたいと思います。
可能であれば、制限のあるアイテムのセットは比較的小さいため、すべての国で許可されていることを指定したくありません。また、特定のアイテムの許可/除外を 1 つの変更で行えるようにしたいと考えています。国。
次の制約を使用して、国のアイテム/色のリストを提供するルールを作成するにはどうすればよいですか:
- アイテムはアイテムのリストにある必要があります
- 国/アイテムは「許可されていない」リストに含まれていてはなりません
- また:
- そのアイテムの制限対象リストに国がありません
- 国/アイテムのペアは制限リストに含まれています
これを行う方法はありますか?私は物事を完全に間違った方法で考えていますか?
clojure - miniKanrenの名前が常に`o`で終わるのはなぜですか?
すべてのminiKanren関係は文字で終わりo
ます。これの動機は何ですか?Clojurecore.logicライブラリもこれを実行していることがわかります。
clojure - Core.logicの簡潔な説明
ClojureのCore.logicを使用したい。しかし、それがどのように機能するかも理解したいと思います。どこかに簡潔な説明がありますか?(メタサーキュラーエバリュエーターを実装するようなものですか?)
ありがとう!
clojure - mini-Kanren、core.logic、clojure: 論理的なスキーム演習 60
これは宿題ではありません。解決策はすでにテキストに含まれています。私はちょうど解決策を理解できませんでした。
問題
正解
私の信じた解決策
私の混乱
どうやら「a (== true q)」行は実行されません。なぜなら、b だけがゴールだからです。これは私を混乱させます。これまでのロジック プログラミングに対する私のメンタル モデルは次のとおりです。
- q へのすべての可能な代入を考慮する
プログラム全体をなんとか通過したものを出力する
したがって、「a (== true q)」は q = true を強制し、「b (== false q)」の行を満たすことができなくなります。
ただし、明らかに「目標を計算するために必要なもの」のみが実行されます。どうしたの?core.logic / mini-kanren の正しいメンタル実行モデルとは?
ありがとう
(ちなみに、mini-karen + core.logic は互いに同意するので、私は明らかに間違っています。私が間違っていることを理解したいだけです。)
clojure - conda、condi、conde、condu
ReasonedSchemerを読んでいます。
私はどのように機能するかについていくつかの直感を持っていますconde
。
しかし、私は///が何をするかについての正式な定義を見つけることができconde
ませconda
ん。condu
condi
https://www.cs.indiana.edu/~webyrd/を知っていますが、定義ではなく例があるようです。
conde
、、、の正式な定義はどこかconda
にありますか?condi
condu
clojure - core.logic が支配するアリーナ [ソフト]
コミュニティ ウィキ
評判ポイントなどどうでもいいので、いい回答が欲しいだけです。この質問はコミュニティ ウィキとして気軽にコメントしてください。
環境
私は The Reasoned Schemer に取り組んでおり、次の観察結果を見つけました。
- 論理プログラミングはとても面白いです。
- ロジックプログラミングは直観に反することがあります
ロジックプログラミングはしばしば「非効率的」です (少なくとも私が書いたコードは)。
から行っているようです
- アセンブリ -> C++、私は自分のマシン コードを書くという制御を「放棄」します
- C++ -> Clojure、メモリ管理の制御を放棄
- Clojure -> core.logic/prolog/minikanren、計算方法を部分的に制御できなくなりました
質問:
(1) 論理パズルの解決と (2) 型推論の他に、論理プログラミングが支配する問題の領域は何ですか?
ありがとう!
clojure - minikanren / clojure-core.logicで可能な値のセットから選択する方法は?
n
変数が一連の値とは異なる値を取るという制約をどのように表現すればよいn
ですか?
たとえば、フォームの式を検索したいかもしれません
op1 と op2 はそれぞれ* + - / exp
?
a
から値を取得する方法を確認できます(たとえば1 2 3
、を使用して)。と についてもconde
同じです。しかし、どうすれば平等を除外できますか? すべての組み合わせをループして明示的に除外する必要がありますか?b
c
明らかに、「手動で」除外を行うことができますが、より良い(より効率的な)方法、またはこのようなものを含むサポートライブラリがあるかどうか疑問に思っています(線形プログラミングライブラリの経験がもう少しあり、通常はこれらの種類の一般的なケースに対処する一連のヘルパー関数)。
そして、いくつかの値が特定の回数出現する可能性がある場合にそれを一般化することは、ドラッグになるように思えます...
そして今考えてみると、どのように最大値を検索するのでしょうか? これに関する良い本やノートはありますか?!
[私は clojure を使用していますが、私の理解では、clojure-core.logic と minikanren はほとんど同じです]
更新:この質問を読んで良い紹介を探している人は、コメントで以下に言及しているAlvisの論文をチェックしてください。
clojure - core.logic を使用して一意の DAG 親を一覧表示する
これは、(願わくば) 単純な論理プログラムで、私がしばらくの間行き詰っています。
親ノードのリストを生成するときに、core.logic のエッジ リレーションによって表される DAG があります。グラフに「ダイヤモンド シェイプ」があると、重複が発生します (ここではサイクルについて話しているわけではありません)。
この場合、親の個別のリストを生成する方法はありますか (parento を書き直すなど)?
(:b :c :a) を取得したいのですが、run* ステートメント内で実行したいと考えています (つまり、結果をセットにラップすることは、私が目指していることではありません)。
また、「^:tabled」をparentoに追加するとうまくいくようですが、tabledが導入するメモ化はしたくありません。