Clojure の core.logic で単純なデータベースを表しています。
page(p) と link(p,q) の 2 つの述語があります。
page(p) は、p という wiki 内のページの存在を表します
link(p,q) は、ページ p にページ q へのリンクが含まれていることを表します。
私は今、このデータベースにクエリを実行して見つけようとしています
- a) 壊れたリンク (つまり、ページ q がないページ p のリンク)、および
- b) 孤立したページ (リンクのないページ)
これらのクエリの私のコードは次のとおりです。
(defn broken-links []
(pldb/with-db @facts
(logic/run* [p q]
(link p q)
(logic/nafc page q)
)))
(defn orphans []
(pldb/with-db @facts
(logic/run* [p q]
(logic/nafc link p q)
(page q)
)))
壊れたリンクは期待どおりに機能していますが、孤児は :- シンボルのリストを表示しています。
これは nafc の制限と関係があると思います。ドキュメントによると:
実験的: 失敗制約としての否定。ゴール c への引数はすべてグラウンドでなければなりません。根拠のない引数がある場合、この制約の実行は遅れます。
そして、これらは「地面」ではないため「遅延」しています。
ここで地面が実際に何を意味するのか誰か説明できますか. 「自由変数がない」ことは知っていますが、このコンテキストでそれが何を意味するのかまだよくわかりません。
次に、この孤立したクエリをどのように記述すればよいですか?