ウェブ技術 デジタルトランスフォーメーション技術 人工知能技術 自然言語処理技術 セマンティックウェブ技術 深層学習技術 オンライン学習&強化学習技術 チャットボットと質疑応答技術 ユーザーインターフェース技術 知識情報処理技術 推論技術 Clojure プログラミング
miniKanrenは前述のprologと同様な、論理プログラミング用の組み込みドメイン固有言語であり、コア言語は非常に単純で、3つの論理演算子と1つのインターフェイス演算子しかないシンプルな言語となる。実装されている言語はScheme, Racket, Clojure,Haskell, Python, JavaScript, Scala, Ruby, OCaml, and PHPと多様で、刊行されている図書「The Reasoned Schemer」ではSchemeでの紹介で、Clojureではcore.logicで miniKanrenとほぼ同様のDSLが提供されている。
core.logicでの前述のprologと同様なコード例を示す。まずleiningenのdependencies
[org.clojure/core.logic "1.0.0"]
を加えて
(ns logic-test.core
(:require [clojure.core.logic.pldb :as pldb]
[clojure.core.logic :refer :all]))
(pldb/db-rel shape f s) ;; 果物の形を定義
(pldb/db-rel color f c) ;; 果物の色を定義
(def facts1
(pldb/db
[shape :apple :sphere]
[shape :orange :sphere]
[shape :banana :stick]
[shape :strawberry :cone]
[color :apple :red]
[color :orange :orange]
[color :banana :yellow]
[color :strawberry :red]))
(pldb/with-db facts1
(run* [q] (shape q :sphere)))
;;-> (:orange :apple) 丸いものを出力
(pldb/with-db facts1
(run* [q]
(shape q :sphere)
(color q :red)))
;;->(:apple) 丸くて赤いものを出力
(pldb/with-db facts1
(run* [q]
(conde
[(shape q :sphere)]
[(color q :red)])))
;;->(:orange :apple :apple :strawbery) 丸いか赤いものを出力(appleは両方にかかるので2回でる)
となる。prologとの違いは条件系のマクロが多彩にあるところにある。
(conde ;; [場合分け] (The Reasoned Schemerのcondiにあたる) [a b c] ;; a b c が全て成り立つ場合と、 [d e f] ;; d e f が全て成り立つ場合と、 [g h i]) ;; g h i が全て成り立つ場合の結果をそれぞれ出す。 (condu ;; [選択] [a b c] ;; a b c が全て成り立つならこれを全体の結果とする。 [d e f] ;; 上が成り立たず、d e f が全て成り立つならこれを全体の結果とする。 [g h i]) ;; 上が成り立たず、g h i が全て成り立つならこれを全体の結果とする。 (conda ;; [条件分岐] [a b c] ;; a が成り立てば、 a b c の結果を全体の結果とする。 [d e f] ;; a が成り立たず、d が成り立てば、 d e f の結果を全体の結果とする。 [g h i]) ;; a と d が成り立たず、g が成り立てば、 g h i の結果を全体の結果とする。 (matche [a b c] ([?x ?x ?x] ...) ;; a, b, c が同じ場合にマッチ ([?x ?x _] ...) ;; a, b が同じ場合にマッチ ([_ ?x ?x] ...)) ;; b, c が同じ場合にマッチ (defne funcname [a b c] ...) ;; (defn funcname [a b c] (matche [a b c] ...)) と同じ ;; 下記は同じ関係にある ;; conde <--> condu <--> conda ;; matche <--> matchu <--> matcha ;; defne <--> defnu <--> defna
コメント
[…] 前述のprologやcore.logicでの推論は、後ろ向き推論と呼ばれるものとなる。後ろ向き推論とは、目標から副目標を導く推論となる。前提A=Bから目標A=Cを導く時「A=Cを証明するためには、A-BであるからB=Cを示せば良い」と副目標(B=C)を導くものとなる。 […]
[…] schema(LISPの派生語)による関数型プログラミングに関する図書であり、続編となる「The Seasoned Schemer」がある。さらに以前「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書である「The Reasoned Schemer」に続く。 […]
[…] schema(LISPの派生語)による関数型プログラミングに関する図書であり、前編となる「The Little Schemer」から続くものとなる。さらに以前「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書である「The Reasoned Schemer」に続くものでもある。 […]
[…] Schema(LISPの派生語)による関数型プログラミングに関する図書であり、以前述べた「The Little Shema」や「The Seasoned Schemer」の続編となる。「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書でもある。 […]
[…] core.logicとminiKanren 論理プログラミング […]