Location : Home > Languages > Perl > Package Title : AI::Proplog - Propositional logic engine |
![]() |
AI::Proplog - 命題論理を処理
use strict; use AI::Proplog; my $p = new AI::Proplog; # # いくつかの事実を宣言: # # cs は basic cs, math, advanced cs, an engr rec and nat. sci. を必要とする。 $p->a( cs_req => qw(basic_cs math_req advanced_cs engr_rec natural_science)); # basic cs は intro req, comp org, advanced programming and theory を必要とする。 $p->a( basic_cs => qw(intro_req comp_org adv_prog theory) ); # さらに $p->a( intro_req => 'intro_cs'); $p->a( intro_req => qw(introI introII) ); $p->a( math_req => qw(calc_req finite_req alg_req) ); $p->a( calc_req => qw(basic_calc adv_calc) ); $p->a( basic_calc => qw(calcI calcII) ); $p->a( basic_calc => qw(calcA calcB calcC) ); $p->a( adv_calc => 'lin_alg'); $p->a( adv_calc => 'honors_linalg'); $p->a( finite_req => qw(fin_structI stat) ); $p->a( alg_req => 'fin_structII'); $p->a( alg_req => 'abs_alg'); $p->a( alg_req => 'abs_alg'); # 一連の事実を宣言する。 # 以下の項目について取得 # cs intro, computer org, advanced programming, and theory $p->apl( qw(intro_cs comp_org adv_prog theory) ); # basic cs が何を必要とするかを確認するために事実/規則空間をボトムアップ検索を行う。 my $R = $p->bottom_up('basic_cs'); # または: my $R = $p->top_down('basic_cs'); print "The basic cs requirements have"; print $R ? : ' not' print " been met\n";
本モジュールは命題に基づく命題及び規則を宣言し、既存の命題及び規則の「宇宙」に基づく新しい仮説を検証する。実装された探索アルゴリズムは単純で不十分で誰にでも扱えるようにはできていない。たとえば以下のようなコードでトップダウン探索を行うと終了せずに実行し続ける。
$p->a( x => 'y' ); $p->a( y => 'x' );
一方、コード本体は極めて小さく(テキストにあった元の Pascal のコード例よりも小さい)、このようなプログラムの学習にはよい道具となるだろう。
David Maer・David S. Warren 著の "Computer with Logic: Logic Programming with Prolog" に記載されているものに基づいて記述されている。
まず AI::Proplog を宣言し、その後に a() を用いて規則と事実を宣言する。宣言したい事実の集合があるのなら 概要にあるように apl() を用いて簡単に宣言すればよい。
それから指定にしたがってトップダウンまたはボトムアップで真実空間を探索する。宣言した事実/規則空間から得られる全ての真実を知りたければ bottom_up を用い、あらゆる導出された命題を確認するために Data::Dumper とともに $p->{established} で確認するとよい。
一方、ある命題が事実/規則に基づくものかを簡単に確認したいのであれば top_down() が効果的であろう。これは興味の対象の命題が導出された命題として確認されれば終了するためである。しかしながら top_down() がバックトラックを行うのに対し bottom_up() は単に指定された事実/規則空間の中で指定された命題を探索するのみである。
API
a($then, @if)
この関数は人間にとっての "if-then." をモデル化している。リストを引数としてとる。最初の引数は "then" を、残りの引数は "if" を表す。if を満たせば "then" が真となることを意味する。
注意:@if が全くなければ $then は無条件に真となる。言い換えれば1引数だけで a を呼び出すことはその引数が真であることとを宣言することになる。
apl(@true)
本関数は事実の集合の状態を示す。これは便利な関数である。すなわち
@fact = qw(smc.edu caltech.edu pcc.edu); $p->apl(@fact);
は完全に以下と同値である。
@fact = qw(smc.edu caltech.edu pcc.edu); $p->a($_) for @fact;
確率を含む命題
# スフレの泡立てがうまくいって料理が順調に進む確率が 0.6 だとする。 $p->a( souffle_rises(0.6) => qw(beaten_well quiet_while_cooking) ) ; # 幸運で泡立つ確率が 0.1 だとする。 $p->a( souffle_rise(0.1) => 'have_luck'); # 泡立たない確率が 0.3 だとする。 $p->a( beaten_well(0.4) => 'use_whisk'); $p->a( beaten_well(0.6) => 'use_mixer'); $p->a( quiet_while_cooking(0.8) => 'kids_outside'); $p->a( have_luck(0.3) => 'knock_on_wood'); # 子どもたちが外に出ていて、泡立て器を使えるなら泡が立てられる確率はどれくらいに? $p->apl( qw(use_whisk kids_outside) ); $p->top_down('souffle_rise')
厳密な用語使用
現在では単項が現れても警告が出されない。そのため項目名をスペルミスしても(よくこのミスをやってしまった)、誰も意図しないのにプログラムは探索を続けてしまう。
T. M. Brannon, <tbone@cpan.org>
www.perlmonks.org の nardo 及び IDStewart によるデバッグにおける支援に謝意を表明する。彼らの迅速な支援がなければ本モジュールはこんなに早く公開されなかったであろう。
![]() |
Updated : 2006/12/11 |