Clojure core.logicとminiKanren

ウェブ技術 デジタルトランスフォーメーション技術 人工知能技術 自然言語処理技術 セマンティックウェブ技術 深層学習技術 オンライン学習&強化学習技術 チャットボットと質疑応答技術 ユーザーインターフェース技術 知識情報処理技術 推論技術  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

 

コメント

  1. […] 前述のprologやcore.logicでの推論は、後ろ向き推論と呼ばれるものとなる。後ろ向き推論とは、目標から副目標を導く推論となる。前提A=Bから目標A=Cを導く時「A=Cを証明するためには、A-BであるからB=Cを示せば良い」と副目標(B=C)を導くものとなる。 […]

  2. […] schema(LISPの派生語)による関数型プログラミングに関する図書であり、続編となる「The Seasoned Schemer」がある。さらに以前「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書である「The Reasoned Schemer」に続く。 […]

  3. […] schema(LISPの派生語)による関数型プログラミングに関する図書であり、前編となる「The Little Schemer」から続くものとなる。さらに以前「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書である「The Reasoned Schemer」に続くものでもある。 […]

  4. […] Schema(LISPの派生語)による関数型プログラミングに関する図書であり、以前述べた「The Little Shema」や「The Seasoned Schemer」の続編となる。「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書でもある。 […]

  5. […] core.logicとminiKanren 論理プログラミング […]

タイトルとURLをコピーしました