作:高橋 明
Oh!MZ 1985年12月号掲載
★ダウンロード
ヘッダなし | 18バイトヘッダ付き | MZTファイル |
★プログラム情報
プログラム | 3000〜551Fh |
コールドスタート | 3000h |
ホットスタート | 3002h |
★解説
PrologはLispと並ぶAI言語です。「〜は〜である(〜が〜であることは真である)」という定義づけをベースにして、これを逆に検索できる機能(推論しているとも言える)を備えることで、少ない文で複雑な処理を行なわせることができるようになっているプログラミング言語です。現在は一時の人工知能ブームとも言えるような過熱ぶりは影を潜め、LispもPrologも昔ほどは注目されなくなってしまいましたが、それでもネット上には入門編を含め様々な情報がありますので、探してみるとよいでしょう。
Prolog-85はOh!MZ・1985年9月号に掲載されたMZ-1500用PrologをS-OS用に移植されたものです。MZ-1500版ではサウンドやRAMファイルなどをサポートしたものだったのですが、S-OS版はそれらの機種固有の機能を削除したものとなっています。
文法上の注意点と制限事項は次の通りです。
プログラム編集のためのコマンドがあります。次にその一覧を示します。
名前 | 省略形 | 機能 | |
LIST | LI | プログラムをCRTへリストする | リスト中にキー入力があった場合リストを一時停止、停止状態からスペースキーでリストは再開、その他のキーでプログラムのリストは中止 |
LIST/P | LIP | プログラムをプリンタへリストする | |
LIST- | LI- | プログラムを途中からCRTへリストする | |
LOAD | LO | プログラムをロードする | 前のプログラムは消去 |
SAVE | SA | プログラムをセーブする | |
NEW | NE | プログラムをクリアする | |
APPEND | AP | プログラムを追加する | |
LIST X | LIX | Appendixの各プログラムの最初の節を表示する | |
APPEND X | APX | Appendixからのプログラム追加 | 各プログラムの述語名を入力(ほかの述語と区別がつけば1文字でもOK)すること |
INSERT | IN | 1行プログラムを挿入する | |
ERASE | ER | 1行プログラムを消去する | |
ERASE- | ER- | 複数行のプログラムを消去する | |
SEARCH | SE | 文字列をプログラム中から検索し表示する | |
REPLACE | RE | プログラム中の文字列を交換する | |
RUN | RU | プログラムの実行 | この時ゴール節がなければ?を表示 |
ANOTHER | AN | 実行終了後、ほかの解を求める | |
CONT | CO | 実行中断後の実行を再開する | 中断はスペースキー |
TRACE | TR | トレースモードの表示 | |
TR0 | 実行結果のみ表示 | ||
TR1 | パターンマッチした節のプログラム番号を表示 | ||
TR2 | ゴール節とパターンマッチした節を表示 | ||
SIZE | SI | メモリの使用状態の表示 | プログラム 使用バイト/未使用バイト 行数 スタック 使用バイト/未使用バイト スタック数 |
プログラム中で使える組込み関数というものがあります。それぞれ以下のような機能を持っています。
記号 | 機能 | 例 |
比較(実行時値が入っていること) | ||
= | 左辺と右辺が等しい | 3 = 3. |
=/ | 左辺と右辺が等しくなし | 3 =/ 4. |
> | 左辺が右辺より大きい | 3 > 2. |
>= | 左辺が右辺より大きいか等しい (大小比較の時文字の場合は先頭の文字のアスキーコードで比較) |
3 >= 3. |
四則演算 | ||
+,−,*,/ | 実行時の変数は1個以下 演算子は右辺にあること |
5 = 3 + 2. @X = 3 + 2. 5 = @X + 2. 5 = 3 + @X. |
入出力 | ||
INPUT | 文字列の入力 | INPUT( @X ). |
文字列の出力(CRT) | PRINT( ABC ). | |
PRINT/P | 文字列の出力(プリンタ) | PRINT/P( ABC ). |
CLS | 画面のクリア | CLS. |
CURSOR | カーソル移動 | CURSOR( 10, 5 ). |
プログラムの編集 | ||
ASSERT | プログラムの追加 引数は節の形をしていること |
ASSERT( F( X ) < . ). |
RETRACT | パターンマッチする最初の節の消去 | RETRACT( F( @X ) ). |
CLAUSE | 第一引数にパターンマッチする節の本体をリストの形で返す 本体がない場合は空きリスト ( ) を返す |
CLAUSE( A, @B ). |
文字列 | ||
VAR | 引数が変数のとき成功 | VAR( @X ). |
EXPLODE | アトムを1文字ごとのリストに変換 ABC → ( A, B, C ) |
EXPLODE( ABC, @X ). |
IMPLODE | リストをアトムへ変換 ( A, B, C ) → ABC |
IMPLODE( ( A, B, C), @X ). |
CONVERT | 文字列中の空白を , に替える A B C → ( A, B, C ) |
CONVERT( ( A B C ), @X ). |
メモリ | ||
PEEK | メモリのデータを返す 第2引数は変数であること |
PEEK( 10進アドレス, @X ). |
POKE | メモリにデータを入れる | POKE( 10進アドレス, 0 ). |
USR | マシン語プログラムの実行 | USR( 8189 ). |
制御 | ||
FALSE | 必ず失敗する述語 | |
! | カットオペレータ 右の例は!をすぎてDで失敗するとバックトラックはCまでする。Cが失敗するとBはバックトラックせずAが失敗する |
A < B, ! C, D. |
!! | カットオペレータ 右の例は!をすぎてDで失敗するとCをバックトラックせずBのバックトラックをする。 |
A < B, !!, C, D. |
また、Appendixとして次のプログラムがシステムに登録されています。使用するには、APPEND Xコマンドで自分のプログラムに追加します。
機能 | |
TRUE | 常に成功する述語 |
NOT( P ) | Pの成功と失敗を反転する Pの中に変数が含まれているとnot anyの意味になる |
IF( A, B, C ) | Aが真の時Bを実行し、 Aが偽の時Cを実行する |
REPEAT( N, P ) | N回だけPを実行する(Nは自然数であること) |
WHILE( P, Q ) | Pが真の間Qを実行する |
ADD( A, B, C ) | 要素AをリストBの先頭に付けてCとする |
MEMBER( A, B ) | 要素AがリストBに含まれているとき成功する |
APPEND( A, B, C ) | リストAとリストBをつなぎリストCとする |
SELECT( A, B, C ) | 要素AをリストBの中から選ぶ (CはBからAを除いた残りのリスト) |
FINDALL( A, B, C ) | Bが成功するすべての場合のAのリストCを返す |
AND( A, B, …, X ) | A〜Bのすべてが成功したとき成功する |
OR( A, B, …, X ) | A〜Bのいずれかが成功したとき成功する |
★カスタマイズ
プログラム領域とスタック領域の分割点がワークエリア510Ahにあります。但しここはプログラム起動後初期化されてしまうので、プログラム中で書き換えるか、起動後一度モニタに戻って書き換えた後ホットスタートすることが必要でしょう。