まず始めに
Deep learningの勉強をしようと思った時に基礎的なことから学びたいと思い、勉強してみました。基本的なAIを学ぶために必要な論理プログラミングの実装を行ってみた。
参考にした本はこちらです。
[PythonによるAIプログラミング入門] https://www.oreilly.co.jp/books/9784873118727/
今回使用したもの
python3.6
kanren
論理プログラミングとは
プログラミングのパラダイムの一つ。パラダイムは、プログラムを書くときの構成やその方法につい手の考え方の枠組ということなようです。プログラムのパラダイムには、様々な種類があって、よく聞くオブジェクト指向型もその一つです。細かい種類の紹介は省きます‥
今回は、その中でも論理型と呼ばれるものに焦点を当て、行っていきたいと思います。
「論理型では、事実と推論する際の規則から成るデータベースの上で自動的に推論することによって計算を行います。つまりは、事実となるデータが無ければ、論理プログラミングを行うことは困難になると言うことです。ここでいう事実は、処理中のプログラムとデータ中で真となる文のことらしいです。」
パズルの解法(論理プログラミングの少し応用)
今回は、パズルの条件を決めることでプログラムが解を求めるようにプログラミングしていきます。
ある4人の情報を設定し、欠けた情報をプログラムが教えてくれるというものです。4人の名前は、Bob、James、Zaksho、Kenjiであり、それぞれ異なる仕事をしており、異なる色の服を着ており、異なる国に住んでいるとします。
- Bobは青い服を着ている。
- ITエンジニアはカナダに住んでいる。
- Zakoshoはアメリカに住んでいる。
- 黒い服を着ている人はオーストラリアに住んでいる。
- JamesはITエンジニアである。
- Kenjiはオーストラリアに住んでいる。
- パイロットはフランスに住んでいる。
- 芸人をしているのは誰だ?
目標は芸人をしている人を見つけることです。では、実際にコードを書いて芸人を見つけましょう!!!!!(なんとなく答えは想像できますが‥)
from kanren import *
people = var()
kisoku = lall((eq, (var(), var(), var(), var()), people),
(membero, ('Bob', var(), 'blue', var()), people),
(membero, (var(), 'ITエンジニア', var(), 'Canada'), people),
(membero, ('Zakosho', var(), var(), 'USA'), people),
(membero, (var(), var(), 'black', 'Australia'), people),
(membero, ('James', 'ITエンジニア', var(), var()), people),
(membero, ('Kenji', var(), var(), 'Australia'), people),
(membero, (var(), 'パイロット', var(), 'France'), people),
(membero, (var(), '芸人', var(), var()), people),
)
solver = run(0, people, kisoku)
0
output = [question for question in solver[0] if '芸人' in question][0][0]
print(output + ' is 芸人')
これを実行すると、
というような結果が出てきました!
#表の表示をするために
上述のものに以下を書き加えると、
print('details:')
name = ['Name', 'job', 'Color', 'Country']
print('\n' + '\t\t'.join(name))
print('=' * 57)
for item in solver[0]:
print('\t\t'.join([str(x) for x in item]))
##表
details:
Name job Color Country
=========================================================
Bob パイロット blue France
James ITエンジニア ~_9 Canada
Zakosho 芸人 ~_11 USA
Kenji ~_13 black Australia
次回は、ヒューリスティック探索などについて書いてみようと思います。
もしくは、遺伝的アルゴリズムについて書くかもしれないです。