Perl のデータタイプには、連想配列(ハッシュ)と言うものがあります。配列のようなものですが、キーに名前を使うことができます。これを利用して三段論法を実行させてみようと思います。
三段論法は論理的に推論するときによく使われる方法です。たとえば、次のような推論が有名です。「人間は皆死ぬ。ソクラテスは人間である。故にソクラテスは死ぬ。」これを自動的に実行してみましょう。次のソースを sandan.pl と言うファイル名で作成します。
#!/usr/bin/perl -w
%suiron = ( '人間' => '死ぬ',
'ソクラテス' => '人間' );
$zentei = 'ソクラテス';
$zenkou = $zentei;
$koukou = $suiron{ $zenkou };
while ( defined($koukou) ) {
print "$zenkou => $koukou\n";
$ketsuron = $koukou;
$zenkou = $koukou;
$koukou = $suiron{ $zenkou };
}
print "\n$zentei => $ketsuron\n";
#sandan.pl
結果は次のようになります。
$ perl sandan.pl ソクラテス => 人間 人間 => 死ぬ ソクラテス => 死ぬ
こんどは、三段論法の自動実行を後で利用できるように(?)モジュールを作成します。ファイル名 Sandan.pm で次のソースを作成してください。
package Sandan;
#
# constructor
#
sub new {
my $self = {};
#
# initialize the object data;
#
bless($self);
return $self;
}
sub get {
my($self, $hash) = @_;
%$self = %$hash;
return $self;
}
sub suiron {
my ($self, $zentei) = @_;
my $ketsuron;
my $zenkou = $zentei;
my $koukou = $$self{ $zenkou };
die 'Error' if ( ! defined($koukou));
while ( defined($koukou) ) {
print "$zenkou => $koukou\n";
$ketsuron = $koukou;
$zenkou = $koukou;
$koukou = $$self{$zenkou};
}
print "\n$zentei => $ketsuron\n";
}
1;
# Sandan.pm
これを利用して落語で有名な「風が吹けば桶屋が儲かる」ことを証明します。Sandan.pm を利用した次のソースを okeya.pl と言う名前で作成します。
#!/usr/bin/perl -w
use Sandan;
$okeya = new Sandan;
$rikutsu = {
'桶がかじられる' => '桶屋が儲かる',
'三味線屋が儲かる' => '猫の数が減る',
'風が吹く' => '盲人が増える',
'猫の数が減る' => '鼠が増える',
'盲人が増える' => '三味線屋が儲かる',
'鼠が増える' => '桶がかじられる'
};
$okeya->get($rikutsu);
$okeya->suiron('風が吹く');
実行結果は次のようになります。見事に「風が吹く」と「桶屋が儲かる」ことが、証明されました。推論の登録をランダムにしたにもかかわらず、順序良く証明が進められています。
$ perl okeya.pl 風が吹く => 盲人が増える 盲人が増える => 三味線屋が儲かる 三味線屋が儲かる => 猫の数が減る 猫の数が減る => 鼠が増える 鼠が増える => 桶がかじられる 桶がかじられる => 桶屋が儲かる 風が吹く => 桶屋が儲かる