clojure論理プログラミングフレームワーク-core.logic入門


詳細
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))