人工知能志向型記号推論言語            「プログラム作成プログラム」                平成10年3月                 石崎 豪洋 目次 頁 1.はじめに                              3 2.モデル世界の理論とAL(Artificial Language)、探索の構造      6 3.変数の型、定数の型、リスト                     20 4.作用素、ステートメント、コマンド 22 5.実行の手順 23 6.例1 迷路、盲目探索の例 24 7.例2 ハノイの搭、パターンマッチを利用の例 29 8.例3 エイトパズル、評価関数を用いた探索の例 32 9.例4 外部評価関数探索の例 34 10.ステートメント、コマンドのマニュアル 36 11.あとがき 45 12.「プログラム作成プログラム」のソースリスト 46 (印刷する場合には39*40で見るように出来ています。) 1.はじめに  コンピューターで推論を行なわせる場合には、推論させる内容をコンピューターで処理できる形式に変換する必要がある。 この「プログラム作成プログラム」ではAL(artificial langulage)を用いることでコンピューターに推論させる内容を記述する。 実際の世界(実世界) 解こうとする問題   → AL(artificial language) → 推論 本に書いてあること             で記述 解こうとする問題をコンピューターで処理できるような形式に、正確に記述することが出来れば、コンピューターは推論をすることが出来る。 コンピューターに知識を与えることが最初に行なうべき事であるから、知識表現は重要なことである。 知識が無いならば問題を解くことは出来ないことは明白である。 次に、目標を与える。コンピューターは与えられた知識の範囲で目標の条件に合う推論を行なう。これを記号的に行なうプログラムが「プログラム作成プログラム」である。  皆さんは人工知能と言うと、どの様なものを連想するのであろうか。人間より遥かに多くの知識を持って素速く的確な推論をするものが私の理想である。 この様な考えの元でかなり以前に制作した人工知能を目指したプログラムが今から紹介する「プログラム作成プログラム」である。 このプログラムを制作していた当時はQick BasicやN88Basicが使われていた頃だったのでメモリの制限から探索を行なう時にメモリの不足を補う為にテンポラリーファイルを作成したりする。今から見ればユーザーインターフェースもかなり旧式である。 この「プログラム作成プログラム」は未だに仕様が完全に決っていない。この様な理由からBASICで記述されているのである。過渡的な仕様であるのでとにかく動作すれば良いと言う考えの元でプログラムが書かれているのでプログラミングのテクニックには見るべきものは無い。 見て欲しいものは、我々を取巻く環境である実世界、この実世界を如何にして記号に置き換えるかである。 これがこの説明書の主旨である。  人工知能の基本は差分エンジンであると思われる。古くはGPS(general problem solver 一般問題解決)に見られるように、初期状態、目標状態の差を解消する事が根本であると思われる。 最近では、人工知能と言うものが行き詰りであり、今はナイトメアの時代であると以前に何処かのシンポジュームで言われていたそうであるが、私はそうは思わない。 GPSが最初に作られた頃には、コンピューター、人工知能は10年から20年で人間の知能を越えるに違いないと言われていた。しかし、そうならなかったことは現在周知のことではある。  現在では、人工知能と言うとマービンミンスキーの「心の社会」にあるようなエージェントと言う考え方がある。このエージェントの理論が皆が納得できるように、直感的に本当にこれが人工知能であると思えるであろうか。  私の中での「人工知能」と言うものは中学時代に数学の宿題を試行錯誤的にPC6001のBASICで解いたのが始りであった。これを発展させたものがこれから書こうとしている「プログラム作成プログラム」である。組合せ爆発や知識の表現の問題と色々な問題に制作過程で遭遇した。 コンピューターが自動的に、正確に問題を解いてくれる。これが皆さんは実感できるであろうか。「そんなものはつまらない」、「そんなものは」と思われるのであればもはや人工知能は理解できないのではないのではないかと私は思う。 Windowsはプログラムを組むのがBASICといえども困難である。 全部を把握できる楽しさと言うものが無いのではないだろうか。 8Bitが主流であった頃には、何でもが驚きと興奮であった。PC6001の音声合成でも、カラーのグラフィックでも、今では当たり前のものがめずらしかった。  この頃にLISPで書かれたロジャーシャンクのCD(conceptual dependancy 概念依存)で構成されるスクリプト理論の本と出会った。CDで構成されるスクリプトを用いた自然言語理解のプログラムを使えば本当に人工知能が完成できるとその頃には私は信じた。 しかし、その頃は色々なLISPがあり、Common LISPは仕様が大きすぎで個人で使用できるようなものではなかった。 LISPが手元に無かった事と、LISP、Prologでの再帰的な手法が何故に人工知能であるのか理解でき無かった事もこの言語の制作の動機でもある。  「プログラム作成プログラム」は人工知能を目指したプロダクションルール型の言語である。正確にはif〜then形式をとっていないのでプロダクションルールといえるかどうかは分らないが、縦型探索を用いて与えられた初期状態から目標状態を達成するまで設定されたルールと成る作用素を用いて探索を行なうものである。 探索方法は大きく分けて評価関数を用いる方法と盲目探索の2種類がある。 評価関数を用いる探索方法では与えられた現在の状態から目標状態に対しての差を評価値とする方法とユーザーが評価関数を定義する方法がある。  この言語の名称である「プログラム作成プログラム」は、プログラミングについての技術、知識に乏しかった頃にコンピューターに試行錯誤をさせて自動でプログラムを作る事が出来ないものかと考えたのが最初であった。 この頃には、数学の宿題や、パズル等をコンピューターで試行錯誤で良く解いていた。 そして、ある問題を解いた場合に目標を達成した時に、使用した作用素をつなげることで新しい作用素を作成した。この過程を新しいプログラムを作ることと考えた。 しかし、探索の為のアルゴリズムをプログラムとしてコーディングする技術が無かった為に制作は困難をきわめ、次第に制作者である自分自身がプログラムを書く技術をある程度身に付けてしまった。 その後で、盲目探索では組合せ爆発が生じるので評価関数を導入した。効率良く作用素を作成する為には知識表現が必要であったので、その為の知識表現用のステートメントも作成した。 プログラムと言う言葉自体は、proとgramからなり、初めから(pro)書かれたもの(gram)と言う意味である。 この名称は人工知能と言う言葉さえも知らない時に付けたものであったが、自分で制作した言語に名称を付けると言うことが困難であるので、以前からあるこの名称を続けて使用している。  この言語を実用的に使用する場合には、パズル等の意味合いでのtoy worldでは役に立たないので、知識表現としてAL(artificial language)を制作した。 このALは知識一般を扱うように作用素として「プログラム作成プログラム」の中で使用できるようにしてある。  この言語は実験的に作成したものであるのでマイクロソフト系のBASICで記述してある。最近のBASICはコンパイラも備えられて、CPUの速度の向上もあるので、より高速な言語での記述よりも安定性と、変更が容易である点からBASICを使用している。BASICは可変長の文字列を簡単に安定して扱える為にこの様なプログラムを記述するには適していると思われる。 1997 12/2 2.モデル世界の理論とAL(Artificial Language)、探索の構造  コンピューターで推論を行なわせる場合には、推論させる内容をコンピューターで処理できる形式に変換する必要がある。 この「プログラム作成プログラム」ではAL(artificial langulage)を用いることでコンピューターに推論させる内容を記述する。 実際の世界(実世界) 解こうとする問題   → AL(artificial language) → 推論 本に書いてあること             で記述 解こうとする問題をコンピューターで処理できるような形式に、正確に記述することが出来れば、コンピューターは推論をすることが出来る。 コンピューターに知識を与えることが最初に行なうべき事であるから、知識表現は重要なことである。 知識が無いならば問題を解くことは出来ないことは明白である。 次に、目標を与える。コンピューターは与えられた知識の範囲で目標の条件に合う推論を行なう。これを記号的に行なうプログラムが「プログラム作成プログラム」である。 モデル世界の理論 モデル世界は実際の世界(実世界)での出来事をコンピューターの中に記述するものである。 コンピューターは動作を始めてから外界の情報を受け取り続ける。 これをここでは「一連の場面」と名付けることにする。 一連の場面とは、人工知能が動作し始めてからCCDや音声入力やその他のセンサーからの入力の全てを記録するものである。 これは、理論的なものであるから実際のコンピューターの記憶容量では不可能であるが、理論として考える上に必要なものである。 このように、一連の場面は今までに起きた出来事の全てを記録しているものとする。 一連の場面から何らかの評価関数の変化で場面を確立する。 この何らかの評価関数は、副詞、形容詞に相当するものであるとする。 さらに下位の評価関数は、場面に対してどの程度類似しているか、識別するための評価関数になると考える。 このように場面からさらに下位の評価関数で対象を確立する。 対象から、対象に付随する属性を確立する。 このようにすることで、下位のレベルからメタレベルの生成の問題は解決されると考える。               モデル世界の構成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ |                                   | |            一連の場面                  | |    (システムが起動してからの情報の全ての記録)         | |                                   | |  ・・・・・・・・・・・                      | |  |         |         ・・・・・・・・・・・  | |  |   場面    |         |         |  | |  |         |         |   場面    |  | |  |         |         |         |  | |  ・・・・・・・・・・・         ・・・・・・・・・・・  | |              ・・・・・・・・・・・・・・・・・・・・・| |              |       場面          || |              |                   || |     ・・・・・・・  |  対象1  対象1   対象1   || |     |     |  |                   || |     |     |  |  対象2  対象2   対象2   || |     | 場面  |  |                   || |     |     |  |  対象3  対象3   対象3   || |     |     |  |                   || |     |     |  |   t → t+1 → t+2   || |     ・・・・・・・  |                   || |              ・・・・・・・・・・・・・・・・・・・・・| ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ モデル世界とシステムの在り方 実世界とシステムとの関係は主観的なものである。実世界の中にシステムが有りモデル世界を利用して評価関数の値を最大とすることを目的に行動する。 この場合の評価関数は人間にとって好ましい結果をもたらすものとする。 実世界 → モデル世界 → 評価、価値     ← 行動    ←  モデル世界で行なわれる推論に拠るモデル世界内部での連想、操作も仮想的な経験として一連の場面に記録される。 モデル世界での記述は、実世界の出来事であれ、内部的な連想、探索についても同一の形式で記述される必要が有る。 そうすることで、モデル世界での推論そのものにも概念形成として類型化が起こることで推論の最適化にもつながると考えられる。 探索の構造 この言語で問題を解く場合には、現在がどの様な状態であるか、どの様な場合にどの様な事が起こるか、目的が何であるかを記述する必要がある。 この状態を記述する場所をモデル世界と言う。 モデル世界は問題を解く場合に使用する変数(レジスタ)から成るものである。 モデル世界 初期状態  −>  状態1  −>  状態2 −>....−> 目標状態      作用素1     作用素2 目標状態と任意の状態の差が評価関数の値である。 作用素はモデル世界に適応すると次の状態のモデル世界を生成する。 作用素は、モデル世界に対して全部の評価関数の値が目標状態に近い作用素を選択する。  探索を行なう場合には、最初に初期状態と目標を設定する。さらにどの様な規則で探索を行なわせるかを決定する為のルールである作用素を設定する。 この言語の探索は後戻り有りの縦型探索を行なう。 探索には一定の回数の作用素の適応を行なうと、探索を途中で中断する設定もある。 知識表現としてのAL(Artificial Language) 知識表現をするにあたって一番基本的なことは、言葉は何等かの状態に対して付けられていることである。 実世界に存在しているもの、時間的に変化するもの、内部のモデル世界の状態に対してのものの状態に対して言葉を付けるものである。 どの様に抽象的な概念でさえも実世界の存在に還元することが可能である。可能であると言うよりは還元しなければ推論としての役割を果さないことになる。 例としては、綺麗であると言う言葉は抽象的であるが物や状態に関していえることである。「法律」と言う概念でさえも個々の規則からなり実際の状態に対応する。 数多くの実際の状態の典型例としてのプロトタイプに言葉を付けるのである。 Toy world Toy worldと言うものが持つ意味としては、積み木や、パズルの様なものを想像する事は危険である。ハーバートAサイモンのチェスやその他のゲーム、ウイノグラードのshudleの様なもののToy worldは本来的な意味からは逸脱しているように思われる。 Toy worldとは少ない対象間の関係を時系列的な変化を伴って記述する事である。 ALの成立過程、1対象、2対象、3対象での時系列変化 1つの対象では 時間的に対象そのものが変化しない限り移動、停止、消滅が考えられる。 2つの対象では 時間的に対象の関係をどの様に記述するかが問題となる。 どちらがどちらに影響を及ぼすか、どちらが主格となりうるかである。 しかし、主格となり原因となるものが時間的に先行する。 3つの対象では2つの場合と同様に主格となり目的格となるものは時間的変化の中で最初に変化したものが主格となる。 例としては 大工がのこぎりを使い材木を用いて家を作る。 この場合に、主格である大工は時間的に           t1   t2    t3      t4 対象1 大工    大工   大工    大工      大工 対象2 のこぎり      材木を加工               する動作 対象3 材木              加工される 対象4 家                     家として存在 t1では大工が登場する。 t2ではのこぎりが大工によって使われる。 t3で材木がのこぎりで加工される。 t4ではじめて家という対象が登場する。 対象の時系列変化に対して全体に言葉を付ける事である。 上記の大工の例でいえば、全体としては「家を作る」という言葉を付ける。 CD理論の限界 CD理論はconceptiual dependancyの略として、1975年頃にシャンク、リーズベックなどによって自然言語処理のために開発されたものである。 スクリプト理論として人工知能の古典として位置付けられる。     ATRANS、MTRANS、SPEAK、EXPEL、PROPEL     MOVE などの基本的な単語10程度を用いて新聞の記事などを理解させるものである。 ALの成立過程で上げた方法ではこの様な基本語を用いる事はない。 上記の例ではCDの表記でも十分である。 NTTの機械翻訳では意味属性を約3000用いているそうである。しかし、自己組織的な観点から考えた場合はどうであろうか。 時間t1からt2、t3と時間が移る際の変化をCDの様に意味属性として分析的に記述するよりも、全体としての時間的な対象の変化に対してコードとしての言葉を付与する方が実世界と接続する際に、自己組織的な意味合いに於いても利便性を持つものと思われる。 AL AL(Artificial Lunguage)以下ALと略する。 ALはプログラム作成プログラムと言う言語の知識表現の方法であり、プログラム作成プログラムのステートメントとして実行される。 ALはシャンクのCD理論(conceptual dependancy)を参考に作成した。しかし、CD理論では幾つかの基本的な関係から全ての概念を記述出来るとした前提が実世界の場面を記述するには不完全である為にALでは実世界のモデル世界に対しての対象の存在を時間を軸として、複数の属性で表現することにした。 ALとCD理論 ALを開発する最初に行なったことは1対象2対象3対象での時間的空間的な変化に対しての記述を行なうことでこれらの基本的な状態に対して基本語を設定することを考えたことからである。 基本語という考え方はシャンクのCD理論から来ているのであるがCD理論の様な基本語という述語を用いたものでは記述できないものがある。   モデル世界 人工知能と言うシステムは実世界に位置する物であり、実世界の情報の一部をモデル世界に投影して、システム固有の目的関数を充足すべく動作する。 モデル世界は現実のみならず、過去に起こった事象、これから起きるであろうと予測される事象を表記するものである。 ここでは事象は対象と同意義とする。 対象の表記の仕方 対象は属性に拠って表現される。 一つの対象を属性のリストより成るとして *MW+時間+仮想+平行次元+属性1+属性2+.... の変数として記述する。 属性の順序としては、抽象度の高いものを最初に記述する。 例えば、「机」は 家具+机+学習用+香川県 と表記する。 作用素が「家具+机」について記述してある場合には、細かい属性は無視されて作用素の適用が行なわれる。具体的な記述についてはマニュアルを参照。 *T 時間 順序を示すのに用いる整数値である。 *A 仮想 現実でなく仮想的な知識表現の為の物である。仮にこの様にしたらと言う場合を表現することに用いる。 日常会話の中で、もしもこの様なことが起きたらどうなると言う様な仮想的な知識を扱う為の物として設定する。 現実に起きている、または起きた場面を0とする。 現実の世界でこう言うことが起きたらばと考える場合には仮想次元は1とする。 更に仮想の世界で仮想を行なう場合には仮想次元は2である。 これは小説の登場人物は仮想次元1であるのに対してこの登場人物が何かを思い描く場合には仮想次元が2となる。 さらにこの小説の登場人物がある架空の人間を想定して架空の人間が更に何かを思い描くようなことは仮想次元が3となる。 この様に実世界を0として123...という整数値を取る。 *N 平行次元 場面は複数の対象が時間的に変化するものである。スクリプトと同じ意味で用いる。 一つの主格と対象格との時間的な存在と変化をまとまりとして見る場合に、これと同時刻に起きている場面を平行次元として扱う。 ALに於てシステム自身の存在はモデル世界には無い。これは実世界に於てのシステムを考えた場合には知識表現がシステムを主体とするものであるのに対してのものである。 この場合の平行次元での知識表現での次元数は単純に場面に対しての任意の自然数を付与するものである。 *KV 値の種類 位置  時間スケール  距離スケール  大きさスケール 色  形 値段  名前 情報  記憶 その他の単位となり得る物。 レジスタ表現として *T+*A+*N+*KV = 値 *T+*N = 述語 AL表現の実際 免疫の教科書より抜粋した文章をAL表現により表記して見る。 文章を最初に、変換したAL表現を下に表記してある。 例1 T細胞は抗原刺激を受けると幼若化し増殖分化するが、抗体産生細胞とならない。 CC(*MW+*T+0+*N+0+name+T細胞) −AL(0,name+T細胞,) −AL(0,script,抗原刺激) −INC(*T) −AL(0,script,幼若化) −INC(*T) −AL(0,script,増殖分化) −INC(*T) −NAL(0,name+抗体産生細胞,) 主語がはっきりしない時、対象は主格にする。 NALはALの否定表現ステートメントである。 例2 B細胞は抗体産生細胞になるが、一般にそれ単独では抗体産生は起こらずT細胞の補助が必要である。 CC(*MW+*T+0+1+0+name+B細胞,*MW+*T+0+1+0+name+T細胞) −AL(0,name+B細胞,) −INC(*T) −AL(0,name+抗体産生細胞,) −AL(1,name+T細胞,) −INC(*T) −AL(0,script,抗体産生) 例3 例えば全身放射線照射をしたマウスに胸腺リンパ球、あるいは骨髄リンパ球を単独に移入して抗原刺激を加えても抗体産生は起こらない。 CC(*MW+*T+0+*N+0+name+マウス) −AL(0,name+マウス,) −AL(0,script,全身放射線照射) −INC(*T) −AL(0,verb+入れる,胸腺リンパ球) −INC(*T) −AL(0,script,抗原刺激) −INC(*T) −NAL(0,script,抗体産生) CC(*MW+*T+0+*N+0+name+マウス) −AL(0,name+マウス,) −AL(0,script,全身放射線照射) −INC(*T) −AL(0,verb+入れる,骨髄リンパ球) −INC(*T) −AL(0,script,抗原刺激) −INC(*T) −NAL(0,script,抗体産生) 同意語変換 CC(*MW+*T+0+*N+0+name+T細胞) −AL(0,name+T細胞,) −AL(0,name+T細胞+骨髄リンパ球,) スクリプトの内部の値の種類としてのスクリプトを展開する場合には入れ子構造としての時間で表記する。 時間について一般作用素表記にする。 CC(*MW+*T+0+1+0+*KV) を頭部に持つ事により以下の作用素適用を可能にする。 または、等のORの表現は高速化のために別々の作用素として記述する。 1 2 3 4 5 6 7 8 9  時間 初期状態 ○−○−○ ○−○−○−○−○−○ スクリプト2 スクリプト1  ○−○−○−○             ○−○−○             目標状態 (○ ALステートメント) scriptと言うタグを用いて抽象的な表現を行なう。この表現により細部への展開も評価関数の値により起こる。 これはあるscriptで定義したものの細部が必要な場合には探索に於ける評価関数の値に依って細部を定義した作用素が用いられることである。 もしも、具体的な記述を使用することなく評価関数の値が目標値に近付いて行く場合には具体的な記述に関しての探索は省略されることとなる。 この細部への展開の際には現在の時間に書かれているレジスタの上にさらに上に書込む。 もしも、抽象的な表現のみで探索が可能ならば具体的な存在について記述してある作用素は必要ないのである。 しかし、知識、情報と言うものは元々、実世界のものであるのであるから実世界の存在に直接関係の有るものとして還元される必要が有る。 さらには、自己組織的な学習では実世界の情報から推論を行なうものであり、概念も対象も存在しない所から始めなければならないとすれば、教示が学習を著しく促進するにせよ完全にボトムアップの学習が可能でなければならない。 このシステムのALではそれは実現はされていないが、考え方として必要と思われる。 初期状態のレベル          −−−             −−−                −−−                   −−−                       目標状態のレベル ALは知識表現であり、当初はこれを用いたエキスパートシステムを作成することを考えていたのである。使用方法としては、書籍に載っている知識を人間が全体を理解することなしにALでの作用素表現として記述して推論を行なわせることである。 断片的な知識を記述することで全体の推論を機械で行なうことを目的としたのである。 この様なことが可能ならば、ALを記述する技術を持つ者が複数存在すれば大量の知識をALに翻訳して機械的に大規模な人間を越える推論を可能にすることができる。 しかし、属性値を統一しないことにはALの対象の記述が不可能であり、属性値を統一することは記述する人間がALでの属性を全て把握する必要があるのである。 これでは知識全部を人間が把握した上で記述する必要があるので最初の目的と反する。 これには属性値の獲得が自己組織的にシステムが行なわなければならないことを示すものである。 実世界とAL表現 実世界の情報はビットマップで構成されるが、これを記号推論のALの考え方につなげることを試みることにする。 シャンクのスクリプト理論で例として用いられているものにレストランの例題が有る。 これは、レストランに入った客がとる行動を、特定の台本を演じているものとして考えるものである。客がレストランに入ると、テーブルに座り、メニューを見て、ボーイを呼び注文する。食べ終われると代金を支払い、店をでる。 細かい動作を別にするとレストランで客がとる行動は類型化している。 場面(スクリプト)            時間 → 対象1        対象1        対象1 属性1        属性1        属性1 属性2        属性2        属性2 対象2        対象2        対象2 対象3        対象3        対象3 このレストランの場面は常にどの対象についても成り立つわけではない。対象として良いものには条件が有る。例えば対象1はレストランの客であるとする。 それが、レストランに入って来た対象が犬であった場合どうであろうか。このレストランのスクリプトを作用素として適用することは不適切である。 その条件として働くものは対象を構成する属性である。 この場合には洋服を着ている事や、身体的に人間であると認められる事柄が人間である対象を構成している属性となる。 対象の確立と知識の一般化 ALでは対象と成るものは予め人間が記述することを前提としている。 しかし、実世界には対象が対象であることは最初から分っている訳ではない。 システムにあるパターンが与えられたとする。与えられたパターンと一致するものが無い場合には与えられたパターンを光学的ぼやけ等の処理を行なって似たようなパターンを検索する。 コグニトロンの様な特徴検出細胞を通すことは多対一のぼやけ処理の一つで有ると思われる。 基本的には単純な連想から成るものであり、対象を一つの対象として認識する必要性と言うものは、これから先に今までと同じでない場面に遭遇した場合に今までの経験に有る場面を繋ぎ合わせることで対処しようと言うものである。 対象と言うものが対象として明瞭に記号的に区切られるものでは無く、個々の人間の経験に拠るものと言葉に対応したものである。 記号は実世界のものを指したものである。 ALと実世界への接続 対象とは何か 対象は複数の属性から成り立つ、属性は対象として扱うことが出来る。 また場面も対象として扱うことが可能である。 未来と言う概念も時間を対象として扱っているものである。 対象と操作 推論には対象が存在する。対象は属性に分解できる。属性は対象を構成する。 時間さえも対象として扱うことが可能である。 場面も対象である。仮想的な次元も、平行世界も繰返し構造全体も 全てが対象として扱うことが出来る。 表象主義的な人工知能は記号を用いるが、形式論的なモデルそのものが否定される訳ではない。 それは、どの様に扱うかの問題である。逆に考えて見れば述語論理で画像を直接的に学習可能であるかどうかを問うことでも理解できよう。 画像データも最終的には個々のビットの集合である。 ビットで表現できるものは記号でも可能である。 記号でも可能であると言うことが意味することは、一つの概念を表わすのに数個の記号で表現するのではなく画像のピクセルに対応する記号としてのものである。 記号が文字どおり画像を形成するほどに使用するのである。 この様な記号の利用の仕方で状況意味論を用いた推論を行なう。 表象主義と言うもの自体は実世界の場面、状況と関係なく一般化された対象間の関係を記述するものである。論理学は歴史的に日常の状況、場面から純粋な単純化された関係を取り出すことに目的が置かれたのである。これは今までの計算機資源の関係から支持されたものであり。本来的な知能の実現とはやや離れるものがある。 3.変数 変数には半角で「*」を最初に付ける。以下に変数をレジスタと表現する事がある。 例としては *A *B *Width *大きさ *重さ 変数の名称は大文字、小文字を区別し変数と成る文字列は日本語でも可能である。変数の名称に使用できる文字の長さは使用するBASIC言語と計算機資源に依存する。 変数の型 この言語には変数に型は存在しない。代入するものは文字でも数値でも扱うことが出来る。 数値の場合には単精度の浮動小数として計算される。これは使用するBASICに依存する。 文字を四則演算しようとすると、ゼロとして扱う。 定数の型 定数の型は以下のものが利用できる。 整数、浮動小数、文字列、リスト 配列変数としての扱い この言語では以下の様な変数の表記が可能である。 例 *A+*B+*C *A+2+3 *ADDRESS+東京都+文京区 代入の仕方 例として LD(*A+*B+*C,ABC) LD(*A+2+3,123) LD(*ADDRESS+東京都+文京区,なんとか会社) リスト この言語では入れ子構造無しのリストを変数の値として扱う事が出来る。 例 *A=a_b_c_d _は半角のスペースを用いる。 リストを操作するステートメントとして以下のものがある。 (詳細はステートメントマニュアルを参照) MOVE(項1,項2) 項2に項1からリストの左端の物を取りだし代入。 MOVE({代入されるレジスタ},{代入される位置},{代入する項},{位置}) LD({代入されるレジスタ},{代入される位置},{代入する項},{位置}) APP({代入されるレジスタ},{結合する項}) LEN({代入されるレジスタ},{対象となる項},{機能}) SORT(レジスタ) 入れ子構造のリストを用いない理由 LISPのS式の表現で有効と思われる事は入れ子構造としての知識表現であり、柔軟な知識表現が可能である。しかし、入れ子構造のリストを高速に検索、操作することは困難である。 入れ子構造と言う物はモデルの内部に又モデルを表記する事である。 レジスタの属性表現こそが入れ子構造の表記として有効に働く物と思われる。 この表現の仕方はコンパイラを想定した場合そのまま変数の配列に変換できるので速度的に有利であると思われる。 4.作用素、ステートメント、コマンド 作用素 作用素はステートメントから成り立つ。 作用素はステートメントを − でつないで表現する。 LD(*A,1)−LD(*B,2)−LD(*C,3) ある状態に対して作用素は、構成するステートメントが全部実行可能ならば成立する。 BASIC的な表現で IF A=1 THEN B=5 と言う表現は eq(*A,1)−LD(*B,5) とこの言語では表現する。 明瞭に条件部と実行部に分けていないが、ステートメントとして実行可能かどうかを見ることでこれに対応している。 ステートメント 最初の状態の設定や探索の実行、作用素に使用する。 文法的に誤りが合った場合には、実行時に誤った箇所が表示される。 コマンド 作用素データのセーブ、ロード、探索の制御用のバッチファイルのセーブ、ロード 画面の消去、モデル世界のレジスタ内容の消去、表示 その他は、コマンドの一覧を参照 これらの操作を行なう為に用いる。 5.実行の手順 探索を行なう為には、作用素を記述して、探索を制御する為のバッチファイルを作成する。 起動した直後には、探索制御の為の画面が表示される。 +をコマンドとして実行すると画面が切換わり、作用素の編集画面に移る。 もう一度、+を実行すると元の探索制御の画面に移る。 N88BASICではLINE INPUTでスクリーンエディターが簡単に出来た。しかし、Quick BASICでは一行しか入力できないので、作用素の編集や、探索制御のバッチファイルを作成する場合には、他のエディターを使用する方が良い。 GUESSステートメントを用いると拡張子「SAK」のテンポラリーファイルが作成される。実行後の各モデル世界の確認のために消去は手動で行なうようになっている。 6.例1 迷路 迷路を解く場合には、迷路の分岐点に名称を付けて、どこに通じているかを記述していく。 入口をINとして出口をOUTとする。 INからはAに通じている。 AはBとCに通じている。 CはDとEに通じている。 EはKとFに通じている。 FはGとHに通じている。 HはIとJに通じている。 EはJに通じている。 Jは出口のOUTに通じている。 これを作用素として表現すると以下の様になる。 場所を表わす変数として*Pを用いる。 作用素ファイル ファイル名 MAZE eq(*P,IN)-LD(*P,A) eq(*P,A)-LD(*P,B) eq(*P,A)-LD(*P,C) eq(*P,C)-LD(*P,D) eq(*P,C)-LD(*P,E) eq(*P,E)-LD(*P,K) eq(*P,E)-LD(*P,F) eq(*P,F)-LD(*P,G) eq(*P,F)-LD(*P,H) eq(*P,H)-LD(*P,I) eq(*P,H)-LD(*P,J) eq(*P,E)-LD(*P,J) eq(*P,J)-LD(*P,OUT) 探索制御のバッチファイル ファイル名 メイロ LD(*P,IN) SEARCH(MAZE,eq(*P,OUT)) この2つをファイルとして作成する。ステートメント、括弧、アスタリスク、カンマは半角で入力する。 変数名、変数の値は全角でも良い。 作用素のファイルを拡張子無しでMAZE、探索制御のバッチファイルをメイロとする。 拡張子は付けても付けなくても良い。 「プログラム作成プログラム」を起動する。 プログラム作成プログラム Version 7.2 Copyrighted By T.Ishizaki 1992(c) 500 Functions Free Ready _ 以上の画面が表示される。_はカーソルを表わす。 500 Functions Freeは500のデータを作用素、探索制御のバッチファイルでそれぞれ扱うことが可能であることを表示している。プログラムのソースの一番最初のM=500を書換えることで変更できる。 作用素のデータが500と探索制御のバッチファイルのデータが500ずつと言う意味である。 ここで、作成した探索制御のバッチファイルを読み込む。 コマンド、ステートメントは全て半角で入力する。 半角で LOADメイロ・ を実行するとファイルの読み込みが出来たのであれば Ready _ が表示される。 LIST・を実行すると 1 LD(*P,IN) 2 SEARCH(MAZE,eq(*P,OUT)) Ready _ と表示される。 この行番号は編集の為に便宜的に付けたものであるので、データをセーブする際には取除かれる。 1 LD(*P,IN) LDステートメント LD(変数名,代入するもの) 代入するものには変数を指定可能である。 2 SEARCH(MAZE,eq(*P,OUT)) SEARCHステートメント、盲目探索を実行する為のステートメント 目標が達成するまで、全ての組合せを試す。 SEARCH(作用素ファイル名,目標条件と成るステートメント) 目標条件は複数のステートメントを使用することが出来る。 作用素ファイル名の拡張子は何でも良い。 探索の実行 RUN・ を実行すると以下の様な結果が出力される。 RUN 推論中 ****    探索条件達成    **** 0 桁 *P = IN 1 桁 eq(*P,IN)-LD(*P,A) *P = A 2 桁 eq(*P,A)-LD(*P,C) *P = C 3 桁 eq(*P,C)-LD(*P,E) *P = E 4 桁 eq(*P,E)-LD(*P,J) *P = J 5 桁 eq(*P,J)-LD(*P,OUT) *P = OUT 探索を継続しますか(Y/N)? n 所要時間 8 秒 組合せ 299 Rady _ 「探索を継続しますか?」の表示にたしてy・を入力した場合には他の解答の探索を開始する。ここで用いた探索ステートメントSEARCHは、全ての可能な作用素の適用の組合せを実行する。目標条件に合う組合せである場合には、上に記したような「目標条件達成」の表示と変数(レジスタ)と使用した作用素の経過を表示する。 探索制御のバッチファイルでは0桁のモデル世界の変数(レジスタ)を操作できる。 0桁のモデル世界とは最初の状態である。 探索ステートメントSEARCHに設定したeq(*P,OUT)が目標条件となり探索が行なわれる。 この迷路の問題を拡張して、各地点間の距離を作用素に記述し評価関数を用いる探索ステートメントを利用すれば最短経路を求める問題や、巡回セールスマン問題(TSP)を解くことが可能である。 7.例2 ハノイの搭、パターンマッチを利用の例  「プログラム作成プログラム」ではパターンマッチを利用して作用素を記述することが可能である。パターンマッチを利用することで一般化された作用素を記述することができ、必要な作用素の数を減らすことが出来る。 パターンマッチの例 作用素ファイル CCTEST CC(*A+*B+*C+*D)-PRC(###########,B = ,*B,C = ,*C,D = ,*D) 探索制御のバッチファイル CCCTEST LD(*A+6,3) LD(*A+4+5,2) LD(*A+1+2+3,1) GUESS(CCTEST,eq(*D,3)) CCステートメントは変数(レジスタ)とパターンマッチを行なうステートメントである。 *A+6という変数に対して、作用素の最初のステートメントのCC(*A+*B+*C)を適用すると、*A+6と*A+*B+*Cがパターンマッチする。 *A+6 *A+*B+*C *Bに6が代入され、*Cには値が無いので何も代入されない。 この作用素の次のステートメントを実行すると CC(*A+*B+*C)-PRC(###########,A = ,*A,B = ,*B,C = ,*C) PRCステートメントにより変数(レジスタ)の内容が表示される。 PRCステートメントは改行付きの表示を行なうものであり、引数の最初に半角のアスタリスク(*)がある場合には変数の内容を表示する。 ハノイの搭 ハノイの搭は人工知能の教科書に良く例題として用いられているものであるが、Lispなどの言語を用いて再帰的に解いているものが殆どである。 以下に示す解き方は、初期状態として*B+1の棒から隣の*B+2の棒へ円板を移す事を試行錯誤的に行なうものである。 作用素ファイル ファイル名 HANOI CC(*B+*C1,*B+*C2)-ne(*B+*C2,)-eq(*B+*C1,)-MOVE(*B+*C2,*B+*C1) CC(*B+*C1,*B+*C2)-ne(*B+*C2,)-<:(*B+*C2,*B+*C1)-MOVE(*B+*C2,*B+*C1) 探索の制御ファイル ファイル名 RPHANOI LD(*B+1,1 2) LD(*B+2,) LD(*B+3,) search(hanoi,eq(*B+2,1 2)) 作用素の説明 一行め CC(*B+*C1,*B+*C2)-ne(*B+*C2,)-eq(*B+*C1,)-MOVE(*B+*C2,*B+*C1) CCステートメントでレジスタの先頭が*Bのレジスタを2つ選択する。 選択したレジスタ*B+*C2がヌルでなく、*B+*C1がヌルの場合には*B+*C1に*B+*C2の要素を一つ移動させる。 2行め CC(*B+*C1,*B+*C2)-ne(*B+*C2,)-<:(*B+*C2,*B+*C1)-MOVE(*B+*C2,*B+*C1) CCステートメントで2つのレジスタを選択する。 *B+*C2がヌルでなく、*B+*C1の方が*B+*C2より大きい場合に*B+*C1に*B+*C2の要素を一つ移動する。 リストを数値として比較する場合には先頭の要素を評価する。 探索の制御ファイルの説明 LD(*B+1,1 2) LD(*B+2,) LD(*B+3,) 棒1、棒2、棒3の状態を設定する。 棒1に「1 2」の円板が乗っていることを記述している。 search(hanoi,eq(*B+2,1 2)) hanoiの作用素ファイルを使用して盲目探索を実行する。 *B+2の値が「1 2」になることを目標として設定している。 探索を実行するにはRUN・を実行する。 8.例3 エイトパズル、評価関数を用いた探索の例 数字を順番に並べ変えるもので「*」は空の状態を示す。 一つずつ数字を移動して目標状態にする。 最初の状態         目標状態 *52           123 843           456 716           78* 作用素ファイル ファイル名 8パズル eq(*1,)-LD(*R,*2)-LD(*2,)-LD(*1,*R) eq(*1,)-LD(*R,*4)-LD(*4,)-LD(*1,*R) eq(*3,)-LD(*R,*2)-LD(*2,)-LD(*3,*R) eq(*3,)-LD(*R,*6)-LD(*6,)-LD(*3,*R) eq(*2,)-LD(*R,*1)-LD(*1,)-LD(*2,*R) eq(*2,)-LD(*R,*3)-LD(*3,)-LD(*2,*R) eq(*2,)-LD(*R,*5)-LD(*5,)-LD(*2,*R) eq(*4,)-LD(*R,*7)-LD(*7,)-LD(*4,*R) eq(*4,)-LD(*R,*5)-LD(*5,)-LD(*4,*R) eq(*4,)-LD(*R,*1)-LD(*1,)-LD(*4,*R) eq(*5,)-LD(*R,*2)-LD(*2,)-LD(*5,*R) eq(*5,)-LD(*R,*4)-LD(*4,)-LD(*5,*R) eq(*5,)-LD(*R,*6)-LD(*6,)-LD(*5,*R) eq(*5,)-LD(*R,*8)-LD(*8,)-LD(*5,*R) eq(*6,)-LD(*R,*3)-LD(*3,)-LD(*6,*R) eq(*6,)-LD(*R,*5)-LD(*5,)-LD(*6,*R) eq(*6,)-LD(*R,*9)-LD(*9,)-LD(*6,*R) eq(*7,)-LD(*R,*4)-LD(*4,)-LD(*7,*R) eq(*7,)-LD(*R,*8)-LD(*8,)-LD(*7,*R) eq(*8,)-LD(*R,*7)-LD(*7,)-LD(*8,*R) eq(*8,)-LD(*R,*5)-LD(*5,)-LD(*8,*R) eq(*8,)-LD(*R,*9)-LD(*9,)-LD(*8,*R) eq(*9,)-LD(*R,*6)-LD(*6,)-LD(*9,*R) eq(*9,)-LD(*R,*8)-LD(*8,)-LD(*9,*R) 探索の制御のファイル ファイル名 eight LD(*1,2) LD(*2,3) LD(*3,6) LD(*4,1) LD(*5,5) LD(*6,4) LD(*7,7) LD(*8,) LD(*9,8) GUESS(8パズル,eq(*1,1)-eq(*2,2)-eq(*3,3)-eq(*4,4)-eq(*5,5)-eq(*6,6)-eq(*7,7)-eq(*8,8)-eq(*9,)) LD命令で初期状態を設定する。 GUESSステートメントで探索を実行する。 このステートメントは設定した目標条件のステートメントが成立する個数を評価として探索を行なう。 ハノイの搭は一般化された作用素を用いているので動作速度は遅くなる。 CCステートメントを用いた一般化された作用素はdebugも困難であるので、一つ一つの規則について作用素を記述していく方が確実で実行も速い。 この問題では外部評価関数として、それぞれの数字の位置を設定すると問題の解決は速くなる。 9.例4 外部評価関数探索の例 外部評価関数の動作をテストするための例である。 X+Y=5に成るXとYを−10≦X −10≦Yの範囲で求める。 作用素ファイル ファイル名 TESTES add(*X,1,*X) add(*Y,1,*Y) 探索の制御のファイル ファイル名 ES LD(*X,0) LD(*Y,0) EST(w,add(*EST,*X,*Y)) GUESS(TESTES,=:(*EST,5)-PRC(*EST)) 探索の制御のファイルの説明 EST(w,add(*EST,*X,*Y)) 評価関数をX+Yに設定する。 GUESS(TESTES,=:(*EST,5)-PRC(*EST)) 評価関数の値が5に成ることに目標を設定する。 探索を継続して行くと、XとYの値が同じ組が出て来るが、これは作用素の順番が違う場合も数えているからである。 X=1とY=4が答えの場合でも、Xに1を足す順番がYの後になるかその次になるかの組合せが出来るのでX=1,Y=4の答えは複数出て来る。 経路探索の例 ある点からある点への移動経路を探索する例。 座標(18,4)から座標(15,7)までの探索を行なう。 作用素ファイル ファイル名 DIST add(*Y,1,*Y) add(*X,1,*X) sub(*X,1,*X) sub(*Y,1,*Y) 探索の制御のファイル ファイル名 DIS LD(*X,18)-LD(*Y,4) EST(w,LD(*L,*X)-sub(*L,15,*L)-mul(*L,*L,*L)) EST(w,LD(*L1,*Y)-sub(*L1,7,*L1)-mul(*L1,*L1,*L1)) EST(w,add(*L,*L1,*L)-sub(50,*L,*L)-LD(*EST,*L)) GUESS(DIST,eq(*X,15)-eq(*Y,7)) 評価関数にL=−(X^2+Y^2)を設定している。 探索は評価関数の値が最大になるように行なうように出来ているので、最小の距離を求める場合には全体の式にマイナスを掛ける。 10.ステートメント、コマンドのマニュアル ステートメントの解説 [ 比較 ] 項はレジスタ、定数のどちらでもよい。 数値の比較 =:(項1,項2)   項1=項2 ¥:(項1,項2)   項1キ項2 <=(項1,項2)   項1<=項2 >=(項1,項2)   項1>=項2 <:(項1,項2)   項1<項2 >:(項1,項2)   項1>項2 文字の比較 eq(項1,項2)   項1=項2 ne(項1,項2)   項1キ項2 [ 算術 ] 項1,項2で四則演算をし結果を項3に代入する。項3は必ずレジスタを指定。 add(項1,項2,項3)   項1+項2=項3 mul(項1,項2,項3)   項1*項2=項3 div(項1,項2,項3)   項1/項2=項3 sub(項1,項2,項3)   項1−項2=項3 mod(項1,項2,項3)   項1 mod 項2=項3 絶対値 ABS(代入されるレジスタ,対象) 対象の絶対値をレジスタに代入する。 対象が数値以外の時は0が代入される。 乱数 RND({代入されるレジスタ},{範囲となる整数}) 0から範囲となる整数の値の合いだの乱数をレジスタに代入する。 [ 表示 ] PRT(項1,項2,項3,...)   項を全て表示、表示の後改行しない。 PRC(項1,項2,項3,...)   項を全て表示した後改行する。 [ 入力 ] INP(項)    キーボードからの入力、項はレジスタのみ。 [ 代入 ] LD(項,項2)  項1に項2を代入、項1はレジスタ。 MOVE(項1,項2) 項2に項1からリストの左端の物を取りだし代入。 例   操作      LD(*A,1 2 3)   LD(*B,a b c)   MOVE(*A,*B)   結果   *A=2 3   *B=1 a b c リスト操作ステートメント LD({代入されるレジスタ},{代入される位置},{代入する項},{位置}) 位置としてLを指定すると最も左の位置を指定したのと同値 位置としてRを指定すると最も左の位置を指定したのと同値 代入が行なわれない場合には処理不可フラグが1となる。 例   操作    LD(*A,1 2 3)    LD(*B,a b c)    LD(*A,L,*B,2) 結果    *A=b 2 3    *B=a b c MOVE({代入されるレジスタ},{代入される位置},{代入する項},{位置}) 位置としてLを指定すると最も左の位置を指定したのと同値 位置としてRを指定すると最も左の位置を指定したのと同値 代入が行なわれない場合には処理不可フラグが1となる。 例   操作    LD(*A,1 2 3)    LD(*B,a b c)    MOVE(*A,L,*B,2) 結果    *A=b 1 2 3    *B=a c リストの結合 APP(代入されるレジスタ,結合する項) 代入するレジスタの内容のリストに結合する項をリストとしてつなぐ。 リスト、文字列の長さ LEN({代入されるレジスタ},{対象となる項},{機能}) 機能  L  対象となる項のリストの個数をレジスタに代入する。     S  対象となる項の文字列の文字の数をレジスタに代入する。 リストの並べ変え SORT(レジスタ) レジスタ内容のリストをASCIIコード順に並べ変えを行ない同名のレジスタに代入する。 文字列操作 代入が行なわれないと処理不可フラグが1となる。 LEFT$(代入されるレジスタ,対象となる項,文字数) RIGHT$(代入されるレジスタ,対象となる項,文字数) MID$(代入されるレジスタ,対象となる項,位置,文字数) 位置は整数で指定。 [ 探索用ステートメント ] 探索桁 X(レジスタ) 現在の探索桁をレジスタに代入する。 レジスタ数 P(レジスタ) 現在の探索桁に存在するレジスタ数を返す。 探索目標 GOAL 引数はない。 このステートメントを実行すると適用した作用素の番号、それぞれの探索桁のレジスタを表示、探索を終了する。 このステートメントは作用素中で用いる事はしない。 パターンマッチ CC(レジスタ1,レジスタ2,レジスタ3,....) 作用素の先頭のみに許されるステートメントである。 パターンマッチ可能なレジスタに対してパターンマッチを行ない、作用素内の次のステートメントを実行する。 このステートメントに与えられた引数に対して全ての組合せのパターンマッチを行なう。 例   *A+1+3   *A+2+2   *A+3+1 上記のレジスタに対して CC(*A+*B+*C)−PRC(*B,*C)                         の作用素を適用する。 *B、*Cレジスタは*Aの添字に対しパターンマッチを行なう。 この場合、   *B=1  *C=3  としてつぎのPRCステートメントを実行する場合   *B=2  *C=2  としてつぎのPRCステートメントを実行する場合   *B=3  *C=1  としてつぎのPRCステートメントを実行する場合 の3つの組合せがある。 探索実行ステートメント 評価関数探索 GUESS({作用素ファイル},{探索条件}) 現在のモデル世界に対してどの程度、探索条件を達成しているかが評価関数とする。探索はこの評価関数に従って、評価関数値の高い作用素から先に適用する。 評価関数は、探索条件その物が達成できた数、内部評価関数、別に定義する物の2つ種類がある。外部評価関数 外部評価関数定義 EST({機能},{評価関数となるステートメント}) 機能 {c}クリア {w}書込 レジスタ、*ESTの値を評価関数として探索に用いる。 *ESTの値をユーザーは任意に定義する。 段階探索 GUESS2({最大組合せ数},{作用素ファイル},{探索条件}) 探索を行なう際の作用素の適用回数を予め設定する。作用素ファイルと探索条件の設定の仕方は他の探索ステートメントと同じである。 段階探索では、評価関数を使用するのではなく、一つ一つの探索条件を満たしながら探索を行なう事で最終的に探索条件全体を達成する作用素列を探すステートメントである。 コマンドの説明 コマンドは入力直後に直接実行される。 ほとんどのコマンドをBASICのインタープリタのものと似せて作ってあるが、4文字を超えるものは短略してある。 探索の実行 探索制御する手順を実行する RUN Z 作用素や探索の制御手順データの編集に使用する。 便宜上つけてある行番号を一つ空ける。 N88BASICでLINEINPUTでスクリーンエディタを使用する場合に 使用する。 N88BASIC以外の新しいBASICで使用する場合には、あらかじめ他のエディタを使用してデータを書くほうが効率が良い。 例 1 LD(*A,1) 2 LD(*B,2) 3 LD(*C,3) Z2 1 LD(*A,1) 2 3 LD(*B,2) 4 LD(*C,3) + 作用素編集画面に移動する。作用素編集画面でこのコマンドを使用するともとの画面に戻る。 * レジスタの内容表示 *Aを実行するとX=0のレジスタの値が表示される。 new 作用素や探索実行手順の消去 LIST リストの表示、Microsoft系のBASICに準拠している。 例 LIST 全部のリストの表示、「1」を押すことで表示を中断する。 LIST5 5番目の行のリストを表示する。 LIST −5 5番目までのリストの表示 LIST 2−5 2番目から5番目迄のリストの表示 LIST 5− 5番目以降のリストの表示 LLIS BASICインタープリタでのLLISTの意味である。 プリンターにリストを表示する。 実行にはLPRINTを使用しているのでどのBASICでも問題無いと思われる。 SAVE[ファイル名] データの保存 コマンドの直後にファイル名を入れること。スペースを入れると読み込む事が出来ない。その他はドライブディレクトリの指定も可能である LOAD[ファイル名] データファイルの読み込み コマンドの直後にファイル名を入れること。スペースを入れると読み込む事が出来ない。 MERG[ファイル名] ファイルの連結 現在あるデータに指定したファイルを連結する。 コマンドの直後にファイル名を入れること。スペースを入れると読み込む事が出来ない。 FILE ディレクトリのファイル内容の表示 注釈 「’」 注釈の先頭に用いる。探索の制御ファイルでのみ使用できる。作用素ファイルには使用できない。 例 '     作用素ファイル '     最短の距離を求める。 ' ' LD(*X,18)-LD(*Y,4) EST(w,LD(*L,*X)-sub(*L,15,*L)-mul(*L,*L,*L)) EST(w,LD(*L1,*Y)-sub(*L1,7,*L1)-mul(*L1,*L1,*L1)) EST(w,add(*L,*L1,*L)-sub(50,*L,*L)-LD(*EST,*L)) GUESS(DIST,eq(*X,15)-eq(*Y,7)) 動作がインタープリタであるので作用素中に使用すると計算量が増えるために使用できないようにしている。 11.あとがき  作用素ファイルは他にも色々とあったのであるが、Versionが合わないものや、実行にとても時間が掛るものであり、直に動作したものはこれらのものだけであった。  草稿として書いたものはテキストで合計600KBytes有ったのであるが、不用な部分を削除して見るとだいぶ少ないものになってしまった。 まとめすぎて少なすぎたのではないだろうかと思う。要らないと思う部分が全体を構成する上で必要なのではないかとも思う。 この文章は記号レベルでの推論についてまとめたものである。実世界には対象と言う確立されたものは無く、対象を確立して行くことが必要と成る。 対象が確立されたものとしてではなく、対象と成るものをどの様に見出すかと言うことを次にまとめて見ようと考えている。 実世界を扱うにはビットマップレベルのデータを扱う必要が有る。そこで、ニューラルネットや検索テーブルを用いて記録パターンを検索する方法、差分エンジンを構成することを考える。 12.「プログラム作成プログラム」のソースリスト このソースリストはN88BASICかQick Basic 4.5で使用することを前提としている。 このプログラムは制作を開始したのが1985年であり、最終的にソースを改変したのが1992年である。かなり以前に制作し、Verの変更も有ったのでこの言語で使用する作用素データは色々有るのであるが、今回のVer7.2で使用できるものには数が限られている。 プログラムそのものには特に見るべき技術は無いが、知識表現の為の一つの考え方としての試作品として見てもらいたい。 あくまで、この言語は過渡的なものであり完成は有りえない。 F−BASIC386やF−BASIC95forWindowsでは以下の変更が必要である。この変更により動作可能である事を確認しているが、個別の機種に対してはそれぞれのコンパイラで行なう方がより安定な動作が望めるであろうと思われる。 235 ON ERROR GOSUB 30000 30000 KILL TMP$:RESUM