三段論法

Hash 配列の中に hash 配列を入れることも可能である。

key_1 といえば value_1
value_1 を key_2 とし、key_2 といえば value_2
value_2 を key_3 とし、key_3 といえば value_3
  :

わらしべ長者という昔話がある。

貧乏な男が転んだ。 転んだらわらをつかんだ。 アブが飛んできた。 アブがうるさいのでわらにくくりつけた。 わらにくくるとおもちゃになった。 おもちゃになったわらを持って歩いた。 泣いている赤ん坊が欲しがった。 赤ん坊は泣きやんだ。 泣きやんだ礼としてみかんをもらった。 喉の喝いた旅人がみかんを欲しがった。 喉をうるおした礼として反物をもらった。 侍が倒れた馬と反物を交換したがった。 反物と倒れた馬を交換した。 倒れた馬を休ませた。 馬は元気になった。 元気な馬を欲しがる庄屋がいた。 庄屋は旅に出た。 庄屋は旅に出るため屋敷の留守を頼んだ。 庄屋は戻って来なかった。 貧乏な男は庄屋になった。

一つの出来事に対して一つの出来事が発生している。 数学の証明に使う三段論法もこの方法である。 また、数学の証明などによく使われる三段論法もこのパターンである。

「人間は皆死ぬ。ソクラテスは人間である。故にソクラテスは死ぬ。」

まず、大前提、小前提、最後に結論が来る。hash で表すと、

{人間 => 死ぬ, ソクラテス => 人間}

よって、"人間"が 2 つあるので、これらをつなげて、

{ソクラテス => 死ぬ}

となる。これをプログラムにしてみよう。 socrates.rb


#!/usr/koeki/bin/ruby

premise = Hash.new                  # 前提を代入する Hash 配列

subject = "人間"                    
object = "いつか死ぬ"

premise[subject] = object           # 大前提

subject2 = "ソクラテス"
object2  = "人間"                   # 小前提

premise[subject2] = object2

if premise.value?(subject) == true
    
   printf("%sは%s\n",subject,premise[subject])
   printf("%sは%s\n",subject2,premise[subject2])
   printf("ゆえに%sは%s\n", subject2,premise[subject])

end

同じ文字列が key と value にあるかどうか調べている。

# hash配列.key?("文字列")     # key に "文字列" が存在するかどうか
# hash配列.values?("文字列")  # value に "文字列" が存在するかどうか
#                             # 存在すれば true, しなければ false を返す
本日の講義 / 基礎プログラミング II / 2007 年度

Madoka Nishimura <madoka@e.koeki-u.ac.jp>