LoginSignup
6
5

More than 3 years have passed since last update.

Pythonで論理プログラミングを行う 〜芸人は誰かを推測する〜

Last updated at Posted at 2019-06-14

まず始めに

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はオーストラリアに住んでいる。
  • パイロットはフランスに住んでいる。
  • 芸人をしているのは誰だ?

目標は芸人をしている人を見つけることです。では、実際にコードを書いて芸人を見つけましょう!!!!!(なんとなく答えは想像できますが‥)

pazule.py
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 芸人')

これを実行すると、
Zakosho is 芸人

というような結果が出てきました!

表の表示をするために

上述のものに以下を書き加えると、

pazule.py
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

次回は、ヒューリスティック探索などについて書いてみようと思います。
もしくは、遺伝的アルゴリズムについて書くかもしれないです。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5