問題タブ [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.
clojure - Clojure core.logic : nafc と Ground
Clojure の core.logic で単純なデータベースを表しています。
page(p) と link(p,q) の 2 つの述語があります。
page(p) は、p という wiki 内のページの存在を表します
link(p,q) は、ページ p にページ q へのリンクが含まれていることを表します。
私は今、このデータベースにクエリを実行して見つけようとしています
- a) 壊れたリンク (つまり、ページ q がないページ p のリンク)、および
- b) 孤立したページ (リンクのないページ)
これらのクエリの私のコードは次のとおりです。
壊れたリンクは期待どおりに機能していますが、孤児は :- シンボルのリストを表示しています。
これは nafc の制限と関係があると思います。ドキュメントによると:
実験的: 失敗制約としての否定。ゴール c への引数はすべてグラウンドでなければなりません。根拠のない引数がある場合、この制約の実行は遅れます。
そして、これらは「地面」ではないため「遅延」しています。
ここで地面が実際に何を意味するのか誰か説明できますか. 「自由変数がない」ことは知っていますが、このコンテキストでそれが何を意味するのかまだよくわかりません。
次に、この孤立したクエリをどのように記述すればよいですか?
scheme - miniKanren の「disj」が Scheme では機能するのに Racket では機能しないのはなぜですか?
私は Racket の minikanren ライブラリを使用していましたが、"disj" および "conj" 演算子を使用したいと考えていました。特に式がより複雑になった場合、conde 式を解析する必要はなく、読みやすさのために disj と conj のどちらを使用しているかをより明示的に宣言できるようにしたいと考えています。「The Reasoned Schemer」からソースをコピーしました。
これは最初の 2 つのケースで適切に機能します
ただし、複数のゴールを使用する場合は最初の結果のみを返します。
どうしてこれなの?