Prologと知識情報処理

ウェブ技術 デジタルトランスフォーメーション技術 人工知能技術 機械学習 自然言語処理技術 推論技術 セマンティックウェブ技術 深層学習技術 オンライン学習 強化学習技術 チャットボットと質疑応答技術 ユーザーインターフェース技術 知識情報処理技術 プログラミング スパースモデリング 確率的生成モデル サポートベクトルマシン 本ブログのナビ

Prologと知識情報処理について

Prologは、Lispと並ぶシンボリック人工知能プログラミング用の2つの古典言語の1つとなる。言語の特徴としては宣言型言語であることで、この「宣言型プログラミング言語」とは、対象の定義 =「何(What)を得たいか」を宣言してプログラムを構成し、逆に一般的な手続き型言語が持つ、それを得る過程・手続き・アルゴリズム =「どうやって(How)得るか」を記述しない[1][2]ものとなる。ここで「何を得たいか」という宣言は、出力を得る方法ではなく出力の性質・あるべき状態に対する記述となり、最終的な実現手続きはそれらが別途持つ処理系・ランタイム・フレームワーク等に委譲する形となる。

宣言の形としては述語論理が用いられる。これは述語(動詞)を関数とみなしその述語に対して以下に示すように名詞等の変数を代入する形となる。

valuable(gold)        Gold is valuable
fermale(jane)         Jane is female
owns(jane, gold)      Jane owms gold
father(john,mary).    John is the father of Mary
gives(john,book,mary) John gives the book to Mary

上記に示すように、宣言はある意味での事実(FACT)とな。これに対して一番シンプルなクエリは以下のようにその宣言が正しいかどうかになる。

?- valuable(gold)
yes
?- valuable(wood)
no
?- gives(john,book,mary)
yes

更に、以下のように変数Xを用いることで宣言の中のデータを探すクエリも用意されている。

?- valuable(X)
X=gold
?- gives(john,X,mary)
X=book

ここでXが複数存在する場合には、それらが順に表示されてくるものとなる。また、宣言は以下のようにconjunction(集合操作でのかつ(and))することができる。

likes(mary,chocolate)
likes(mary,wine)
likes(john,wine)
likes(john,mary)

?- likes(mary,X),likes(john,X)
X=wine

Prologでもう一つ重要な構文としてRuleの宣言がある。これは「John likes anyone who likes wine(ジョンはワインが好きな人を好きだ」とするとPrologでは以下のように表現される。

likes(john,X) :- likes(X,wine)

ここで現れるシンボルである「:-」は自然文的には「if」として捉えられる。このルールは以下のように用いることができる。

<fact>
male(albert)
male(edward)
female(alice)
female(victoria)
parent(edward,victoria,albert)
parent(alice,victoria,ablert)

<rule>
sister_of(X,Y):-
    female(X),
    parents(X,M,F),
    parents(Y,M,F)

<query>
?- sister_of(alice,edward)
no

上記の例は、Ruleを用いる事で、複数のfactの情報を組み合わせてqueryに答えている。これらを使ってfact(事実)を集め、更に専門家の知識ruleを集める事でエキスパートシステムが構成される。このエキスパートシステムは、上記の例を見てもわかる通り、実用規模のデータを扱おうとするとfactとruleを大量に集めないといけない事、また条件の組み合わせがconjunction(and)しか使えず、disjunction(論理和:or)が使えない等の課題がある。

本ブログではPrologに関する以下の記事を記載する。

技術トピック

プログラミングを行うためには、それぞれの言語に合わせた開発環境を作る必要がある。ここでは、本ブログに述べているPython、Clojure、C、Java、R、LISP、Prolog、Javascript、PHPそれぞのケースでの具体的な開発環境の立ち上げについて述べている。個々の言語では、開発を容易にするためのプラットフォームが準備されており、それらを用いると容易な環境設定が可能となるが、ここでは最もシンプルなケースでのものを中心に述べている。

エキスパートシステムとはwikiによると「人工知能研究から生まれたコンピュータシステムで、人間の専門家(エキスパート)の意思決定能力をエミュレートするものである[1]。専門家のように知識についての推論によって複雑な問題を解くよう設計されており、通常のプログラミングのようにソフトウェア開発者が設定した手続きに従うわけではない」とある。

基本的にな動作をシンプルに言うと、システムが入力に沿って定義(宣言)されたルールを選択していきすべてのルールを適用したものが最終的な出力となるようなものとなる。エキスパートシステムが登場した当時は、機械学習技術もそれほど発達しておらず、このルールはほぼ手動で作られていた。そのため複雑なルールを構築することが困難で、大規模なAIシステムではなく、限定されたドメインのビジネスルールを記述したアプリケーションで活用されてきた。

Prolog言語を初めて理解したとき、人々はそれまでの考えを一変させられる。一見単純な形式を持つこの言語は、無限の潜在能力と技術的可能性を秘めている。しかしその本質を適切に伝える書物は少ない。世に出ている解説書のほとんどは入門的なものである。
本書は、多くの応用例と高度で実践的なプログラミング技法について分かりやすく説明することにより、Prologの本質を理解し、使いこなすことを望んでいる技術者の知的ニーズに応える。
本書は、もともと、Plorogの高度な「プログラミングを教える」という目的で、Leon Sterling,Hhud Shaplogによって、大学院学生向けの講義のために書かれ、MITPRESSから「Art of Prolog」として出版された。

人工知能技術のためのプログラミング言語であるLISPの参考図書「実用Common Lisp」より。読書メモを記載する。

1960年代のAI研究は、探索問題に全力を注いでいた。特に、研究の多くは定理証明に関するものであった。すなわち、問題を公理の小さな集合として記述し、問題を証明するために探索するものである。従って、推論機構がその能力を持っているということが、暗黙の前提であった。正しい探索技法が発見できれば、問題は全て解かれて、定理もすべて証明できるということになる。

1970年代に入り、定理証明の考え方が、期待に応えられなかったため、このアプローチに課題があることがわかり始めた。AIの研究者たちが徐々に気づき始めたことは、どんなに賢い推論アルゴリズムが考案できたとしても、NP困難な問題は解けないだろうということになる。一般的な推論機構は、トイプロブレムには有効であったが、問題のサイズが大きくなった時に対応できなかったのである。

これに対する代替案は、エキスパートシステムの考え方となる。困難な問題を解く鍵は、問題をより簡単な問題に分けるための特例のルールを獲得することだと考えられた。Feigenbaumによれば、MYCINのようなエキスパートシステムから得られた教訓は、どのような推論機構を選択するかは、正しい知識表現を持つほど重要ではないということになる。この見方からすると、MYCINが前向き推論を使っているか、後ろ向き推論を使っているかは、あまり問題ではない。

SWI-Prologを用いたチャットボットの実装(外部リンク)

コメント

  1. […] miniKanrenは前述のprologと同様な、論理プログラミング用の組み込みドメイン固有言語であり、コア言語は非常に単純で、3つの論理演算子と1つのインターフェイス演算子しかないシンプルな言語となる。実装されている言語はScheme, Racket, Clojure,Haskell, Python, JavaScript, Scala, Ruby, OCaml, and PHPと多様で、刊行されている図書「The Reasoned Schemer」ではSchemeでの紹介で、Clojureではcore.logicで miniKanrenとほぼ同様のDSLが提供されている。 […]

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

  3. […] この問題を解決するために、知識ベースモデル構築(KBMC)と呼ばれるベイジアンネットの自動生成の研究がおこなわれた。KBMCは述語論理が用いられ、prolog的な宣言的なプログラミング言語等を用いて、知識ベースを参照しつつ後ろ向き推論を行い、質問に回答する為のベイジアンネット動的に生成して、それを使って確率を計算して質問に答えるしくみが用いられた。これによりすべての可能性のある質問に対する巨大なベイジアンネットを作成するという問題が回避できた。 […]

  4. […] 1970年代初頭に開発された論理型プログラミング言語Prologは、述語論理に基づく宣言的記述と定理証明に基づく計算手続きを併せ持つ新しい人工知能言語として注目され、1980年代にはエキスパートシステム、自然言語処理、演算データベースなどに幅広く有用されている。 […]

  5. […] 機械学習以外の人工知能技術の中心となる知識情報処理技術の歴史と知識を表現する言語およびPrologについて述べる。 […]

  6. […] 1970年代初頭に開発された論理型プログラミング言語Prologは、述語論理に基づく宣言的記述と定理証明に基づく計算手続きを併せ持つ新しい人工知能言語として注目され、1980年代にはエキスパートシステム、自然言語処理、演算データベースなどに幅広く有用されている。 […]

  7. […] 1970年代初頭に開発された論理型プログラミング言語Prologは、述語論理に基づく宣言的記述と定理証明に基づく計算手続きを併せ持つ新しい人工知能言語として注目され、1980年代にはエキスパートシステム、自然言語処理、演算データベースなどに幅広く有用されている。 […]

  8. […] この問題を解決するために、知識ベースモデル構築(KBMC)と呼ばれるベイジアンネットの自動生成の研究がおこなわれた。KBMCは述語論理が用いられ、prolog的な宣言的なプログラミング言語等を用いて、知識ベースを参照しつつ後ろ向き推論を行い、質問に回答する為のベイジアンネット動的に生成して、それを使って確率を計算して質問に答えるしくみが用いられた。これによりすべての可能性のある質問に対する巨大なベイジアンネットを作成するという問題が回避できた。 […]

  9. […] LISPサマリー  Prologと知識情報処理  […]

  10. […] 人工知能、論理プログラミングに用いられるProlog概要 | Deus Ex Machina より: 2021年10月16日 3:23 PM […]

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