clojure論理プログラミングフレームワーク-core.logic入門
1099 ワード
詳細
core.logicはminiKanrenの実装である.miniKanrenの重要な概念の一つはgoalであり,goalに基づいて可能な結果を推測することがその核心概念である.
一、Core.logicの基本文法:
2、3つのコア操作記号:fresh,==,conde.
実はいくつかの最も簡単なコードで理解できます.
ここでfreshはletに相当し、ローカル変数を定義します.==論理が等しい.condeとcondは少し似ていて、1段の偽のコードで表します
三、高級なgoal:conso,resto,memberoをいくつかください.このうちエンディングバンドo,a,u,eはネーミング仕様であり,clojureが持参したcons,rest,memberと区別するためである.
core.logicはminiKanrenの実装である.miniKanrenの重要な概念の一つはgoalであり,goalに基づいて可能な結果を推測することがその核心概念である.
一、Core.logicの基本文法:
(run* [logic-variable]
logic-expressions)
;;
(run 1 [logic-variable]
logic-expressions)
2、3つのコア操作記号:fresh,==,conde.
実はいくつかの最も簡単なコードで理解できます.
user=>(run* [q] (fresh [a b ] (== a 1) (== b 2) (== q [a b])))
([1 2])
user=>(run* [q] (fresh [a b] (conde [(== 1 a)] [(== 2 b)]) (== q a) (== q b)))
(1 2)
ここでfreshはletに相当し、ローカル変数を定義します.==論理が等しい.condeとcondは少し似ていて、1段の偽のコードで表します
(run* [q]
(OR
[goal1 AND goal2 AND ...]
...))
三、高級なgoal:conso,resto,memberoをいくつかください.このうちエンディングバンドo,a,u,eはネーミング仕様であり,clojureが持参したcons,rest,memberと区別するためである.
user=> (run* [q] (membero q [1 2 3]))
(1 2 3)
user=> (run* [q] (resto q [1 2 3]))
((_0 1 2 3))
user=> (run* [q] (conso 1 [2 3] q))
((1 2 3))