Prolog-85

作:高橋 明
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版はそれらの機種固有の機能を削除したものとなっています。
 文法上の注意点と制限事項は次の通りです。

  1. 頭部(Head)と本体(Body)の間の記号は"<"です。
  2. 使用する文字は英大文字と数字です。
  3. @で始まる文字列を変数とみなします。
  4. カッコはすべて"("と")"を使います。
  5. 四則演算と大小比較は中間記法です。
  6. カットオペレータは"!"です。
  7. CLAUSE文で呼び出される節の本体はリスト表現になっています。
  8. 扱える数値は0〜65535の正の整数
  9. 節の長さは511バイト以内
  10. スタック数は511ステップ以内
  11. プログラム領域は8Kバイト
  12. スタック領域は17〜33Kバイト(スタックの上限は各機種で異なる)

 プログラム編集のためのコマンドがあります。次にその一覧を示します。

名前 省略形 機能
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 ).
PRINT 文字列の出力(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にあります。但しここはプログラム起動後初期化されてしまうので、プログラム中で書き換えるか、起動後一度モニタに戻って書き換えた後ホットスタートすることが必要でしょう。