home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 3 / FreeSoftwareCollection3pd199x-jp.img / towns_os / quasar / manual.doc < prev    next >
Text File  |  1980-01-02  |  147KB  |  4,222 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.              Quasar Prolog ユーザーズ・マニュアル
  22.                         (Version 0.36)
  23.  
  24.                              1990年 9月版
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.                              Copyright (C) 1990
  45.                                  硴崎 賢一
  46.                             All rights reserved.
  47.  
  48.                              電子メイルアドレス
  49.                                 junet: kakizaki@cse.kyutech.ac.jp
  50.                           NIFTY-Serve: PBB00353
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108. ----------------------------------------------------------------------------
  109. 商標
  110. ----------------------------------------------------------------------------
  111.  
  112.  MS-DOS は米国マイクロソフト社の登録商標です.
  113.  UNIX オペレーティング・システムは,AT&T のベル研究所が開発し,AT&T がライセ
  114. ンスしています.
  115.  PS/55 は米国 IBM 社の商標です.
  116.  その他,本文書で使用しているシステム名,製品名は一般に各開発メーカーの登録
  117. 商標です.
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129. Quasar Prolog ユーザーズマニュアル                                      目次
  130.  
  131.  
  132.                             -  目  次  -
  133.  
  134.  
  135.  
  136.  
  137. 0. はじめに   .......................................................    1
  138.   0.1 Quasar Prologの特徴と概要   .....................................    3
  139.   0.2 用語と表記法   ..................................................    5
  140.  
  141. 1. 使用環境の構築   .................................................    6
  142.   1.1 MS-DOS版   ................................................    6
  143.   1.2 TOWNS-OS版   ............................................    7
  144.   1.3 UNIX版   ....................................................    8
  145.   1.4 端末装置に関して   ..............................................   10
  146.  
  147. 2. Quasar Prologの起動と終了   .........................   11
  148.   2.1 Quasar Prologの起動   ..............................   11
  149.   2.2 Quasar Prologの終了   ..............................   11
  150.   2.3 起動時のオプション   ............................................   12
  151.   2.4 初期化ファイル   ................................................   12
  152.  
  153. 3. プログラムの入力と実行   .........................................   14
  154.   3.1 プロンプト   ....................................................   14
  155.   3.2 プログラムの入力   ..............................................   14
  156.   3.3 プログラムの実行   ..............................................   15
  157.   3.4 実行の中断   ....................................................   16
  158.   3.5 対話内容の記録   ................................................   17
  159.  
  160. 4. DEC-10 PROLOGとの互換性   ...........................   19
  161.   4.1 データ型   ......................................................   19
  162.   4.2 シンボル型データの構成文字   ....................................   20
  163.   4.3 述語   ..........................................................   20
  164.   4.4 互換用プログラム   ..............................................   21
  165.  
  166. 5. 文法   ...........................................................   22
  167.   5.1 データ型   ......................................................   22
  168.   5.2 演算子   ........................................................   26
  169.     5.2.1 演算子の型と優先順位   ......................................   26
  170.     5.2.2 演算子の優先順位   ..........................................   26
  171.     5.2.3 演算子の結合性   ............................................   26
  172.     5.2.4 構造の引数における演算子   ..................................   27
  173.     5.2.5 演算子とファンクタ   ........................................   28
  174.     5.2.6 演算子の定義と調査   ........................................   28
  175.   5.3 注釈の記述   ....................................................   29
  176.  
  177. 6. プログラムの構成と実行規則   .....................................   30
  178.   6.1 プログラムの構成   ..............................................   30
  179.   6.2 プログラムの実行規則   ..........................................   30
  180.   6.3 基本処理   ......................................................   32
  181.   6.4 条件判断   ......................................................   32
  182.   6.5 繰り返し   ......................................................   33
  183.     6.5.1 repeat/*による繰り返し   ............................   33
  184.     6.5.2 for/*による繰り返し   ..................................   34
  185.   6.6 非局所脱出   ....................................................   34
  186.   6.7 その他   ........................................................   35
  187.  
  188.  
  189.                                 - 1 -
  190.  
  191.  
  192. Quasar Prolog ユーザーズマニュアル                                      目次
  193.  
  194.  
  195.     6.7.1 ゴールの呼出   ..............................................   35
  196.     6.7.2 否定   ......................................................   35
  197.     6.7.3 処理系制御   ................................................   35
  198.  
  199. 7. 内部データベースの操作   .........................................   36
  200.   7.1 動的述語と静的述語   ............................................   36
  201.   7.2 内部データベースへの追加   ......................................   37
  202.   7.3 内部データベースからの削除   ....................................   37
  203.   7.4 内部データベースの参照   ........................................   37
  204.  
  205. 8. プログラムの読み込みと表示   .....................................   38
  206.   8.1 プログラム読み込み述語   ........................................   38
  207.   8.2 拡張子の自動補完   ..............................................   39
  208.   8.3 プログラムの読み込み時のエラーと警告   ..........................   39
  209.   8.4 プログラムの書き換えと変換   ....................................   40
  210.   8.5 プログラムの表示   ..............................................   40
  211.     8.5.1 述語定義の表示   ............................................   40
  212.     8.5.2 シンボル情報の表示   ........................................   40
  213.  
  214. 9. ファイルとストリーム   ...........................................   42
  215.   9.1 ファイル名   ....................................................   42
  216.     9.1.1 一般のファイル   ............................................   42
  217.     9.1.2 特殊ファイル   ..............................................   42
  218.   9.2 ストリーム   ....................................................   42
  219.   9.3 ファイルのオープンとクローズ   ..................................   43
  220.     9.3.1 ファイルのオープン   ........................................   43
  221.     9.3.2 ファイルのクローズ   ........................................   43
  222.   9.4 ストリームに関する問い合わせ   ..................................   43
  223.   9.5 標準入出力の操作   ..............................................   45
  224.     9.5.1 標準入出力   ................................................   45
  225.     9.5.2 標準入出力の切り替え   ......................................   45
  226.   9.6 入出力操作   ....................................................   46
  227.     9.6.1 入力操作   ..................................................   46
  228.     9.6.2 出力操作   ..................................................   46
  229.     9.6.3 書式指定を用いた出力   ......................................   47
  230.  
  231. 10. ファイルとディレクトリの操作   .................................   49
  232.   10.1 ファイルの操作   ...............................................   49
  233.   10.2 ディレクトリの操作   ...........................................   49
  234.  
  235. 11. 算術演算   .....................................................   50
  236.   11.1 算術演算を行う述語   ...........................................   50
  237.   11.2 データ型   .....................................................   50
  238.   11.3 算術演算子   ...................................................   51
  239.     11.3.1 単項演算子   ...............................................   51
  240.     11.3.2 二項演算子   ...............................................   51
  241.     11.3.3 演算子の優先順位   .........................................   51
  242.   11.4 算術関数   .....................................................   52
  243.   11.5 引数と演算結果のデータ型   .....................................   52
  244.     11.5.1 算術演算子   ...............................................   53
  245.     11.5.2 関数   .....................................................   53
  246.   11.6 算術エラー   ...................................................   54
  247.   11.7 数値の有効精度   ...............................................   54
  248.   11.8 算術演算を行う上での注意   .....................................   55
  249.  
  250.  
  251.  
  252.                                 - 2 -
  253.  
  254.  
  255. Quasar Prolog ユーザーズマニュアル                                      目次
  256.  
  257.  
  258. 12. デバッガ   .....................................................   56
  259.   12.1 PROLOGにおけるバグ   .....................................   56
  260.   12.2 エラーの検出   .................................................   56
  261.   12.3 デバッガの利用   ...............................................   58
  262.   12.4 デバッグモード   ...............................................   58
  263.   12.5 トレース   .....................................................   59
  264.     12.5.1 トレースポートとトレースコマンド   .........................   59
  265.     12.5.2 トレースコマンドの使用法   .................................   60
  266.     12.5.3 トレース対象にならない述語   ...............................   61
  267.   12.6 スパイポイント   ...............................................   61
  268.   12.7 ブレーク   .....................................................   62
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.                                 - 3 -
  316.  
  317.  
  318. Quasar Prolog ユーザーズマニュアル                                  はじめに
  319.  
  320.  
  321. ----------------------------------------------------------------------------
  322. 0. はじめに
  323. ----------------------------------------------------------------------------
  324.  
  325.  Quasar Prolog の世界へようこそ.
  326.  Quasar Prolog は,多くのパーソナルコンピュータやワークステーション上で PRO
  327. LOG 言語の高い機能を利用できる本格的な処理系です.
  328.  PROLOG は第5世代コンピュータの言語として採用されたこともあって,人工知能用
  329. の言語として広く知られるようになりました.一方で,第5世代コンピュータプロジ
  330. ェクトが開始された当初の熱狂も醒め,PROLOG を使用すればすべて人工知能であるよ
  331. うな錯覚や,PROLOG でできないことはないという過度の期待なども影を潜めたように
  332. 思います.また,最近では,PROLOG について書かれた書籍がたくさん出版されるよう
  333. になり,PROLOG について勉強する環境が整ってきたといえるでしょう.コンピュータ
  334. が広く利用されるようになったことと相俟って,PROLOG に興味を持つ人も多いことで
  335. しょう.
  336.  このような状況のもとに,他のさまざまなコンピュータ言語と同様に,PROLOG がプ
  337. ログラミング言語の一つとして自然に受け入れられる時期が来たように思います.こ
  338. れからは,問題となる対象の性質に応じて,PROLOG が適している場合には PROLOG を
  339. 用い,そうでなければ,そのほかのもっとも適した言語を用いるということが,ごく
  340. 普通に行われるようになるものと期待しています.このような状態になるためには,
  341. その前提として,他の多くの言語の教育が行われているのと同様に PROLOG が使用で
  342. きるような教育が行われることが要求されます.このように考えたときに,今もっと
  343. も不足しているものは,教育の場で広く利用することができる PROLOG 処理系である
  344. と思われます.
  345.  大学に設置されている計算機センターで PROLOG を利用することができるところも
  346. 多いと思われますが,多くの参考書に記述されている標準的な文法や機能を利用する
  347. ことができなかったり,メモリの使用量が大きいために多くの利用者が一度に利用で
  348. きないなどのさまざまな制約があり,十分な環境が整っているとはいえない状況です.
  349. このような状況を少しでも改善したいという希望のもとに配布するのが,Quasar Pro
  350. log です.
  351.  Quasar Prolog は,ワークステーションなどの高機能マシン上で使用することがで
  352. きるのはもちろんですが,むしろ,膨大な設置台数を誇っているパーソナルコンピュー
  353. タ上で利用できるということの方が大きな特徴であると思っています.最近の計算機
  354. センターで,端末専用機を使用するよりもパーソナルコンピュータを端末として流用
  355. することが多くなっているようです.このような構成を取っている計算機センターで
  356. は,端末をローカル使用に切り替えることによって,一般的なパーソナルコンピュー
  357. タとして利用することができます.この機能を利用してパーソナルコンピュータ上で
  358.  Quasar Prolog を使用すれば,ホストマシンの負荷を気にすることなく,数十台のマ
  359. シンで PROLOG を利用することができ,1クラス全員を対象とした授業と演習を行う
  360. ことが可能になります.また,それぞれの研究室にあるパーソナルコンピュータや,
  361. 学生が個人的に所有するパーソナルコンピュータを利用して,いつでも PROLOG を利
  362. 用できるということは,PROLOG に熟達した学生が増加するというだけでなく,PROLO
  363. G がごく普通のプログラミング言語であるという意識を広げるのに役立つことでしょ
  364. う.
  365.  Quasar Prolog は,パーソナルコンピュータ上でしか利用できない処理系ではなく,
  366. ワークステーション上でも利用することができます.したがって,学生が授業で学習
  367. した後に,所属した研究室で本格的に PROLOG を利用したい場合には,高速・大容量
  368. のワークステーション版 Quasar Prolog を利用することができます.パーソナルコン
  369. ピュータ版とワークステーション版は,同一の文法と機能を持っているために,使用
  370. 者は違和感なくスムーズに移行することができますし,すでに作成しているプログラ
  371. ムもなんら変更を加えることなくそのまま利用することができます.
  372.  Quasar Prolog はまだ開発途上で,不足する機能や障害が多々あると思われますが,
  373. 前述のように広く利用していただける環境を早く提供したいと思い,あえて公開しま
  374. した.Quasar Prolog を使用することによって,PROLOG の面白さや強力さを直に体験
  375. し,プログラミング言語の一つとして PROLOG を縦横に使いこなせる人がたくさんう
  376.  
  377.  
  378.                                 - 1 -
  379.  
  380.  
  381. Quasar Prolog ユーザーズマニュアル                                  はじめに
  382.  
  383.  
  384. まれることを期待します.
  385.  
  386. 参考文献
  387.  PROLOG の学習に適した参考文献を以下に示しますので,興味のある方は参考にして
  388. ください.これらの書籍は,初心者にとって必ずしもわかり易いとはいえませんが,
  389. 内容が正確で PROLOG で利用されるプログラミング技法の多くが示されており,PROL
  390. OG である程度の大きさのプログラムを記述する際に非常に役に立ちます.これらの書
  391. 籍に記述されているプログラムの多くは,述語名やデータ表現に一部異なるところが
  392. ありますが,ほぼそのまま動かすことができます.
  393.  
  394. Prologプログラミング
  395.     W.F.Clocksin, C.S.Mellish著
  396.     中村克彦訳
  397.  
  398. Prologの技芸
  399.     Leon Sterling, Ehud Shapiro著
  400.     松田利夫訳
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.                                 - 2 -
  442.  
  443.  
  444. Quasar Prolog ユーザーズマニュアル                                  はじめに
  445.  
  446.  
  447. 0.1 Quasar Prologの特徴と概要
  448. ----------------------------------------------------------------------------
  449.  
  450.  Quasar Prolog は,ワークステーションはもちろん,パーソナルコンピュータ上で
  451. も利用できるように設計された高速・省メモリの PROLOG インタプリタです.パーソ
  452. ナルコンピュータ用のシステムは,ワークステーション上のインタプリタに匹敵する
  453. 処理速度を持っていますし,ワークステーション用のシステムは従来のインタプリタ
  454. 以上の処理速度と充実した機能を持っています.また,さまざまなクラスのコンピュー
  455. タで同一のプログラムを動かすことができるという利点もあります.
  456.  Quasar Prolog はさまざまな特徴を持っていますが,それらの特徴のうち主なもの
  457. を以下に示します.
  458.  
  459. 1)ワークステーションとパーソナルコンピュータで同一の処理系を利用できる.
  460. 2)処理速度が高く,メモリ効率がよい.
  461. 3)文法と機能が DEC-10 PROLOG に準拠している.
  462. 4)浮動小数演算ができ,豊富な算術関数を利用できる.
  463. 5)文字データを分かりやすく記述でき,漢字も使用できる.
  464. 6)デバッグ用の豊富な機能を用意している.
  465. 7)非営利的な利用に関しては基本的に無料である.
  466.  
  467.  
  468. 1)ワークステーションとパーソナルコンピュータで同一の処理系を利用できる.
  469.  多くの PROLOG 処理系は,ワークステーション用のものはパーソナルコンピュータ
  470. 上で使用できませんでしたし,その逆もできませんでした.このため,使用するコン
  471. ピュータに応じて,機能がさまざまに異なる処理系を使用せざるを得ませんでした.
  472. Quasar Prolog は機種依存性が少なく,ワークステーションでもパーソナルコンピュー
  473. タでも同じ様に利用することができるように構築されています.このため,PROLOG に
  474. おけるソフトウェアバスとして使用することができます.
  475.  
  476. 2)処理速度が高く,メモリ効率がよい.
  477.  従来の PROLOG インタプリタと比較して,処理速度とメモリ効率が共に向上してい
  478. ます.
  479.  一般的に,PROLOG は多量のメモリを必要とするために,パーソナルコンピュータを
  480. はじめとする小規模なコンピュータでは,練習問題程度の簡単なプログラムしか動か
  481. すことができないとされてきました.しかしながら,Quasar Prolog はメモリ効率が
  482. よいために,使用できるメモリ容量が比較的少ないコンピュータでも,大きなプログ
  483. ラムを効率よく実行させることができるようになっています.
  484.  また,MS-DOS 用の Quasar Prolog は,セグメントの制約に束縛されずに,実装さ
  485. れている全てのメモリを使用できるように構築されています.たとえば,多くの MS-
  486. DOS 用の PROLOG インタプリタでは,プログラムを実行するために必要なコード,デー
  487. タ,スタックなどの各領域の容量がそれぞれ64Kバイト以下に制限されていたため
  488. に,すぐにメモリがなくなってプログラムを実行できない場合が多発していました.
  489. Quasar Prolog では,このような問題の発生を低く抑えることができます.また,同
  490. 一のプログラムであれば,従来の処理系と比較してより少ないメモリで実行させるこ
  491. とができます.
  492.  
  493. 3)文法と機能が DEC-10 PROLOG に準拠している.
  494.  PROLOG の文法や機能は,DEC-10 PROLOG のそれが標準的なものとされています.Q
  495. uasar Prolog の文法は,この文法に準拠しているため,これまでに作成されている多
  496. くのプログラムを比較的容易に移植し,利用することができます.
  497.  
  498. 4)浮動小数演算ができ,豊富な算術関数を利用できる.
  499.  数値として,整数値と共に浮動小数値を使用することができます.従来の PROLOG 
  500. 処理系には,数値として整数しか利用できないものが多く,浮動小数値演算を伴う工
  501. 学的な用途に使用できないという問題がありました.Quasar Prolog は,浮動小数演
  502.  
  503.  
  504.                                 - 3 -
  505.  
  506.  
  507. Quasar Prolog ユーザーズマニュアル                                  はじめに
  508.  
  509.  
  510. 算を行うことができる上に,三角関数や指数関数などの豊富な算術関数群を利用でき
  511. るようになっており,数値演算を必要とするさまざまな分野で利用できるようになっ
  512. ています.
  513.  
  514. 5)文字データを分かりやすく記述でき,漢字も使用できる.
  515.  多くの PROLOG 処理系は,記号処理用のシステムであるにも関わらず,文字を操作
  516. する場合にプログラム中で文字を分かりやすく表現する機能を持っていません.文字
  517. を対象として操作や入出力を行う場合には,対象となる文字を ASCII コード(数値)
  518. で指定するようになっています.このため,プログラムの書き易さと読み易さが著し
  519. く損なわれているという問題があります.
  520.  Quasar Prolog では,文字をデータ型として追加しており,漢字も含めてわかりや
  521. すく記述できるようになっています.
  522.  
  523. 6)デバッグ用の豊富な機能を用意している.
  524.  Quasar Prolog には,標準的なポートデバッガのほかに,デバッグを支援するさま
  525. ざまな機能が用意されています.
  526.  未定義の述語が呼び出されたことや,未使用の変数が存在することを検出する機能
  527. が用意されています.また,複数のファイルにまたがって定義されている述語を検出
  528. する機能も用意されています.
  529.  また,PROLOG 処理系の多くは,プログラムが処理系の中に読み込まれると,ソース
  530. ファイルに書かれていた変数名が失われてしまい,プログラムを表示させた場合に無
  531. 意味な変数名で表示されるようになっています.Quasar Prolog では,プログラムが
  532. 読み込まれた後にも変数名が保存されているため,プログラムを表示するときにもそ
  533. のまま変数名が表示されます.
  534.  
  535. 7)非営利的な利用に関しては基本的に無料である.
  536.  Quasar Prolog は,公的教育機関あるいは公的研究機関においては無料で使用する
  537. ことができます.特に教育機関では,学生用に数十あるいは数百のコピーが必要な場
  538. 合でも,ライセンス料が不用なので安心して利用することができます.
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.  
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.                                 - 4 -
  568.  
  569.  
  570. Quasar Prolog ユーザーズマニュアル                                  はじめに
  571.  
  572.  
  573. 0.2 用語と表記法
  574. ----------------------------------------------------------------------------
  575.  
  576. ○ 述語の略記
  577.  
  578.  述語の機能などを説明する際に,ファンクタとアリティに着目しており,引数の入
  579. 出力などが説明の対象になっていない場合には,述語の簡略記法として,‘ファンク
  580. タ/アリティ’という形式で述語を表します.例えば,check(Arg1, Arg2) のように
  581. 2つの引数を持つ述語は,check/2 という形式で示されます.
  582.  また,例えば,同じ pred というファンクタでアリティが異なる述語を総称して示
  583. す場合には,pred/* という表記でそれらの述語全体を表します.
  584.  
  585.  
  586. ○ 引数の表記
  587.  
  588.  PROLOG の述語の引数は,述語に値を渡すための入力引数として使用される場合と,
  589. 述語から値を受け取るための出力引数として使用される場合があります.リファレン
  590. スマニュアルでは,各引数が入力として使用されるのか,出力として使用されるのか
  591. を明示するために,各引数の頭に,以下のような記号を付加しています.
  592.  
  593. +    入力引数(具体化されていない変数以外)
  594. -    出力引数(具体化されていない変数)
  595. ?    入出力
  596. +?    入力引数(基本的には入力だが,具体化されていない変数であっても構わない)
  597.  
  598. -?    出力引数
  599.  
  600.  
  601. ○ 制御文字の表記
  602.  
  603.  普通の画面に表示される文字のほかに,システムになんらかの指示を与えるために
  604. 使用される文字として,制御文字があります.制御文字は,CTRL-D, CTRL-Z のような
  605. 形で表します.制御文字を入力する場合には,キーボードの左側にある CTRL キーを
  606. 押したままで,入力したい制御文字に対応した文字キーを押します.例えば,CTRL-D
  607.  を入力する場合には,CTRL キーを押したままで D のキーを押します.
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.                                 - 5 -
  631.  
  632.  
  633. Quasar Prolog ユーザーズマニュアル                                  はじめに
  634.  
  635.  
  636. ----------------------------------------------------------------------------
  637. 1. 使用環境の構築
  638. ----------------------------------------------------------------------------
  639.  
  640.  Quasar Prologを使用するのに先立ち,使用環境を構築する方法を以下に示します.
  641.  
  642.  Quasar Prologは UNIX ワークステーションと MS-DOS パーソナルコンピュータで使
  643. 用することができますが,それぞれで使用環境の構築法が少し異なっています.ここ
  644. では,UNIX, TOWNS-OS と MS-DOS それぞれに分けて,使用環境の構築法を個別に示し
  645. ます.
  646.  
  647.  
  648. 1.1 MS-DOS版
  649. ----------------------------------------------------------------------------
  650.  
  651.  Quasar Prolog は,さまざまな場所に大量に導入されている MS-DOS を用いたパー
  652. ソナルコンピュータ上で使用することができます.個人的にパーソナルコンピュータ
  653. を持っている人は,自宅で Quasar Prolog の高い機能を利用することができるでしょ
  654. う.
  655.  
  656.  
  657. ○ ハードウェア
  658.  
  659.  Quasar Prolog は,パーソナルコンピュータに MS-DOS 用として実装されているメ
  660. モリが 512K バイト以上あれば動作は可能ですが,プログラム実行時の制約が非常に
  661. 大きくなるので,640K バイトの実装が望まれます.MS-DOS のプログラムの中には,
  662. メモリを最大限実装していてもその一部分しか使用しないものもありますが,Quasar
  663.  Prolog は実装している全てのメモリを有効に利用しますので,できるだけ 640K バ
  664. イトのメモリを実装してください.一般的には,現在のほとんどのパーソナルコンピ
  665. ュータがこの条件を満たしているので,問題はないものと思われます.
  666.  また,Quasar Prolog の使用時に必要性がないのであれば,日本語フロントエンド
  667. プロセッサ,RS-232C ドライバ,プリンタドライバなどの各種のデバイスドライバや,
  668. 常駐型プログラムなどを取り除いておけば,それだけ使用できるメモリが増加し,大
  669. きな PROLOG プログラムを実行できるようになります.
  670.  
  671. A)PS/55(日本IBM)
  672.  
  673. B)PC-9801(NEC)
  674.  PC-9801 シリーズのパーソナルコンピュータと,MS-DOS のバージョン 2.1 以上で
  675. 利用することができます.
  676.  
  677.  
  678. ○ Quasar Prologの導入
  679.  
  680.  圧縮ファイルの解凍
  681.  
  682.  Quasar Prolog を使用するのに必要なファイルと,それらの設定に関して説明しま
  683. す.Quasar Prolog を実行するためには,以下の3つのファイルが必要です.
  684. 1)QUASAR.EXE
  685. 2)QUASAR.IMG
  686. 3)QUASAR.MSG
  687.  
  688.  上記のファイルの簡単な説明をします.1)は,Quasar Prolog インタプリタの核
  689. になる実行形式のファイルです.2)は,組込み述語やライブラリが格納されている
  690. ファイルです.3)は,Quasar Prolog の実行時に表示されるエラーメッセージが格
  691.  
  692.  
  693.                                 - 6 -
  694.  
  695.  
  696. Quasar Prolog ユーザーズマニュアル                                  はじめに
  697.  
  698.  
  699. 納されているファイルです.
  700.  3)は,通常のテキストファイルなので,ディスプレイに表示させたりエディタで
  701. 編集したりすることが可能ですが,1),2)のファイルはそのようなことをするこ
  702. とはできませんので注意してください.
  703.  
  704.  これらのファイルを,Quasar Prolog 用に用意したディスクにコピーしてください.
  705. Quasar Prolog のファイルはそれほど大きくないので,ハードディスクでもフロッピー
  706. ディスクでも組み込んで使用することができます.しかしながら,フロッピーディス
  707. クに組み込んで使用する場合には,ディスクの読み込み速度が遅いために,Quasar P
  708. rolog の起動に要する時間がかなり長め(30秒前後)になってしまいます.したが
  709. って,ハードディスクを実装しているのであれば,できる限りハードディスクへ組み
  710. 込んで使用するようにしてください.また,フロッピーディスクで使用する場合には,
  711. 可能であれば RAM ディスクに Quasar Prolog をコピーして使用することを勧めます.
  712.  
  713.  Quasar Prolog の3つのファイルをコピーするディレクトリは,基本的には,a:\u
  714. sr\quasar を想定しています.ディスクの構成や容量などの制約で,このディレクト
  715. リに Quasar Prolog をコピーすることができない場合には,各自の都合に合わせて適
  716. 当に選んだディレクトリに格納して構いません.ただし,想定されているディレクト
  717. リ以外にコピーした場合には,そのディレクトリを環境変数 PATH に設定してくださ
  718. い.例えば,c:\usr1\prolog\quasar というディレクトリにファイルをコピーした場
  719. 合には,次のようなコマンドを実行して環境変数を設定してください.
  720.     PATH c:\usr1\prolog\quasar
  721. パスの設定は Quasar Prolog を使用する際に必ず必要になるので,AUTOEXEC.BAT の
  722. 中に記述しておくとよいでしょう.
  723.  
  724.  
  725. 1.2 TOWNS-OS版
  726. ----------------------------------------------------------------------------
  727.  
  728.  Quasar Prolog は,ハイパーメディアパソコン FM-TOWNS(富士通)上で使用するこ
  729. とができます.TOWNS 用の Quasar Prolog は,パーソナルコンピュータ上でありなが
  730. ら,ワークステーション上のシステムと同様に数Mバイトの広大なメモリ空間を使用
  731. することができます.
  732.  
  733.  
  734. ○ ハードウェア
  735.  
  736.  Quasar Prolog を使用するためには,2Mバイト以上のメモリを実装している必要
  737. があります.
  738.  
  739.  
  740. ○ Quasar Prologの導入
  741.  
  742.  圧縮ファイルの解凍
  743.  
  744.  Quasar Prolog を使用するのに必要なファイルと,それらの設定に関して説明しま
  745. す.Quasar Prolog を実行するためには,以下の3つのファイルが必要です.
  746. 1)QUASAR.EXP
  747. 2)QUASAR.IMG
  748. 3)QUASAR.MSG
  749.  
  750.  上記のファイルの簡単な説明をします.1)は,Quasar Prolog インタプリタの核
  751. になる実行形式のファイルです.2)は,組込み述語やライブラリが格納されている
  752. ファイルです.3)は,Quasar Prolog の実行時に表示されるエラーメッセージが格
  753. 納されているファイルです.
  754.  
  755.  
  756.                                 - 7 -
  757.  
  758.  
  759. Quasar Prolog ユーザーズマニュアル                                  はじめに
  760.  
  761.  
  762.  3)は,通常のテキストファイルなので,ディスプレイに表示させたりエディタで
  763. 編集したりすることが可能ですが,1),2)のファイルはそのようなことをするこ
  764. とはできませんので注意してください.
  765.  
  766.  これらのファイルを,Quasar Prolog 用に用意したディスクにコピーしてください.
  767. Quasar Prolog のファイルはそれほど大きくないので,ハードディスクでもフロッピー
  768. ディスクでも組み込んで使用することができます.しかしながら,フロッピーディス
  769. クに組み込んで使用する場合には,ディスクの読み込み速度が遅いために,Quasar P
  770. rolog の起動に要する時間がかなり長め(30秒前後)になってしまいます.したが
  771. って,ハードディスクを実装しているのであれば,できる限りハードディスクへ組み
  772. 込んで使用するようにしてください.また,フロッピーディスクで使用する場合には,
  773. 可能であれば RAM ディスクに Quasar Prolog をコピーして使用することを勧めます.
  774.  
  775.  Quasar Prolog の3つのファイルをコピーするディレクトリは,基本的には,a:\u
  776. sr\quasar を想定しています.ディスクの構成や容量などの制約で,このディレクト
  777. リに Quasar Prolog をコピーすることができない場合には,各自の都合に合わせて適
  778. 当に選んだディレクトリに格納して構いません.
  779.  Quasar Prolog のコピーを終了したら,ファイルメニューのアイテム登録を選択し
  780. て QUASAR.EXP をアイコンとして登録してください.アイテムの登録では,登録する
  781. プログラムが起動されるときに使用されるパラメータを指定することができます.Qu
  782. asar Prolog のファイルを想定されているディレクトリ以外に格納した場合には,こ
  783. のパラメータとして -p オプションを使用して,Quasar Prolog を格納したディレク
  784. トリを指定します.例えば,d:\usr\prolog\quasar というディレクトリにファイルを
  785. コピーした場合には,次のようなパラメータ指定を行います.
  786.     -pd:\usr\prolog\quasar
  787.  
  788.  
  789. 1.3 UNIX版
  790. ----------------------------------------------------------------------------
  791.  
  792.  Quasar Prolog は,UNIX の2大潮流をなす BSD 系と System V 系のどちらを採用
  793. したワークステーションでも使用することができます.
  794.  
  795.  
  796. ○ ハードウェア
  797.  
  798.  ワークステーション上で Quasar Prolog を使用するためには,利用者数やウィンド
  799. ウの利用状況にもよりますが,8メガバイト以上のメモリを実装していることが望ま
  800. れます.しかしながら,処理速度が少し遅くなることを我慢すれば,4メガバイトの
  801. システムでも十分に利用できます.Quasar Prolog は標準的な状態で,3~4メガバ
  802. イトのメモリを使用します.
  803.  
  804.  
  805. ○ Quasar Prologの導入
  806.  
  807.  Quasar Prolog が入っているストリーマテープ,あるいはフロッピーディスクから
  808.  tar コマンドを使用して,Quasar Prolog を構成するファイル群をワークステーショ
  809. ンのディスク上に読み込みます.ファイルを読み込むディレクトリは適当な位置で構
  810. いません.
  811.  tar コマンドは以下のような形式のどちらかで実行させます.
  812. 1)tar xvf /dev/デバイス
  813. 2)tar xv
  814.  1)の形式は一般的なもので,読み込もうとしているデバイスを明示的に指定する
  815. 方法で,ストリーマテープドライバやフロッピーディスクドライバなどを指定します.
  816. 2)の形式は,読み込もうとしているデバイスがシステムの既定のデバイス(何も指
  817.  
  818.  
  819.                                 - 8 -
  820.  
  821.  
  822. Quasar Prolog ユーザーズマニュアル                                  はじめに
  823.  
  824.  
  825. 定しないときに選択されるデバイス)であるときに使用できます.
  826.  
  827.  Quasar Prolog を使用するのに必要なファイルと,それらの設定に関して説明しま
  828. す.Quasar Prolog を実行するためには,以下の3つのファイルが必要です.(UNIX
  829.  では,ファイル名の大文字小文字は区別されます.以下のファイル名はすべて小文字
  830. です.)
  831. 1)quasar
  832. 2)quasar.img
  833. 3)quasar.msg
  834.  
  835.  上記のファイルの簡単な説明をします.1)は,Quasar Prolog インタプリタの核
  836. になる実行形式のファイルです.2)は,組込み述語やライブラリが格納されている
  837. ファイルです.3)は,Quasar Prolog の実行時に表示されるエラーメッセージが格
  838. 納されているファイルです.
  839.  3)は,通常のテキストファイルなので,ディスプレイに表示させたりエディタで
  840. 編集したりすることが可能ですが,1),2)のファイルはそのようなことをするこ
  841. とはできませんので注意してください.
  842.  
  843.  Quasar Prolog 用の3つのファイルをコピーするディレクトリは,基本的には,/u
  844. sr/local/quasar を想定しています.ディスクの構成や容量などの制約で,このディ
  845. レクトリに Quasar Prolog をコピーすることができない場合には,各自の都合に合わ
  846. せて適当に選んだディレクトリに格納して構いません.ただし,想定されているディ
  847. レクトリ以外にコピーした場合には,そのディレクトリを環境変数 QUASARPATH に設
  848. 定してください.例えば,/usr1/quasar というディレクトリにファイルをコピーした
  849. 場合には,次のようなコマンドを実行して環境変数を設定してください.
  850.     setenv QUASARPATH /usr1/quasar
  851.  また,Quasar Prolog をコピーしたディレクトリを,コマンドのサーチパス(path)
  852. に加えておいてください.例えば,/usr/local/quasar にコピーした場合には,次の
  853. ようなコマンドを実行して,サーチパスを設定します.
  854.     set path = ($path /usr/local/quasar)
  855.  パスの設定は Quasar Prolog を使用する際に必ず必要になるので,各自のホームデ
  856. ィレクトリの .chsrc の中に記述しておくとよいでしょう.
  857.  
  858.  
  859. ○ メモリ容量に関して
  860.  
  861. 1)スワップ領域
  862.  Quasar Prolog を起動する際に,十分なメモリを確保できないというメッセージが
  863. 出力された場合には,マシンのスワップ領域が不足していることが考えられます.ス
  864. ワップ領域が不足する要因としては,基本的にスワップ領域が不足しているという場
  865. 合と,一時的な問題としてログインしているユーザが多い場合や,走らせているプロ
  866. グラムが多い場合が考えられます.前者は,スワップ領域を増加させるしか対処のし
  867. ようがありませんが,後者は,他のユーザに使用を遠慮してもらったり,他のプログ
  868. ラムの実行を中断することによって,Quasar Prolog を動かせるようになります.最
  869. 近はウィンドウシステムが多用されていますが,開いているウィンドウが多い場合に
  870. は,不必要なウィンドウを消去することによって,Quasar Prolog を動かせるように
  871. なることも多くあります.このような対処法が有効であるとしても,Quasar Prolog 
  872. を起動できない状態が頻発するようであれば,基本的にスワップ領域が不足している
  873. と考えられますので,この場合もマシンのスワップ領域を早期に増加させた方がよい
  874. でしょう.
  875.  
  876. 2)実メモリ容量
  877.  Quasar Prolog 上でプログラムを実行させてみて,利用時間に比較して CPU 時間が
  878. 著しく低い場合には,Quasar Prolog を実行するのに必要なメモリ容量と比較して実
  879. メモリ容量が少ないために,スワッピングが多発していることが考えられます.この
  880.  
  881.  
  882.                                 - 9 -
  883.  
  884.  
  885. Quasar Prolog ユーザーズマニュアル                                  はじめに
  886.  
  887.  
  888. ような場合には,実メモリ容量を増加させることによって Quasar Prolog の応答速度
  889. を改善させることができます.そのときの状態にもよりますが,実メモリを増加させ
  890. スワップ頻度が減少することによって,PROLOG プログラムの応答速度が数倍から十数
  891. 倍ほど改善されることも珍しくありません.
  892.  
  893.  
  894.  
  895. 1.4 端末装置に関して
  896. ----------------------------------------------------------------------------
  897.  
  898.  Quasar Prolog は,プログラムの中で日本語を使用できるだけでなく,各種のメッ
  899. セージを漢字を含む日本語で表示します.このために,Quasar Prolog を使用する場
  900. 合には,漢字表示を行うことができる端末装置が必要になります.
  901.  UNIX をオペレーティングシステムとするワークステーションでは,入出力用の漢字
  902. コードとして EUC コードを採用しています.したがって,Quasar Prolog を使用する
  903. 端末装置は,EUC コードを表示することができるものである必要があります.最近の
  904. ワークステーションではXウィンドウが多用されていますが,このXウィンドウに付
  905. 属する端末エミュレータ kterm には,EUC コードを表示する機能が組み込まれていま
  906. す.Xウィンドウを使用する場合には,この kterm を利用するとよいでしょう.kte
  907. rm で EUC コードを表示させる機能を利用する場合には,kterm を起動する際に -km
  908.  euc オプションを指定してください.くわしくは,Xウィンドウの kterm のマニュ
  909. アルを参照してください.
  910.  MS-DOS をオペレーティングシステムとするパーソナルコンピュータでは,入出力用
  911. の漢字コードとしてシフト JIS を採用しています.このコードは日本における MS-D
  912. OS の標準的なコードなので,Quasar Prolog を利用するための特別な端末を用意する
  913. 必要はありません.ただし,日本 IBM の PS/55 シリーズの様に,日本語モードと英
  914. 語モードを選択できるようになっている機種では,日本語モードで利用するようにし
  915. てください.
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.  
  930.  
  931.  
  932.  
  933.  
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940.  
  941.  
  942.  
  943.  
  944.  
  945.                                 - 10 -
  946.  
  947.  
  948. Quasar Prolog ユーザーズマニュアル                                  基本操作
  949.  
  950.  
  951. ----------------------------------------------------------------------------
  952. 2. Quasar Prologの起動と終了
  953. ----------------------------------------------------------------------------
  954.  
  955. 2.1 Quasar Prologの起動
  956. ----------------------------------------------------------------------------
  957.  
  958. 1)TOWNS-OS以外
  959.  
  960.  コマンドの入力を促すシステムのプロンプト(UNIX では %,MS-DOSでは A> など)
  961. が出ている状態で quasar と入力して下さい.
  962.  Quasar Prolog が起動され,システムのバージョンやメモリの割当などが表示され
  963. た後に,Quasar Prolog が入力を要求するプロンプト '| ?- ' が表示されます.
  964.  
  965.     %%% Quasar Prolog, Technical Evaluation Release, Version 0.50.
  966.     %%% Copyright (C) 1987-1990 by K.Kakizaki, All rights reserved.
  967.  
  968.     | ?-
  969.  
  970.  Quasar Prolog のプロンプト '| ?- ' は,使用者がシステムに質問や命令を入力す
  971. ることができることを示しています.
  972.  
  973.  
  974. 2)TOWNS-OS
  975.  
  976.  Quasar Prolog が格納されているディスクを選択して,Quasar Prolog のアイコン
  977. を画面に出します.次に,Quasar Prolog のアイコンをマウスで2回クリックするこ
  978. とによって Quasar Prolog が起動されます.Quasar Prolog が起動された後は,前記
  979. の TOWNS-OS 以外のシステムと同様です.
  980.  
  981.  
  982. 2.2 Quasar Prologの終了
  983. ----------------------------------------------------------------------------
  984.  
  985.  Quasar Prolog を終了する場合には,以下に示すように exit. を入力した後にリ
  986. ターンキーを押して下さい.exit は Quasar Prolog を終了させるための述語(命令
  987. と考えて構いません)で,exit の4文字ははすべて小文字でなければなりません.
  988.  
  989.     | ?- exit.
  990.  
  991.     %%% 利用時間: xxx.xx 秒,CPU 時間: yy.yy 秒.
  992.  
  993.     %%% Quasar Prolog を終了します.
  994.  
  995.  exit を実行すると,利用時間などを表示してオペレーティングシステムのプロンプ
  996. トに戻ります.
  997.  TOWNS-OS では,キーの入力要求が表示されるので,スペースキーやリターンキーな
  998. どを押すと TOWNS メニューに戻ります.
  999.  
  1000.  'exit.' のかわりに 'halt.' を入力しても同様な結果が得られます.
  1001.  
  1002.     | ?- halt.
  1003.  
  1004.  また,これらの述語の代わりに,入力の終了を意味する制御文字を入力することに
  1005. よって終了させることもできます.この制御文字は UNIX と MS-DOS では異なってお
  1006.  
  1007.  
  1008.                                 - 11 -
  1009.  
  1010.  
  1011. Quasar Prolog ユーザーズマニュアル                                  基本操作
  1012.  
  1013.  
  1014. り,UNIX では CTRL-D,MS-DOS では CTRL-Z になっています.なお,UNIX では CTR
  1015. L-D を入力するとすぐに終了しますが,MS-DOS では,CTRL-Z を入力した後にリター
  1016. ンキーを入力しなければ終了しません.
  1017.  
  1018.  
  1019. 2.3 起動時のオプション
  1020. ----------------------------------------------------------------------------
  1021.  
  1022.  起動時に指定できるオプションとして,メモリ容量の割当を変更するものがありま
  1023. す.この指定法を以下に説明します.
  1024.  Quasar Prolog が利用するメモリ領域はいくつかに分割されて管理されており,そ
  1025. れらの各領域の容量として標準的な値が設定されています.通常は,この設定にした
  1026. がって各メモリ領域が用意されます.しかしながら,実行したい PROLOG プログラム
  1027. によっては,標準的な設定として用意されたメモリ容量では不足して実行できない場
  1028. 合が生じることがあります.このような場合には,不足した領域のメモリ容量を増加
  1029. させる必要が生じます.
  1030.  Quasar Prolog の起動時にオプションを指定することにより,不足している領域の
  1031. メモリ容量を増加させることができます.ただし,メモリ容量の指定は Quasar Prol
  1032. og の起動時にのみ可能で,使用している途中に変更することはできません.以下に使
  1033. 用できるオプションを示します.
  1034.  
  1035.     アトム領域    -aSIZE
  1036.     コード領域    -cSIZE
  1037.     ヒープ領域    -hSIZE
  1038.     スタック領域    -sSIZE
  1039.     トレイル領域    -tSIZE
  1040.  
  1041. オプションは,'-' で始まり,対象領域を表す1文字の英字と,容量を表す数値から
  1042. なります.ここで,SIZE はKバイト(1024)単位のメモリ容量です.1文字の英
  1043. 字と数値との間には,空白などが入ってはなりません.例えば,アトム領域を100
  1044. Kバイトにしたい場合には,以下のように入力して Quasar Prolog を起動します.
  1045.     quasar -a100
  1046.  
  1047.  UNIX と TOWNS-OS では,それぞれの領域のメモリ容量を独立して自由に増減させる
  1048. ことができますが,MS-DOS では,利用できるメモリ容量が限定されているために,メ
  1049. モリ容量の指定法に制約があります.MS-DOS 版では,オプションを使用してヒープ領
  1050. 域の容量を指定することができません.ヒープ領域には,ヒープ領域以外の領域のメ
  1051. モリ容量を確保した後に残った領域が割り当てられます.したがって,ヒープ領域以
  1052. 外を増加させると,増加させた容量だけヒープ領域のメモリ容量が減少しますので注
  1053. 意してください.
  1054.  
  1055.  
  1056. 2.4 初期化ファイル
  1057. ----------------------------------------------------------------------------
  1058.  
  1059. ○ 初期化ファイルとは
  1060.  
  1061.  Quasar Prolog では,初期化ファイルと呼ばれるファイルを利用することができま
  1062. す.このファイルは,quasar.ini というファイル名で,ファイルがあれば Quasar P
  1063. rolog の起動時に自動的に読み込まれます.このファイルに Quasar Prolog を起動し
  1064. た時に必ず行う処理や使用するプログラムを記述しておけば,それらの処理や設定を
  1065. 自動的に行わせることができます.quasar.ini は,Quasar Prolog を起動する際のデ
  1066. ィレクトリにあるものが使用されます.したがって,異なる処理内容ごとに,異なる
  1067. ディレクトリを作成しておき,それぞれのディレクトリに目的に応じた内容を持つ q
  1068. uasar.ini を置いておくことによって,それぞれのディレクトリで Quasar Prolog を
  1069.  
  1070.  
  1071.                                 - 12 -
  1072.  
  1073.  
  1074. Quasar Prolog ユーザーズマニュアル                                  基本操作
  1075.  
  1076.  
  1077. 起動する際に処理に応じた初期化が行えるようになります.
  1078.  Quasar Prolog を起動するディレクトリに quasar.ini がない場合には,使用者の
  1079. ホームディレクトリにある quasar.ini が読み込まれます.
  1080.  
  1081. ○ 初期化ファイルの内容
  1082.  
  1083.  初期化ファイルの内容としては,以下のようなものが考えられます.
  1084. 1)処理系の既定値の変更
  1085. 2)基本的な述語の定義
  1086. 3)プログラムの実行
  1087.  
  1088.  2)のような目的で述語定義が多い場合には,述語が定義されているファイルを初
  1089. 期化ファイルとは別に作成し,このファイルを読み込む処理を初期化ファイルに記述
  1090. することがよく行われます.
  1091.  
  1092.  
  1093.  
  1094.  
  1095.  
  1096.  
  1097.  
  1098.  
  1099.  
  1100.  
  1101.  
  1102.  
  1103.  
  1104.  
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.  
  1111.  
  1112.  
  1113.  
  1114.  
  1115.  
  1116.  
  1117.  
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.  
  1127.  
  1128.  
  1129.  
  1130.  
  1131.  
  1132.  
  1133.  
  1134.                                 - 13 -
  1135.  
  1136.  
  1137. Quasar Prolog ユーザーズマニュアル                                  基本操作
  1138.  
  1139.  
  1140. ----------------------------------------------------------------------------
  1141. 3. プログラムの入力と実行
  1142. ----------------------------------------------------------------------------
  1143.  
  1144. 3.1 プロンプト
  1145. ----------------------------------------------------------------------------
  1146.  
  1147.  Quasar Prolog では,システムが使用者に要求している入力の種類によって,出力
  1148. するプロンプトが異なります.
  1149.  Quasar Prolog が,使用者に質問の入力を促している場合には,'| ?- ' が表示さ
  1150. れています.一方,Quasar Prolog 内部に読み込むためのプログラムの入力を促して
  1151. いる場合には,'| ' が表示されています.
  1152.  '| ?- ' や '| ' に対して行う入力は,項を単位として行われます.項を入力する
  1153. 場合には,項の最後に '.' を入力する必要があり,入力する項が複合項の場合には,
  1154. '.' を入力するまで複数の行にわたって項を入力することができます.このように複
  1155. 数にわたって項が入力される場合には,最初の行は '| ?- ' か '| ' が表示されます
  1156. が,2行目以降には継続入力を要求するプロンプト '|+  ' が表示されます.項の入
  1157. 力が終了し,'.' を入力して改行すると,プロンプトは,1行目に表示されていたも
  1158. のに戻ります.
  1159.  
  1160.  
  1161. 3.2 プログラムの入力
  1162. ----------------------------------------------------------------------------
  1163.  
  1164. ○ キーボードからの入力
  1165.  
  1166.  Quasar Prolog にプログラムを入力する方法として,キーボードから入力する方法
  1167. と,プログラムが記述されたファイルを読み込ませて入力する方法を用いることがで
  1168. きます.ファイルを読み込ませる場合には,エディタなどで事前にプログラムファイ
  1169. ルを作成しておく必要があります.
  1170.  Quasar Prolog では,英字の大文字と小文字の違いが大きな意味を持ちます.同じ
  1171. 綴りの文字列でも,大文字と小文字の違いが一箇所でもあると,全く異なる文字列と
  1172. して認識されます.また,小文字で始まる文字列はシンボル型のデータ,大文字で始
  1173. まる文字列は変数型のデータとして認識されます.したがって,プログラムを入力し
  1174. たり,記述したりする場合には,大文字と小文字の違いに注意してください.
  1175.  
  1176.  
  1177. ○ キーボードからの入力
  1178.  
  1179. 1)入力モードへの移行
  1180.  Quasar Prolog が起動されたばかりの状態で,プロンプトとして '| ?- ' が出力さ
  1181. れている状態では,キーボードからプログラムを入力することはできません.キーボー
  1182. ドからプログラムを入力するためには,入力モードに移行しなければなりません.入
  1183. 力モードに移行するためには,consult/1 を使用します.プロンプト '| ?- ' に対し
  1184. て次のように入力することによって入力モードに移行することができます.
  1185.     | ?- consult(user).
  1186.  プログラムの入力モードに移行すると,プロンプトが '| 'に変更されます.
  1187.  
  1188. 2)プログラムの入力
  1189.  プロンプト '| ' に対してプログラムを入力すると,入力されたプログラムは処理
  1190. 系内部に記録されてゆきます.
  1191.  
  1192. 3)入力の終了
  1193.  プログラムの入力を終えたならば,入力モードを終了するために,制御文字を入力
  1194. します.このために使用される制御文字は,オペレーティングシステムの制約で UNI
  1195.  
  1196.  
  1197.                                 - 14 -
  1198.  
  1199.  
  1200. Quasar Prolog ユーザーズマニュアル                                  基本操作
  1201.  
  1202.  
  1203. X, TOWNS-OS と MS-DOS では異なっています.UNIX と TOWNS-OS では CTRL-D ,MS-
  1204. DOS では CTRL-Z と改行が入力モードを終了するための制御文字として利用されます.
  1205. したがって,入力モードを終了したい場合には,オペレーティングシステムに応じて,
  1206. 対応する制御文字を入力してください.
  1207.  プログラムの入力モードを終了すると,プロンプトは再び '| ?- ' に戻ります.
  1208.  
  1209.  
  1210. ○ ファイルの読み込み
  1211.  
  1212.  エディタなどを用いてプログラムファイルを作成している場合には,consult/1 を
  1213. 用いてシステムにファイルを読み込ませることができます.例えば,test.qsr という
  1214. ファイル名のプログラムファイルを読み込ませる場合には,以下のように入力を行い
  1215. ます.
  1216.     | ?- consult('test.qsr').
  1217. ファイル名が英小文字だけからなる場合には必要がありませんが,上の例のように小
  1218. 文字以外の文字を含む場合には,ファイル名の最初と最後に引用符”’”を付ける必
  1219. 要があります.
  1220.  プログラムが正常に読み込まれた場合には,ファイルの行数や読み込みに要した時
  1221. 間が表示されます.
  1222.  
  1223.  
  1224. ○ 入力されたプログラムの表示
  1225.  
  1226.  キーボードあるいはファイルから読み込まれたプログラムは,listing/1 を使用し
  1227. て表示させて内容を確認することができます.
  1228.  
  1229.  
  1230. 3.3 プログラムの実行
  1231. ----------------------------------------------------------------------------
  1232.  
  1233. ○ 質問と命令
  1234.  
  1235.  入力したプログラムを実行する方法には,処理系に質問を与える方法と命令を与え
  1236. る方法があります.Quasar Prolog では,キーボードからは質問だけを,ファイルか
  1237. らは命令だけを受け付けられるようになっています.
  1238.  
  1239. 1)質問
  1240.  
  1241.  質問はゴールが充足できるかどうか不明で,それを確かめるために行うもので,Qu
  1242. asar Prolog のプロンプト '| ?- ' に対してゴール(項)を入力することによって行
  1243. います.質問を入力すると,そのゴールを充足する解を求めるためにプログラムが実
  1244. 行されます.質問の入力形式を以下に示します.
  1245.  
  1246.     | ?- ゴール.
  1247.  
  1248. ゴールの最後には,必ず "." が必要です.また,ゴールは,以下に示すように複数を
  1249.  "," で並べることができます.
  1250.  
  1251.     | ?- ゴール1, ゴール2, ゴール3.
  1252.  
  1253. 質問が与えられると,インタプリタはプログラムの実行を開始し,ゴールが充足され
  1254. れば yes,充足できなければ no を表示します.ゴールが複数入力された場合には,
  1255. それらがすべて満たされた場合にのみ yes が表示されます.また,ゴールが充足でき
  1256. た場合には,ゴールの中に変数が含まれていれば,その変数がどの様な値の場合にゴー
  1257. ルを充足することができるかを示してくれます.
  1258.  
  1259.  
  1260.                                 - 15 -
  1261.  
  1262.  
  1263. Quasar Prolog ユーザーズマニュアル                                  基本操作
  1264.  
  1265.  
  1266.  
  1267. 2)命令
  1268.  
  1269.  命令は,入力されたゴールが充足可能であることが前提条件になります.このため,
  1270. ゴールが充足された場合には,単に yes が表示されますが,充足できなかった場合に
  1271. は警告が出力されます.命令の入力形式を以下に示します.
  1272.  
  1273.     :- ゴール.
  1274.  
  1275. ゴールは,質問と同様に複数を並べて記述することができます.
  1276.  キーボードから入力する質問の場合には,処理系が出したプロンプト '| ?- ' に対
  1277. してゴールを入力するだけでよかったのですが,プログラムファイルの中に記述する
  1278. 命令の場合には,ゴールの前に ':- ' を明示的に記述する必要があります.
  1279.  質問でゴールが充足されたときには,ゴールの中に含まれている変数がどのような
  1280. 値の場合であったかが表示されますが,命令の場合には,変数に関する情報は表示さ
  1281. れません.
  1282.  
  1283.  
  1284. ○ 質問の解
  1285.  
  1286.  質問が充足されたときにゴールに変数が含まれていない場合には,Quasar Prolog 
  1287. は単に yes と表示するだけですが,ゴールに変数が含まれていた場合には,変数がど
  1288. のような値に具体化されたときにゴールが充足されたかが示されます.
  1289.  
  1290.     | ?- member(X, [1, 2, 3]).
  1291.     X = 1 <ret>
  1292.     yes
  1293.     | ?-
  1294.  
  1295.  表示された解が適切なものであると判断した場合には,リターンキーを入力するこ
  1296. とによって,yes と表示した後に次の質問を入力できる状態になります.そうでない
  1297. 場合には,; (セミコロン)とリターンキーを入力することによって,別解があれば
  1298. それを求め表示させることができます.
  1299.  
  1300.     | ?- member(X, [1, 2, 3]).
  1301.     X = 1 ;<ret>
  1302.     X = 2 ;<ret>
  1303.     X = 3 ;<ret>
  1304.     no
  1305.     | ?-
  1306.  
  1307. ; を入力しても,別解がない場合には,no と表示して,次の質問を受け付ける状態に
  1308. なります.
  1309.  
  1310.  
  1311. 3.4 実行の中断
  1312. ----------------------------------------------------------------------------
  1313.  
  1314.  プログラムが無限ループに入って終了しなくなったり,期待したとおりに動かなか
  1315. った場合には,プログラムの実行を中断させることができます.プログラムを中断さ
  1316. せる場合には,CTRL-C を入力します.CTRL-C を入力すると以下のようなメッセージ
  1317. が表示されます.
  1318.  
  1319.     %%% コマンドを入力してください.(h でコマンド一覧を表示):
  1320.  
  1321.  
  1322.  
  1323.                                 - 16 -
  1324.  
  1325.  
  1326. Quasar Prolog ユーザーズマニュアル                                  基本操作
  1327.  
  1328.  
  1329.  このメッセージに 'a' を入力すると,プログラムは中断されます.また,プログラ
  1330. ムを中断する必要がなかった場合には,'c' を入力することによってプログラムを継
  1331. 続して実行させることができます.
  1332.  プロンプトに対して 'h' を入力すると,以下に示すようなコマンド一覧が表示され
  1333. ます.
  1334.  
  1335.     %%% コマンドを入力してください.(h でコマンド一覧を表示):h
  1336.     %    a    処理を中断する。
  1337.     %    c    処理を継続する。
  1338.     %    d    デバッグモードに入る。
  1339.     %    t    トレースモードに入る。
  1340.     %    b    ブレークする。
  1341.     %    e    Prolog を終了する。
  1342.  
  1343.  
  1344. 3.5 対話内容の記録
  1345. ----------------------------------------------------------------------------
  1346.  
  1347.  Quasar Prolog を使用しているときの利用者の入力と処理系の出力の履歴をファイ
  1348. ルに記録することができます.記録の開始は log 述語で,記録の終了は nolog 述語
  1349. で指定できます.
  1350.  プログラムの動作結果を保存しておきたい場合や,プログラムの開発中に動作のお
  1351. かしい部分の動作記録を取っておいて,後でじっくり解析する場合などに重宝する便
  1352. 利な機能です.
  1353.  
  1354.  対話内容の記録機能は Quasar Prolog が起動された時点では有効になっていませ
  1355. ん.記録を開始するときには,次のように入力します.
  1356.     | ?- log.
  1357. すると,yes と表示され,それ以降にディスプレイ上に表示される対話内容は,カレ
  1358. ントディレクトリの quasar.log というファイルに記録されます.記録を開始する前
  1359. に,すでに quasar.log という名称のファイルがあった場合には,そのファイルの最
  1360. 後の部分以降に新たな記録内容が付け加えられます.
  1361.  
  1362.  記録を終了したいときには,次のように入力します.
  1363.         | ?- nolog.
  1364. すると,yes と表示され記録は終了します.
  1365.  
  1366.  前記のように,記録ファイルは削除されることなく次々と新しい内容が追加されて
  1367. いくので,log と nolog を,交互に実行させることによって,必要な部分だけをファ
  1368. イルに記録することが簡単に行えます.
  1369.  一方,以前の quasar.log の内容が不必要な場合には,Quasar Prolog を実行する
  1370. 前に消去しておくか,Quasar Prolog の実行中に delete_file 述語で消去する必要が
  1371. あります.
  1372.  
  1373.  現在記録中かどうかは,次のように入力することで調べることができます.
  1374.         | ?- logging.
  1375.  
  1376.  Quasar Prolog を使用するときに必ず対話記録を取りたい場合には,初期化ファイ
  1377. ルに以下のような記述を行っておけばよいでしょう.
  1378.  
  1379.     :- log.
  1380.  
  1381. また,毎回新しいログファイルに記録を行いたい場合には,以下のように記述して下
  1382. さい.
  1383.  
  1384.  
  1385.  
  1386.                                 - 17 -
  1387.  
  1388.  
  1389. Quasar Prolog ユーザーズマニュアル                                  基本操作
  1390.  
  1391.  
  1392.     :- ( probe_file('quasar.log')
  1393.         -> delete_file('quasar.log') ; true ).
  1394.     :- log.
  1395.  
  1396.  
  1397.  
  1398.  
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.  
  1406.  
  1407.  
  1408.  
  1409.  
  1410.  
  1411.  
  1412.  
  1413.  
  1414.  
  1415.  
  1416.  
  1417.  
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424.  
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.  
  1431.  
  1432.  
  1433.  
  1434.  
  1435.  
  1436.  
  1437.  
  1438.  
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.                                 - 18 -
  1450.  
  1451.  
  1452. Quasar Prolog ユーザーズマニュアル                                  基本操作
  1453.  
  1454.  
  1455. ----------------------------------------------------------------------------
  1456. 4. DEC-10 PROLOGとの互換性
  1457. ----------------------------------------------------------------------------
  1458.  
  1459.  Quasar Prolog と DEC-10 PROLOG の非互換部分に関しては,以下のような考えをご
  1460. 理解いただき,互換プログラムなどによって対処していただきたいと思います.
  1461.  多くの PROLOG 処理系と同様に,Quasar Prolog の仕様も DEC-10 PROLOG に準拠し
  1462. ています.しかしながら,DEC-10 PROLOG は実験的な処理系としての性格が強い上に,
  1463. 開発されてからすでに長い年月が経過しており,その仕様は現在の多様な要求に対応
  1464. できなくなりつつあります.また,PROLOG がさまざまな分野に広く利用されるように
  1465. なるにつれて,さまざまな面での機能強化が求められています.一方で半導体技術な
  1466. どの進歩によって,処理速度やメモリ容量などの制約が解消されており,さまざまな
  1467. 要求に対応可能な処理系を実現できる環境が整ってきています.
  1468.  Quasar Prolog は,広い分野の問題解決に対応できるように,さまざまな機能強化
  1469. が行われています.また,述語名や述語の機能に,広く使用されている記号処理言語
  1470. である Common Lisp の仕様を取り入れています.これらの機能強化を行う上で,DEC
  1471. -10 PROLOG の基本的な構文は維持していますが,不適切と考えられる述語名や機能な
  1472. どを適切と考えられるものに変更し,使用者が Quasar Prolog の強化された機能を自
  1473. 然な形で利用できるように配慮しています.このため,DEC-10 PROLOG 用に記述され
  1474. た PROLOG プログラムの中には,そのまま Quasar Prolog で動かすことができないも
  1475. のも生じますが,その非互換部分の多くを解消する互換プログラムを用意することに
  1476. よって,移植作業の負担を軽減できるようにしています.また,互換性に関する問題
  1477. 点は,それと引き替えに強化された機能が導入されていることと,さまざまなマシン
  1478. で広く使用できる処理系が提供され,多くのマシンでその機能を利用できるようにし
  1479. ていることによって,十分に補われているものと考えます.さらに,現時点では PRO
  1480. LOG の使用者が比較的少ないために,Fortran などのように言語仕様の慣性が大きく
  1481. ないと考えられます.したがって,現時点であれば処理系の機能強化のために仕様を
  1482. 変更しても,使用者の混乱はそれほど大きくなく,強化された機能を利用するために,
  1483. 多くの使用者に受け入れてもらえるものと思います.私自身は,PROLOG が DEC-10 P
  1484. ROLOG の仕様のままで広く利用されるようになり,そのままの仕様で大きな慣性が生
  1485. じてはならないと思っています.そのような意味で,Quasar Prolog の仕様は,私自
  1486. 身にとっての解の1つです.
  1487.  
  1488.  
  1489. 4.1 データ型
  1490. ----------------------------------------------------------------------------
  1491.  
  1492. ○ 追加されたデータ型
  1493.  以下のようなデータ型が追加されています.
  1494. 1)浮動小数型
  1495. 2)文字型
  1496. 3)ストリーム型
  1497.  
  1498. ○ 文字列の扱い
  1499.  データに関してもっとも注意しなければならないものは文字列の取扱です.DEC-10
  1500.  PROLOG に準拠した処理系では," でくくった文字列は,以下に示すように,整数値
  1501. のリストに変換されて読み込まれます.
  1502.     "abc"    ->    [97, 98, 99]
  1503.  一方,Quasar Prolog では,文字型が用意されているために,以下のように文字型
  1504. データのリストに変換されます.
  1505.     "abc"    ->    [#\a, #\b, #\c]
  1506.  このため,文字の要素を一つずつとって処理を行うようなプログラムでは,文字を
  1507. 表す整数値を文字型のデータに変更する必要があります.
  1508.  
  1509.     a([97| X]) :- b(X).            a([#\a| X]) :- b(X).
  1510.  
  1511.  
  1512.                                 - 19 -
  1513.  
  1514.  
  1515. Quasar Prolog ユーザーズマニュアル                                  基本操作
  1516.  
  1517.  
  1518.     a([98| X]) :- c(X).    ->        a([#\b| X]) :- c(X).
  1519.     a([99| X]) :- d(X).            a([#\c| X]) :- d(X).
  1520.  
  1521.                 :- a("ab12").
  1522.  
  1523.  また,name/2 に相当する述語 Quasar Prolog の symbol_chars/2 も,シンボル型
  1524. のデータもリストに分解する場合に,整数値のリストではなく,文字型のリストにし
  1525. ます.
  1526.  
  1527.  さらに,近い将来に,Quasar Prolog の文字列型のデータが追加され,そのデータ
  1528. を表すために," が使用される予定です.したがって,将来の Quasar Prolog では,
  1529. 以下のようになると考えられます.
  1530.     "abc"    ->    "abc"
  1531. 一方,Quasar Prolog では,文字型データのリストとして文字列を読み込む記法とし
  1532. て #" を用意しており,この表記法は,文字列型のデータが使用できるようになった
  1533. 場合でも現在と同様に使用できる予定です.
  1534.     #"abc"    ->    [#\a, #\b, #\c]
  1535. したがって,将来の Quasar Prolog のバージョンアップを考えた場合には,文字列を
  1536. リストに分解して処理を行うような部分は," を #" に書き換えておく方がよいでし
  1537. ょう.
  1538.  
  1539.  
  1540. 4.2 シンボル型データの構成文字
  1541. ----------------------------------------------------------------------------
  1542.  
  1543.  シンボル型のデータを構成する文字として,英数字とともに ! を使用できるように
  1544. 拡張しています.
  1545.  
  1546.  
  1547. 4.3 述語
  1548. ----------------------------------------------------------------------------
  1549.  
  1550. ○ データ型の判定と変換
  1551.  
  1552.  データ型の判定用の述語は,主なところでは以下のような変更があります.
  1553.     DEC-10            Quasar
  1554.     atom/1        ->    symbolp/1
  1555.     atomic/1    ->    atom/1
  1556.     var/1        ->    unboundp/1
  1557.     nonvar/1    ->    boundp/1
  1558.     integer/1    ->    integerp/1
  1559. 特に気をつけなければならないのは,atom/1 です.atom/1 は,DEC-10 PROLOG と Q
  1560. uasar Prolog の両方に存在し,異なる意味を持っていますので注意しなければなりま
  1561. せん.
  1562.  これらの違いは,classic.qsr という名称の互換用プログラムを読み込んだ後にプ
  1563. ログラムを読み込めば,自動的に変換される様になっています.この使用法は,下記
  1564. の”互換用プログラム”の節を参照してください.
  1565.  
  1566.  データ型の変換用の述語は,主なところでは以下のような変更があります.
  1567.     =../2        ->    structure_list/2
  1568.     name        ->    symbol_char/2, number_char/2
  1569. これらの述語は,互換用プログラムを読み込むことによって使用できるようになりま
  1570. す.
  1571.  
  1572. ○ 入出力
  1573.  
  1574.  
  1575.                                 - 20 -
  1576.  
  1577.  
  1578. Quasar Prolog ユーザーズマニュアル                                  基本操作
  1579.  
  1580.  
  1581.  
  1582.  入出力用の述語は,主なところでは以下のような変更があります.
  1583.     get/1        ->    read_char/1
  1584.     put/1        ->    write_char/1
  1585.  また,対応する述語がないものは,主に以下のような述語です.
  1586.     get0/1
  1587.     skip/1
  1588.  これらの述語は,互換用プログラムを読み込むことによって使用できるようになり
  1589. ます.
  1590.  
  1591. ○ 算術演算
  1592.  算術演算を行う is/2 は,Quasar Prolog では :=/2 となっています.is/2 は,互
  1593. 換用プログラムを読み込むことによって使用できるようになります.
  1594.  
  1595. ○ 状態の問い合わせ
  1596.  メモリの使用状態を調べる statistics/* は,Quasar Prolog では room/* となっ
  1597. ています.また,statistics/* と room/* で得られる情報は詳細が異なっているので
  1598. 注意してください.
  1599.  statistics/* は,互換用プログラムを読み込むことによって使用できるようになり
  1600. ます.
  1601.  
  1602.  
  1603. 4.4 互換用プログラム
  1604. ----------------------------------------------------------------------------
  1605.  
  1606.  Quasar Prolog には,DEC-10 PROLOG 用のプログラムを実行するための互換用プロ
  1607. グラムが用意されています.このプログラムは classic.qsr という名称のファイル
  1608. で,このファイルをコンサルトしておくことによって,DEC-10 PROLOG 用に書かれた
  1609. プログラムの多くの部分が Quasar Prolog で実行できるようになります.ただし,D
  1610. EC-10 PROLOG 用に書かれたプログラムのファイル名の拡張子は,.pl にしておかなけ
  1611. ればなりません.拡張子が .qsr などの他のファイルは,この互換用プログラムの影
  1612. 響を受けません.また,端末から直接入力されるプログラムも,互換用プログラムの
  1613. 影響を受けません.
  1614.  詳細は,classic.qsr を参照してください.
  1615.  
  1616.  
  1617.  
  1618.  
  1619.  
  1620.  
  1621.  
  1622.  
  1623.  
  1624.  
  1625.  
  1626.  
  1627.  
  1628.  
  1629.  
  1630.  
  1631.  
  1632.  
  1633.  
  1634.  
  1635.  
  1636.  
  1637.  
  1638.                                 - 21 -
  1639.  
  1640.  
  1641. Quasar Prolog ユーザーズマニュアル                                      文法
  1642.  
  1643.  
  1644. ----------------------------------------------------------------------------
  1645. 5. 文法
  1646. ----------------------------------------------------------------------------
  1647.  
  1648.  Quasar Prolog のプログラムやデータを記述,入力する際の文法に関して説明しま
  1649. す.
  1650.  
  1651. ○ 使用できる文字
  1652.  Quasar Prolog では,プログラムやデータとして,半角のアルファベット,数字,
  1653. 記号と全角の第2水準までの全ての文字を使用することができます.なお,半角のカ
  1654. タカナを使用することはできませんので注意してください.半角のカタカナを使用し
  1655. た場合の Quasar Prolog の動作は定義されていません.
  1656.  
  1657.  
  1658. 5.1 データ型
  1659. ----------------------------------------------------------------------------
  1660.  
  1661.  Quasar Prolog で使用できるデータ型を以下に示します.
  1662. 1)シンボル型
  1663. 2)整数型
  1664. 3)浮動小数型
  1665. 4)文字型
  1666. 5)文字列型
  1667. 6)ストリーム型
  1668. 7)構造型
  1669. 8)リスト型
  1670. 9)変数型
  1671. 10)文字リスト型
  1672.  
  1673.  
  1674. ○ シンボル型
  1675.  シンボル型は Quasar Prolog においてもっとも基本的なデータ型の1つです.シン
  1676. ボル型のデータは次のような特徴を持ちます.
  1677. 1)述語定義を持てる.
  1678. 2)同一の綴を持つシンボルは1つしか存在しない.
  1679. とくに1)の特徴はシンボル型と構造型のデータのみが持つ機能となっています.
  1680.  シンボル型のデータは,記述に用いられる文字の種類で分類した場合には以下の3
  1681. 種類に分類することができます.
  1682. 1)半角英数文字と全角文字
  1683. 2)半角記号文字
  1684. 3)1,2およびその他の文字の混合
  1685.  1)に分類されるシンボル型のデータは,半角文字の英小文字,あるいは全角文字
  1686. で始まる文字列で表されます.最初の文字以外は,英大小文字,数字,_, ! の自由な
  1687. 組み合せを利用できます.Quasar Prolog では,_ は英大文字と同様に,! は英小文
  1688. 字と同様に扱われますので,英数文字を用いたシンボル名の一部として,引用符を用
  1689. いることなしにこれらの文字を使用することができます.一方,PROLOG の処理系によ
  1690. っては $ を英小文字と同様に扱うものがありますが,Quasar Prolog では記号文字と
  1691. して扱われますので,$ を英数文字を用いたシンボルの一部として用いる場合には引
  1692. 用符が必要です.1)に分類されるシンボル型のデータを以下に示します.
  1693.     quasar        aString        host_id        fact_10!
  1694.  2)に分類されるシンボル型のデータに用いることができる半角記号文字を以下に
  1695. 示します.
  1696.     #  $  &  *  +  -  .  /  :  <  =  >  ?  @  \  ^  `  ~
  1697.  
  1698.  3)に分類されるシンボル型のデータは,1)2)に分類できない文字の構成で表
  1699.  
  1700.  
  1701.                                 - 22 -
  1702.  
  1703.  
  1704. Quasar Prolog ユーザーズマニュアル                                      文法
  1705.  
  1706.  
  1707. 記されているもので,一重引用符”’”で最初と最後をくくられています.3)に分
  1708. 類されるシンボル型のデータを以下に示します.
  1709.     '$test'        '123'        'file-1'    '!"#$%'
  1710.  なお,シンボル型のデータを表す文字列の長さは,半角文字換算で256文字に制
  1711. 限されています.
  1712.  
  1713.  
  1714. ○ 整数型
  1715.  整数型は,整数値を表すデータとして利用され,一般的には10進数で表現されま
  1716. す.
  1717.  以下に整数型として正しく認識される表現を示します.
  1718.     123        7654        -96
  1719.  また,以下に整数型として認識されない表現を示します.
  1720.     234a        678!56
  1721.  整数値は通常の10進数のほかに,2進,8進,16進数の数値として入力するこ
  1722. とができます.2進数,8進数,16進数で数値を表現する場合には,それぞれ数値
  1723. の前に,#b, #o, #x を付加します.例えば,2進数で 1011 を表現したい場合には,
  1724. #b1011 と記述します.ただし,入力されたときの基数がいくらであっても,処理系の
  1725. 内部では全ての整数がただ一種類の整数型で表現されます.したがって,データが処
  1726. 理系内部に一度読み込まれてしまえば基数による違いはなくなります.このため,特
  1727. に指定しない限り,すべての整数値の出力は10進数で行われます.
  1728.  
  1729.  
  1730. ○ 浮動小数型
  1731.  整数型で表すことができない大きな数や小さな数を表すために,浮動小数型のデー
  1732. タを利用することができます.浮動小数型の数値の一般的な形式は,以下のとおりで
  1733. す.
  1734.     xx.xx        xxeyy        xx.xxeyy
  1735.     xx は仮数部の数値
  1736.     e は指数部の始まりを示す文字で e あるいは E
  1737.     yy は指数部の数値
  1738.  
  1739.     {符号}数字列 [ .数字列{[e|E]{符号}数値} | [e|E]{符号}数値 ]
  1740.  
  1741.  0.1 を '.1' あるいは 1.0 を '1.' というように小数点の前後に0しかない場合
  1742. に,その0を省略することを許すプログラミング言語が多々ありますが,Quasar Pro
  1743. log では,それぞれ '0.1', '1.0' と省略せずに記述する必要があります.以下に浮
  1744. 動小数型として正しく認識される表現を示します.
  1745.     123.4        0.7654        -96e10        56.7E-12
  1746.  また,以下に浮動小数型として認識されない表現を示します.
  1747.     234.        12.e12        .5
  1748.  
  1749.  
  1750. ○ 文字型
  1751.  文字型のデータは,'#\' の2文字に引き続いて該当する文字を記述することによっ
  1752. て表現されます.例えば,'a' という文字を表す文字型のデータは #\a, '&' という
  1753. 文字を表す文字型のデータは,#\& というように表されます.この場合に用いる文字
  1754. は半角文字でも全角文字でも構いません.以下に文字型のデータとして正しく認識さ
  1755. れる表現を示します.
  1756.     #\A    #\\    #\7    #\?    #\あ    #\硴    #\A
  1757.  
  1758.  アルファベットや数字のように印字されるフォンとが定義されていない制御文字は,
  1759. #\Control- に文字を付加させた形式で表現することができます.例えば, CTRL-A は
  1760.  #\Control-A と表現されます.制御文字のうちでも使用頻度の高いものは,文字に名
  1761. 前が付けられており,#\ に続けてその名前を記述することによって文字を表現するこ
  1762.  
  1763.  
  1764.                                 - 23 -
  1765.  
  1766.  
  1767. Quasar Prolog ユーザーズマニュアル                                      文法
  1768.  
  1769.  
  1770. とができます.以下に,このようにして表現できる制御文字を示します.
  1771.  
  1772.     #\Space        空白文字
  1773.     #\JSpace    全角の空白文字
  1774.     #\NewLine    改行文字
  1775.     #\LineFeed
  1776.     #\Return
  1777.     #\Tab        タブ文字
  1778.     #\Page        ページ文字
  1779.     #\Rubout
  1780.     #\BackSpace
  1781.     #\Escape    エスケープ文字
  1782.  
  1783.  
  1784. ○ 文字列型
  1785.  まだ使用できるようになっていません.
  1786.  
  1787.  
  1788. ○ ストリーム型
  1789.  ファイルに対する入出力ストリームとして使用するデータ型です.以下のような形
  1790. 式で表示されます.
  1791.     #<入力用 ファイルストリーム #xzzzz>
  1792.     #<出力用 ファイルストリーム #xzzzz>
  1793.  ストリーム型のデータは,open/3 などの述語によって生成され,write/* などで表
  1794. 示させることはできますが,使用者がキーボードから直接入力することはできません.
  1795.  
  1796.  
  1797.  
  1798. ○ 構造型
  1799.  構造型は,以下のような形式で記述されます.
  1800.     ファンクタ(引数1,引数2,...)
  1801.  ファンクタは,シンボル型と同一の表記規則にしたがって記述します.また,ファ
  1802. ンクタとそのすぐ右にある括弧は密着させ,両者の間に空白文字を入れないように注
  1803. 意しなければなりません.
  1804.  
  1805.  
  1806. ○ リスト型
  1807.  多くの PROLOG 処理系において,リストは複合項の一種として扱われ,利用頻度が
  1808. 高いために特別な表記が用意されています.一方 Quasar Prolog においては,リスト
  1809. は構造型とは全く別のデータ型として実現されています.しかしながら,Quasar Pro
  1810. log においても他の多くの処理系と同様に,リストは構造型のデータの特殊例として
  1811. 扱えるように配慮されています.
  1812.  リストは,その要素の左右を '[' と ']' で囲んだ形式で表現され,リストの要素
  1813. が複数ある場合には,各要素を',' で区切ります.リストの例を以下に示します.
  1814.     [1]        [a, b, c]    [a, X]
  1815.  コンスは,'|' を使用して表現します.コンスの例を以下に示します.
  1816.     [a| B]        [1, 2, 3| A]
  1817.  多くの PROLOG 処理系では,2つの括弧がくっついていなければ,ニルとして読み
  1818. 込まれませんが,Quasar Prolog では,2つの括弧の間に空白があってもニルとして
  1819. 読み込まれます.
  1820.     []        [    ]
  1821.  
  1822.  
  1823. ○ 変数型
  1824.  変数型のデータは,最初の文字が半角文字のアルファベットの大文字か,半角文字
  1825.  
  1826.  
  1827.                                 - 24 -
  1828.  
  1829.  
  1830. Quasar Prolog ユーザーズマニュアル                                      文法
  1831.  
  1832.  
  1833. の _ (下線)で始まる文字列で表されます.ただし,英大文字や _ で始まる文字列
  1834. であっても,引用符 ' で囲まれている文字列は,シンボルアトム型として認識されま
  1835. す.以下に,変数型のデータの例を示します.
  1836.     Var    CAT    Line    _個数
  1837.  特に,_ 一文字だけで示される変数は,無効変数(VOID 変数)あるいは無名変数と
  1838. 呼ばれます.この変数は,同じ節のなかに複数存在していても,それぞれが別個の変
  1839. 数として認識されます.
  1840.  例えば,abc(1, A) を abc(X, X) と単一化すると A = 1 になりますが,abc(_, _
  1841. ) と単一化しても,第1引数と第2引数の _ は異なる変数として扱われるために,A
  1842. は1に具体化されず変数(不定)のままになります.
  1843.  なお,変数型のデータを表す文字列の長さは,半角文字換算で256文字に制限さ
  1844. れています.
  1845.  
  1846. ○ 文字リスト型
  1847.  文字リスト型は厳密に言うと,1つの独立したデータ型というわけではありません
  1848. が,歴史的にも使いやすさの面からも多用される形式のデータなので,この節で説明
  1849. します.
  1850.  DEC-10 PROLOG に準拠している PROLOG 処理系の多くは,文字列型のデータ表現を
  1851. もっておらず,文字列を使用する場合には整数型のリストを流用しています.この整
  1852. 数型のリストを記述する簡易記法として,次の例のように," (二重引用符)が使用
  1853. されています.
  1854.     "abc"        ->        [97, 98, 99]
  1855. これは,単なる簡易記法であって," は,多くのプログラミング言語で利用されてい
  1856. るように文字列型を表す記号として使用されているわけではありません.
  1857.  現在提供している Quasar Prolog では,文字列型を使用できるようになっていませ
  1858. んが,近い将来に文字列型のデータを使用できるようにするとともに,文字列型を表
  1859. す記号として " を使用しようと考えています.このため,従来の文字列の簡易記法の
  1860. 替りとして," ではなく,#" を使用して表現するように変更してあります.また,Q
  1861. uasar Prolog は文字型のデータを使用できるので,#" で開始された文字列を数値の
  1862. リストに変換するのではなく,文字型データのリストに変換するようにしています.
  1863. 具体例を以下に示しますが,このようにして表現されるデータを文字リスト型と呼ぶ
  1864. ことにします.
  1865.     #"abc"        ->        [#\a, #\b, #\c]
  1866.  従来の文字列の表記法に用いられていた " は,現在の Quasar Prolog では #" と
  1867. 同様の結果を得られますが,前述のように,近い将来に文字列型を表す記号として使
  1868. 用する予定ですので,注意してできるだけ使用しないようにしてください.
  1869.  
  1870.  
  1871.  
  1872.  
  1873.  
  1874.  
  1875.  
  1876.  
  1877.  
  1878.  
  1879.  
  1880.  
  1881.  
  1882.  
  1883.  
  1884.  
  1885.  
  1886.  
  1887.  
  1888.  
  1889.  
  1890.                                 - 25 -
  1891.  
  1892.  
  1893. Quasar Prolog ユーザーズマニュアル                                      文法
  1894.  
  1895.  
  1896. 5.2 演算子
  1897. ----------------------------------------------------------------------------
  1898.  
  1899.  Quasar Prolog では,引数を持つ項,すなわち構造は,一般的に次のような形式で
  1900. 表現されます.
  1901.     ファンクタ(引数1,引数2,...)
  1902. 算術演算式に多用される四則演算子も,基本的にはこのように表現されます.例えば,
  1903. 5と10の乗算を表す項は,以下のように表現されます.
  1904.     *(5, 10)
  1905.  しかしながら,通常は,算術式などをわかりやすく記述するために,演算子を引数
  1906. の間に置く表記法が取られます.この方法では,上の例は,5*10という形式で表
  1907. 現されることになります.このように,演算子を引数の間に置く方法は,中置記法と
  1908. 呼ばれます.PROLOGでは,このようにわかり易い表現法で数式などを記述できるよう
  1909. にするために,演算子の表記法を利用できるようになっています.
  1910.  
  1911.  
  1912. 5.2.1 演算子の型と優先順位
  1913.  演算子は,その引数との位置関係で次の3種類に分類されます.
  1914.  
  1915. A)前置記法
  1916.     fx    非結合性
  1917.     fy    結合性
  1918. B)中置記法
  1919.     xfx    非結合性
  1920.     xfy    右結合性
  1921.     yfx    左結合性
  1922. C)後置記法
  1923.     xf    非結合性
  1924.     yf    結合性
  1925.  
  1926.  上記の f は演算子の位置を示し,x, y は演算子の引数の位置を示し,それぞれ以
  1927. 下のような意味を持っています.
  1928. x)その位置の式の優先順位が,演算子fの優先順位未満でなくてはならない.
  1929. y)その位置の式の優先順位が,演算子fの優先順位以下でなくてはならない.
  1930.  
  1931.  
  1932. 5.2.2 演算子の優先順位
  1933.  
  1934.  演算子の優先順位は 0~1200 を指定することが可能で,数値が小さいほど優先順位
  1935. が高くなります.ただし,優先順位の0は,演算子の定義を解除するのに用いられま
  1936. すので,最高の優先順位は1となっています.
  1937.  例えば,op1 の演算子の型が xfx,優先順位が 400,op2 の演算子の型が xfx,優
  1938. 先順位が 500 で定義されているとすると,以下の左のように入力された項は,右のよ
  1939. うに解釈されます.
  1940.     10 op1 20 op2 30    ->    (10 op1 20) op2 30
  1941.     10 op2 20 op1 30    ->    10 op2 (20 op1 30)
  1942. このように演算子として定義しておくと,op1, op2 が記述される順番に関係なく,演
  1943. 算子の優先順位の強い順に引数と結合されます.
  1944.  
  1945.  
  1946. 5.2.3 演算子の結合性
  1947.  
  1948.  次に x, y について説明します.ここでは,+, -, *, / などのような中置記法をと
  1949. る四則演算子を考えてみます.一般に以下の左のような加算の式は,右のように左の
  1950.  + が優先されて解釈されます.
  1951.  
  1952.  
  1953.                                 - 26 -
  1954.  
  1955.  
  1956. Quasar Prolog ユーザーズマニュアル                                      文法
  1957.  
  1958.  
  1959.     10 + 20 + 30    ->    (10 + 20) + 30
  1960. この結合の方式は,左結合性と呼ばれ,同一の演算子であれば,左の演算子から引数
  1961. と結合されるという性質を持っています.このように,左結合性の演算子を定義する
  1962. 場合には,演算子の型として yfx を利用します.yfx の演算子は,左側の引数はその
  1963. 演算子以下の優先順位,右側の引数はその演算子未満の優先順位でなければならない
  1964. ことを示しています.
  1965.  下の図のように,演算子の結合法を2種類考えた場合,左の形式では,2番目の +
  1966.  の左側の引数に1番目の + がきています.yfx の演算子は,左側の引数が自分の優
  1967. 先順位以下(すなわち自分と同一の優先順位を含む)を取ることができるので,この
  1968. 形式で読み込むことはできます.一方,右の形式では,1番目の + の右側の引数に2
  1969. 番目の + がきています.yfx の演算子は,右側の引数が自分の優先順位未満(すなわ
  1970. ち自分と同一の優先順位は含まない)しか取ることができないので,この形式で読み
  1971. 込むことはできません.
  1972.  
  1973.     10 + 20 + 30            10 + 20 + 30
  1974.  
  1975.         +               +
  1976.        +      30            10      +
  1977.         10   20                     20   30
  1978.  
  1979.     (10 + 20) + 30            10 + (20 + 30)
  1980.  
  1981.       左結合              右結合
  1982.  
  1983. 中置記法の演算子では,上記のような2種類の形式で読み込むことが考えられますが,
  1984. この例では yfx の形式が持つ引数の優先順位の制約から,左側の方式,すなわち左結
  1985. 合でのみ読み込むことが可能になります.
  1986.  前の例は,左結合の yfx 型の例を説明しましたが,右結合型の xfy 型の演算子と
  1987. しては,',' (カンマ)があります.',' は,演算子の型が xfy,優先順位が 1000 
  1988. の演算子として定義されています.したがって,次の左のような式は,右のように解
  1989. 釈されます.
  1990.     goal1, goal2, goal3    ->    goal1, (goal2 , goal3)
  1991.  
  1992.  
  1993. 5.2.4 構造の引数における演算子
  1994.  
  1995.  ',' の演算子定義と関連して,複合項の引数として演算子を含む式を記述する場合
  1996. に注意を示します.例えば,次のような複合項が記述されているとします.
  1997.     struct(arg1, arg2)
  1998. この例では,',' が演算子として定義されていることも考慮すると,2種類の解釈が
  1999. 可能です.1つめは,2個の引数 arg1 と arg2 を持つ複合項,2つめは,',' を演
  2000. 算子とする1個の引数 (arg1, arg2) を持つ複合項として解釈することです.このよ
  2001. うなあいまいさを取り除くために,複合項の引数の中では,演算子の優先順位が 999
  2002.  よりも高い演算子しか使用できないようになっています.演算子 ',' の優先順位は
  2003.  1000 ですから,複合項の引数の中に ',' が含まれていても,999 よりも高い優先順
  2004. ではないので,演算子として認識されることはありません.したがって,struct(arg
  2005. 1, arg2) は必ず2引数の複合項として認識されます.逆に,',' を演算子とする引数
  2006. を記述したい場合には,',' を含む引数を括弧でくくって struct((arg1, arg2)) の
  2007. 様に記述します.なお,リストの要素に関しても,複合項の引数と同様な理由で,演
  2008. 算子の優先順位は 999 よりも低いものに制限されています.
  2009.  ',' を演算子として使用したい場合には,括弧でくくる必要があることを説明しま
  2010. したが,',' に限らず,優先順位が 1000 よりも低い演算子を複合項の引数やリスト
  2011. の要素として使用したい場合にも,',' と同様に,式を括弧でくくる必要があります.
  2012. このような状況がよく生じるのは assert や retract を使用する場合です.例えば,
  2013. assert で,次のような節をデータベースに追加することを考えます.
  2014.  
  2015.  
  2016.                                 - 27 -
  2017.  
  2018.  
  2019. Quasar Prolog ユーザーズマニュアル                                      文法
  2020.  
  2021.  
  2022.     test :- test1.
  2023. 演算子の優先順位のことを考えずに行うと,次のようなゴールを記述すると考えられ
  2024. ます.
  2025.     assert(test :- test1).
  2026. しかしながら,このゴールは,Quasar Prolog のリーダーによってエラーが検出され,
  2027. 読み込まれません.これは,:- が優先順位 1200 の演算子として定義されているため
  2028. で,複合項の引数には 999 よりも優先順位が低い演算子を利用できないという制限に
  2029. 引っかかるためです.このようなゴールを記述したい場合には,引数を括弧でくくり
  2030. 以下のようにします.
  2031.     assert((test :- test1)).
  2032.  
  2033.  
  2034. 5.2.5 演算子とファンクタ
  2035.  
  2036.  通常,演算子定義されているシンボル型のデータは演算子として解釈されます.ま
  2037. た,シンボル型のデータに引き続いて '(' がある場合には,そのシンボル型のデータ
  2038. は,'(' の中身を引数とする構造のファンクタとして解釈されます.しかしながら,
  2039. Quasar Prolog では,演算子定義されているシンボル型のデータでも,演算子として
  2040. 解釈すると読み込めない場合には,単なるシンボル型のデータとして解釈します.ま
  2041. た,シンボル型のデータの直後に '(' があっても,そのシンボル型データを演算子と
  2042. して解釈しなければ読み込めない場合には,構造のファンクタとしてではなく演算子
  2043. として解釈します.
  2044.  以下に,その例を示します.* は中置記法の演算子として,- は前置記法の演算子
  2045. として定義されているものとします.
  2046.  
  2047. A) - *(1+2)        ->    -(*(+(1,2)))
  2048.     * はアリティ1のファンクタ,- は演算子として解釈される
  2049. B) - * (1 + 2)    ->    *(-,+(1,2))
  2050.     * は中置記法の演算子,- は単なるシンボル型データとして解釈される
  2051. C) 3 *(1+2)        ->    *(3,+(1,2))
  2052.     * はファンクタではなく,中置記法をとる演算子として解釈される
  2053.  
  2054.  このように,演算子がどのように解釈されるか多少注意が必要ですが,演算子定義
  2055. されているかどうかに関わらず,あるシンボル型のデータを単なる(演算子としてで
  2056. はなく)シンボル型データとして解釈させたい場合には,そのデータを () で囲むこ
  2057. とによって演算子の定義を一時的に解除することができます.例えば,上記の例のA
  2058. の - を括弧でかこむと,Bと同様に解釈されます.
  2059.  
  2060.     (-) *(1+2)    ->    *(-,+(1,2))
  2061.  
  2062.  数値とともに +, - の前置演算子を使用する場合には,すこし注意する必要があり
  2063. ます.数値以外の項,例えば,変数に対して -X と入力すると複合項 -(X) が入力さ
  2064. れます.一方,同様に -1 と入力すると負の整数値 -1 が入力され,-(1) の様な複合
  2065. 項として読み込まれることはありません.複合項の -(1) を入力したい場合には,-(
  2066. 1) と入力しなければなりません.例えば,
  2067.     -1 = -X
  2068. は失敗しますが,
  2069.     -(1) = -X
  2070. は成功し,
  2071.     X = 1
  2072. が得られます.
  2073.  
  2074.  
  2075. 5.2.6 演算子の定義と調査
  2076.  
  2077.  
  2078.  
  2079.                                 - 28 -
  2080.  
  2081.  
  2082. Quasar Prolog ユーザーズマニュアル                                      文法
  2083.  
  2084.  
  2085.  operator/3 を使用することによって,使用者が演算子を新たに定義することができ
  2086. ます.また,Quasar Prolog の標準的な演算子として用意されているものの定義を変
  2087. 更することもできます.演算子を定義する際に,定義を行うシンボルに対して演算子
  2088. がすでに定義されている場合には,古い定義が新しい定義に変更されます.ただし,
  2089. 演算子の型が異なる場合には,1つのシンボルに対して複数の演算子が共存すること
  2090. ができます.したがって,演算子の型が異なっている場合には,新しい演算子を定義
  2091. しても古い演算子が削除されることはありません.
  2092.  現在定義されている演算子の情報は current_operator/3 を利用して調べることが
  2093. できます.
  2094.  
  2095.  
  2096. 3)標準で定義されている演算子
  2097.  
  2098.  以下に,Quasar Prolog の標準的な演算子定義を示します.
  2099.  
  2100.     演算子            優先順位    型
  2101.     ^             200        xfy
  2102.     + -             300         fx
  2103.     * / //             400        yfx
  2104.     + -             500        yfx
  2105.     << >>             550        yfx
  2106.     /\             600        yfx
  2107.     \/             650        yfx
  2108.     = == \==         700        xfx
  2109.     := =:= =\= > >= < =<     700        xfx
  2110.     @> @>= @< @=<         700        xfx
  2111.     ->            1050        xfy
  2112.     ;            1100        xfy
  2113.     dynamic static        1150         fx
  2114.     :- ?-            1200         fx
  2115.     :-            1200        xfx
  2116.  
  2117.  
  2118.  
  2119. 5.3 注釈の記述
  2120. ----------------------------------------------------------------------------
  2121.  
  2122.  プログラムの中に注釈をいれたい場合には,2種類の方法から選択することができ
  2123. ます.第1の方法は,プログラムの中に注釈の開始を示す記号を置いて,この記号か
  2124. ら行の終りまでを注釈とする方法でです.第2の方法は,注釈の開始と終了を示す組
  2125. み合せを使用して,それらの記号で囲んだ部分を注釈とする方法です.
  2126.  第1の方法は,半角文字の % を注釈の開始記号として用いるもので,この文字から
  2127. 行の終わりまでの部分は,Quasar Prolog によって注釈として扱われ,プログラムの
  2128. 読み込みの際には無視されます.
  2129.  第2の方法は,以下に示す2種類の半角文字の組み合せを用いるもので,それぞれ
  2130. の記号の組み合せで囲まれた部分は,Quasar Prolog によって注釈として扱われ,プ
  2131. ログラムの読み込みの際には無視されます.
  2132. 1) #|,|#
  2133. 2) /*, */
  2134.  
  2135.  1と2の組み合わせは,注釈の入れ子ができるかどうかという点で,少し機能の違
  2136. いがあります.1の組み合わせは,注釈の入れ子を行うことができますが,2の組み
  2137. 合わせは注釈の入れ子を行うことができません.
  2138.  
  2139.  
  2140.  
  2141.  
  2142.                                 - 29 -
  2143.  
  2144.  
  2145. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2146.  
  2147.  
  2148. ----------------------------------------------------------------------------
  2149. 6. プログラムの構成と実行規則
  2150. ----------------------------------------------------------------------------
  2151.  
  2152. 6.1 プログラムの構成
  2153. ----------------------------------------------------------------------------
  2154.  
  2155.  Quasar Prolog のプログラムは,述語を基本単位として処理が行われます.述語は
  2156. 一般的に複数の節によって定義されています.節は,規則と事実に分類されます.
  2157.  規則はルールとも呼ばれ,次のような形式をしています.
  2158.     頭部 :- 本体.
  2159.  事実はファクト,単位節とも呼ばれ次のような形式をしています.
  2160.     頭部.
  2161.  規則と事実は,どちらとも '.' (ピリオド)で終了しており,'.' を入力するまで
  2162. は,複数の行にわたって記述することができます.
  2163.  頭部の項は,シンボル型か構造型のデータでなければなりません.本体には,複数
  2164. の述語の呼出を記述することができ,本体に記述された述語の呼出はサブゴールと呼
  2165. ばれます.サブゴールが複数記述される場合には,',' (カンマ)や ';' (セミコロ
  2166. ン)で区切って列挙されます.
  2167.  
  2168.  1つの述語は頭部の項が同じファンクタとアリティを持つ複数の節から構成されま
  2169. す.頭部の項に同じファンクタを持つ述語でも,アリティが異なると全く異なる述語
  2170. として認識されます.例えば,以下に示す前の2つの節は一つの述語を構成しますが,
  2171. 後の2つの節は全く異なる2つの述語を構成します.
  2172.     abc(1, X) :- assert(X).
  2173.     abc(2, X) :- retract(X).
  2174.  
  2175.     xyz(1, X, Y) :- X := Y.
  2176.     xyz(2, X) :- X =:= 0.
  2177.  
  2178.  なお,$, @ で始まる述語名は,Quasar Prolog のマニュアルには定義されていませ
  2179. んが組み込み述語の一部として使用されている可能性がありますので,これらの文字
  2180. で始まる述語名を使用しないように注意してください.
  2181.  
  2182.  
  2183.  
  2184. 6.2 プログラムの実行規則
  2185. ----------------------------------------------------------------------------
  2186.  
  2187.  使用者が定義した述語は一般的に複数の節からなりますが,Quasar Prolog は他の
  2188.  PROLOG 処理系と同様に,述語が呼び出された場合に,述語を構成する節を上の節か
  2189. ら下の節へ調べていき,単一化可能な頭部を持つ節が見つかった場合には,その節の
  2190. 本体にあるサブゴールを呼び出します.もしも単一化可能頭部を持つ節がない場合に
  2191. は,その述語の呼出は失敗し,後戻りが起こります.
  2192.  サブゴールは,左のサブゴールから右のサブゴールへ順次呼び出されていきます.
  2193.  
  2194.  存在しない述語が呼出された場合には,その述語が動的述語であるか静的述語かで
  2195. 異なります.動的述語として宣言が行われている場合には,その述語の呼出破綻に失
  2196. 敗します.一方,動的述語として宣言されていない場合は,その述語の呼出は,エラー
  2197. としてプログラムの実行が中断されます.動的述語と静的述語の宣言に関しては,内
  2198. 部データベースの操作の節を参照してください.
  2199.  
  2200.  Quasar Prolog では,動的述語として宣言されている述語に対して,実行時に節を
  2201. 追加したり削除したりすることができます.Quasar Prolog では,プログラムの実行
  2202. 時に assert/1, assertz/1 で節を場合には,追加された節は別解を求める場合に必ず
  2203.  
  2204.  
  2205.                                 - 30 -
  2206.  
  2207.  
  2208. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2209.  
  2210.  
  2211. 使用されます.
  2212.  例として,以下に示す述語 test/1 で説明します.
  2213.  
  2214.     :- dynamic test/1.
  2215.     test(0) :- assertz(test(2)), fail.
  2216.     test(1).
  2217.  
  2218.  この述語に対して,引数を変数として質問した場合には,次のような答えが得られ
  2219. ます.
  2220.  
  2221.     | ?- test(X).
  2222.     X = 1 ;
  2223.     X = 2 ;
  2224.     no.
  2225.  
  2226.  答えとして X = 2 が得られるのは,まず第1の節で test(2) が内部データベース
  2227. に加えられ,それが X = 1 の別解として利用されるからです.test/1 を1回実行し
  2228. た後に listing/* を行うと test/1 の定義が次のように変化しているのを見ることが
  2229. できます.
  2230.  
  2231.     :- dynamic test/1.
  2232.     test(0) :- assertz(test(2)), fail.
  2233.     test(1).
  2234.     test(2).
  2235.  
  2236.  さて,次に test/1 の定義が以下のように,1つだけの節の場合には,どのような
  2237. 実行結果が得られるでしょうか?
  2238.  
  2239.     :- dynamic test/1.
  2240.     test(0) :- assertz(test(2)), fail.
  2241.  
  2242.  Quasar Prolog では,以下のような結果が得られます.
  2243.  
  2244.     | ?- test(X).
  2245.     X = 2 ;
  2246.     no.
  2247.  
  2248.  この場合も,第1の節で追加された節が,別解を求めるために使用されています.
  2249. 最初の例の結果から予測できる自然な結果です.このように,Quasar Prolog では,
  2250. 実行時に追加された節は,別解を求めるために必ず使用されるという,追加された節
  2251. の解釈に関する一貫性を持っています.
  2252.  上の実行結果はごく当り前のように思われますが,このような結果が得られない処
  2253. 理系はたくさん見受けられます.このような処理系では,具体的には以下のような実
  2254. 行結果になります.
  2255.  
  2256.     | ?- test(X).
  2257.     no.
  2258.  
  2259.  このように,第1の節で内部データベースに追加された節が,別解を求めるために
  2260. 使用されないのです.一方で,2つの節を持つ最初の例では,実行時に追加された節
  2261. は,別解として使用されています.このような処理系では,同じ様に追加された節が,
  2262. 異なる様に解釈され,プログラムの実行規則に一貫性がないために,使用者にとって
  2263. はプログラムの解釈が非常に困難になるという問題があります.
  2264.  
  2265.  
  2266.  
  2267.  
  2268.                                 - 31 -
  2269.  
  2270.  
  2271. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2272.  
  2273.  
  2274.  
  2275. 6.3 基本処理
  2276. ----------------------------------------------------------------------------
  2277.  
  2278. 1)+Goals1, +Goals2
  2279.  ','/2 は連言もしくは”かつ”という様に呼ばれ,Goal1 と Goal2 がともに成功す
  2280. るときに,連言全体として成功します.2つのゴールは,Goal1, Goal2 の順序で呼び
  2281. 出され,どちらか一方でも失敗した場合には,全体として失敗します.また,Goal1 
  2282. が失敗した場合には,Goal2 は呼び出されることはありません.
  2283.  連言のゴールの中にカットがあった場合には,カットがでてくるまでに呼び出され
  2284. たゴールによって生成された選択点は,すべて除去されます.また,連言が述語の本
  2285. 体として記述されている場合には,カットは,親ゴールの選択点も除去します.
  2286.  
  2287. 2)+Goals1; +Goals2
  2288.  ;/2 は選言もしくは”または”という様に呼ばれ,Goal1 と Goal2 のどちらかが成
  2289. 功するときに,選言全体として成功します.2つのゴールは,Goal1 がまず先に呼び
  2290. 出され,Goal1 が成功すると Goal2 は呼び出されることなく全体が成功します.Goa
  2291. l1 が失敗した場合には,Goal2 が呼び出され,Goal2 が成功すると全体が成功しま
  2292. す.
  2293.  選言のゴールの中にカットがあった場合には,カットがでてくるまでに呼び出され
  2294. たゴールによって生成された選択点は,すべて除去されます.また,選言が述語の本
  2295. 体として記述されている場合には,カットは,親ゴールの選択点も除去します.
  2296.  
  2297. Goal1, Goal2がカットを含まない場合には,以下の定義に等しい.
  2298.     (Goal1; Goal2) :- call(Goal1).
  2299.     (Goal1; Goal2) :- call(Goal2).
  2300.  
  2301. 3)true
  2302.  この述語は必ず成功します.ほとんど使用されることはありません.
  2303.  
  2304. 4)fail
  2305.  この述語は必ず失敗します.
  2306.  repeat あるいは後戻りによって複数の解を生成する述語と組み合わせて,繰り返し
  2307. 処理を記述するにに用いられます.
  2308.  
  2309. 5)!
  2310.  選択点を削除します.
  2311.  
  2312.  
  2313. 6.4 条件判断
  2314. ----------------------------------------------------------------------------
  2315.  
  2316. 1)+If -> +Then
  2317.  If がまず呼び出され,If が成功した場合にのみ Then が呼び出されます,この述
  2318. 語は If, Then の両者が成功した場合にのみ成功し,どちらか一方でも失敗した場合
  2319. には,全体として失敗します.したがって,この述語に継続して記述されているサブ
  2320. ゴールがある場合には,そのサブゴールは実行されないので注意してください.また,
  2321. Then は複数回充足が可能ですが,If は1回だけしか充足されません.
  2322.  If と Then の中にカットがある場合には,そのカットは,それぞれの中だけの選択
  2323. 点を除去します.
  2324.  
  2325. 2)+If -> +Then ; +Else
  2326.  If がまず呼び出され,If が成功した場合には Then が,失敗した場合には Else 
  2327. が呼び出されます.この述語は,If 成功か失敗かによって選択された Then あるいは
  2328.  Else が成功した場合にのみ成功し,これらが失敗した場合には,全体として失敗し
  2329.  
  2330.  
  2331.                                 - 32 -
  2332.  
  2333.  
  2334. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2335.  
  2336.  
  2337. ます.また,Then と Else は複数回充足が可能ですが,If は1回だけしか充足され
  2338. ません.
  2339.  If, Then と Else の中にカットがある場合には,そのカットは,それぞれの中だけ
  2340. の選択点を除去します.
  2341.  
  2342.  
  2343.  
  2344. 6.5 繰り返し
  2345. ----------------------------------------------------------------------------
  2346.  
  2347.  PROLOG で繰り返しを記述する方法には2種類あります.1つは,複数回充足できる
  2348. 述語と失敗する述語を組み合わせて繰り返しを行う方法で,もう1つは,末尾再帰と
  2349. 呼ばれる手法を用いて繰り返しを行う方法です.
  2350.  
  2351. 6.5.1 repeat/*による繰り返し
  2352.  
  2353. 1)repeat
  2354.  無限に成功します.
  2355.  repeat/0 は一般的に,以下のような形式で使用されます.
  2356.  
  2357.     loop :-
  2358.         repeat,
  2359.             exec,    % 繰り返し行いたい処理
  2360.             test,    % 繰り返しを終了する条件の判定
  2361.         !.
  2362.  
  2363. ここで,test は繰り返しの終了条件で成功するような述語です.この例では,test 
  2364. が成功するまで,exec が繰り返し実行され,loop 自体は成功します.loop を失敗さ
  2365. せたい場合には,以下のようにすればよいでしょう.
  2366.  
  2367.     loop :-
  2368.         repeat,
  2369.             exec,    % 繰り返し行いたい処理
  2370.             test,    % 繰り返しを終了する条件の判定
  2371.         !,
  2372.         fail.
  2373.  
  2374. 2)repeat(+Num)
  2375.  Num で指定された回数だけ成功します.Num は整数型でも浮動小数型でも構いませ
  2376. んが,浮動小数型の場合には,小数点以下を切り捨てた回数になります.また,Num 
  2377. が 0 以下の場合には,repeat/1 は1回も成功しません.
  2378.  repeat/1 は一般的に,以下のような形式で使用されます.
  2379.  
  2380.     loop :-
  2381.         repeat(10),
  2382.             exec,    % 繰り返し行いたい処理
  2383.             fail.
  2384.  
  2385. この例では,exec が 10 回ほど繰り返し実行され,loop 自体は失敗します.loop を
  2386. 成功させたい場合には,以下のようにすればよいでしょう.
  2387.  
  2388.     loop :-
  2389.         repeat(10),
  2390.             exec,    % 繰り返し行いたい処理
  2391.             fail.
  2392.  
  2393.  
  2394.                                 - 33 -
  2395.  
  2396.  
  2397. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2398.  
  2399.  
  2400.     loop.
  2401.  
  2402.  
  2403. 6.5.2 for/*による繰り返し
  2404.  
  2405. 1)for(-Var, +Start, +End)
  2406.  Start と End は数値で,for/3 が充足される度に,Var には Start から始まり,
  2407. 1づつ増加する数値が代入されます.Var の値が End を越える場合には,for/3 は失
  2408. 敗します.Start と End は,整数型でも浮動小数型でも構いません.Start が End 
  2409. よりも大きい場合には,for/3 は1回も成功しません.
  2410.  for/3 は一般的に,以下のような形式で使用されます.
  2411.  
  2412.     loop :-
  2413.         for(X, 0, 10),
  2414.             exec(X),    % 繰り返し行いたい処理
  2415.             fail.
  2416.  
  2417. この例では,X が 0 から 10 まで,exec が 11 回ほど繰り返し実行され,loop 自体
  2418. は失敗します.
  2419.  
  2420. 2)for(-Var, +Start, +End, +Step)
  2421.  Start と End は数値で,for/3 が充足される度に,Var には Start から始まり,
  2422. Step づつ増減する数値が代入されます.Var の値が End を越える場合には,for/3 
  2423. は失敗します.Start と End は,整数型でも浮動小数型でも構いません.Step が正
  2424. の値のときには,Start が End よりも大きい場合,Step が負の値のときには,Star
  2425. t が End よりも小さい場合には,for/4 は1回も成功しません.
  2426.  for/3 は一般的に,以下のような形式で使用されます.
  2427.  
  2428.     loop :-
  2429.         for(X, 0, 10, 2),
  2430.             exec(X),    % 繰り返し行いたい処理
  2431.             fail.
  2432.  
  2433. この例では,X が 0 から 10 まで,exec が 61 回ほど繰り返し実行され,loop 自体
  2434. は失敗します.
  2435.  
  2436.  
  2437.  
  2438. 6.6 非局所脱出
  2439. ----------------------------------------------------------------------------
  2440.  
  2441.  Quasar Prolog では,catch/2 と throw/2 の組み合せによって非局所的な脱出機能
  2442. を利用することができます.catch/2 は,第1引数をタグとする非局所脱出の脱出点
  2443. を確立します.catch/2 は,この後単に成功し,第2引数は具体化されない変数のま
  2444. まとなります.
  2445.  throw/2 は,第1引数と同一のタグを持つ有効な非局所脱出点のうちで,もっとも
  2446. 最近に確立された非局所脱出点に制御を移します.この後は,制御が移された非局所
  2447. 脱出点を確立した catch/2 が再度成功し,ここから処理が継続されます.このため,
  2448. throw/2 以降のサブゴールは実行されることはありません.throw/2 の第1引数に対
  2449. 応する非局所脱出点が確立されていない場合には,throw/2 は単に成功します.一般
  2450. 的には,throw/2 に続くサブゴールは,throw/2 の処理が期待どおりに行われなかっ
  2451. たことに対するエラー処理を行うことが望まれます.
  2452.  非局所脱出点を確立するために catch/2 が最初に呼ばれた際には,catch/2 の第2
  2453. 引数は具体化されない変数のまま成功しましたが,throw/2 によって行われた非局所
  2454. 脱出を受け止めた場合には,catch/2 の第2引数は throw/2 の第2引数で指定された
  2455.  
  2456.  
  2457.                                 - 34 -
  2458.  
  2459.  
  2460. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2461.  
  2462.  
  2463. 値に具体化されています.これを利用すると,catch/2 が最初に呼び出された場合か,
  2464. throw/2 によって非局所脱出が行われた場合かを判断することができます.
  2465.  
  2466.     catch(+Tag, -Value)
  2467.     throw(+Tag, +Value)
  2468.  
  2469. catch/2 と throw/2 は,catch/2 の後に throw/2 が実行されるようになっていれば,
  2470. 同一の節の中に記述されている必要はありません.また,catch/2 が throw/2 よりも
  2471. 深い呼出レベルにあっても構いません.ただし,カットの影響範囲内にある非局所脱
  2472. 出点は,カットによって削除されるのでカットの使用法に注意する必要があります.
  2473.  
  2474.  
  2475.  
  2476. 6.7 その他
  2477. ----------------------------------------------------------------------------
  2478.  
  2479. 6.7.1 ゴールの呼出
  2480.  
  2481. call(Goal)
  2482.  変数 Goal が具体化されている場合に,それをゴールとして呼び出します.Goal が
  2483. 具体化されていない場合や,ゴールとして使用できない項に具体化されている場合に
  2484. は,エラーが生じます.
  2485.  Goal 内にカットがある場合には,その有効範囲は Goal の中だけに限定されます.
  2486.  
  2487.  
  2488. 6.7.2 否定
  2489.  
  2490. not(Goal)
  2491.  
  2492. not(not(Goal)) は,call(Goal) とは異る.
  2493.  
  2494.  
  2495. 6.7.3 処理系制御
  2496.  
  2497.  プログラムの実行を途中で中断したい場合には,abort を実行します.
  2498.  Quasar Prolog を終了したい場合には exit を実行します.
  2499.  
  2500.  
  2501.  
  2502.  
  2503.  
  2504.  
  2505.  
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  
  2511.  
  2512.  
  2513.  
  2514.  
  2515.  
  2516.  
  2517.  
  2518.  
  2519.  
  2520.                                 - 35 -
  2521.  
  2522.  
  2523. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2524.  
  2525.  
  2526. ----------------------------------------------------------------------------
  2527. 7. 内部データベースの操作
  2528. ----------------------------------------------------------------------------
  2529.  
  2530. 7.1 動的述語と静的述語
  2531. ----------------------------------------------------------------------------
  2532.  
  2533.  Quasar Prolog では,実行時に assert/1, retract/1 などで変更する述語に対し
  2534. て,dynamic 宣言を行う必要があります.この宣言が行われていない述語を実行時に
  2535. 変更しようとした場合には,エラーが検出され実行が中断されるため,煩わしく感じ
  2536. るかもしれません.しかしながら,プログラムの品質を向上させるという大きな利点
  2537. がありますので,以下の解説を呼んでプログラムに適切な宣言を記述するようにして
  2538. ください.
  2539.  PROLOG の内部データベースに格納されている節は,実行時にどのように扱われるか
  2540. という観点から2種類に分類することができます.1つは,その節がある述語の定義
  2541. の一部として,プログラムの実行中になんら変更を受けないもので,もう1つは,そ
  2542. の節がデータを記録するために利用され,実行時に変更を受けるものです.Quasar P
  2543. rolog のマニュアルでは,前者の節からなる述語を静的述語,後者の節からなる述語
  2544. を動的述語と呼びます.
  2545.  Quasar Prolog では,動的述語には dynamic 宣言を付加しておく必要があります.
  2546. 単にファイルやキーボードから述語の定義を入力しただけでは,その述語は静的述語
  2547. として扱われます.一般的に,プログラムを構成するほとんどの述語は,プログラム
  2548. の実行中に変更を受けない静的述語に分類され,動的述語に分類される述語は少ない
  2549. ために,宣言を付加する作業は面倒ではありません.以下に,宣言の行い方を簡単に
  2550. 示します.
  2551.  
  2552.     test(X) :- assertz(fact(X)).
  2553.  
  2554.     :- dynamic fact/1.
  2555.     fact(neko).
  2556.     fact(inu).
  2557.  
  2558.  この宣言は,3つの目的で使用されます.第1に,インタプリタの処理速度を向上
  2559. させるため,第2に,エラー検出に利用するため,そして第3に,コンパイラによっ
  2560. てプログラムをコンパイルするときに,コンパイルする述語とそうでない述語を分類
  2561. するために使用されます.
  2562.  Quasar Prolog では,同じ定義の述語でも,静的述語として宣言されている述語の
  2563. 方が,動的述語として定義されている述語よりも処理速度が速くメモリ使用量も少な
  2564. くなっています.これは,動的述語と宣言された述語では,述語の定義の変更に備え
  2565. た処理を付加しながらプログラムの実行を行わなければならないのに比べ,静的述語
  2566. と宣言された述語では,そのような処理が不用になるためです.また,将来 Quasar 
  2567. Prolog にコンパイラが実装された場合には,動的述語として定義されている述語は,
  2568. 実行時の定義の変更に備えるためにコンパイルされずにインタプリタで実行され,静
  2569. 的述語のみがコンパイルされて高速に実行されるようになります.
  2570.  使用者が定義した述語が動的述語か静的述語かを調べたい場合には,その述語の定
  2571. 義を listing/* で表示させることによって調べることができます.listing/* によっ
  2572. て述語の定義を表示させた場合,述語の定義の前に,以下のような宣言が表示されま
  2573. す.
  2574.     :- dynamic ファンクタ/アリティ        動的述語
  2575.     :- static ファンクタ/アリティ        静的述語
  2576.  
  2577.  clause/2 による節の参照は,動的述語だけに対して行うことができます.これは,
  2578. 将来,コンパイラが利用できるようになった場合に,静的述語はコンパイルされてし
  2579. まい,実行時には clause/2 で参照すべき節の構造が失われるためです.
  2580.  
  2581.  
  2582.  
  2583.                                 - 36 -
  2584.  
  2585.  
  2586. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2587.  
  2588.  
  2589.  
  2590. 7.2 内部データベースへの追加
  2591. ----------------------------------------------------------------------------
  2592.  
  2593.  内部データベースに節を追加するための述語として,以下に示す3種類の述語があ
  2594. ります.
  2595. 1)assert/1
  2596. 2)asserta/1
  2597. 3)assertz/1
  2598.  1)は3)と全く同一の機能を持っており,これらの述語は,引数を内部データベー
  2599. スの最後に追加します.2)の述語は,引数を内部データベースの最初に追加します.
  2600.  
  2601.  
  2602.  ファイルやキーボードからプログラムを読み込む場合には,本体に変数として記述
  2603. されているサブゴールは,以下に示すように call/1 を使用した述語の呼出に書き換
  2604. えられます.
  2605.     test(X) :- X.    ->    test(X) :- call(X).
  2606. このような変換は,プログラムの入力機能が行っているもので,assert/1 などの述語
  2607. が行っているものではありません.したがって,assert/1 などでサブゴールが変数に
  2608. なっている節を内部データベースに追加する場合には,call/1 を使用するような変換
  2609. は行われず,変数のサブゴールは変数のまま追加されてしまいます.したがって,呼
  2610. び出すサブゴールを実行時に定めるようなプログラムでは,変数のサブゴールに明示
  2611. 的に call/1 を付加してください.
  2612.  
  2613.     assert((test(X) :- X))        assert((test(X) :- call(X))
  2614.         誤り                正しい
  2615.  
  2616.  
  2617. 7.3 内部データベースからの削除
  2618. ----------------------------------------------------------------------------
  2619.  
  2620.  内部データベースから節を削除するための述語として,以下に示す3種類の述語が
  2621. あります.
  2622. 1)retract/1
  2623. 2)retractall/1
  2624. 3)abolish/2
  2625.  
  2626.  abolish/2 を使用することによって,ファンクタとアリティを指定して述語定義を
  2627. 削除することができます.
  2628.  
  2629.  
  2630. 7.4 内部データベースの参照
  2631. ----------------------------------------------------------------------------
  2632.  
  2633.  clause/2 の第1引数に頭部の項,第2引数に本体の項を与えると,両者と単一化可
  2634. 能な頭部と本体を持つ節の定義を得ることができます.第2引数は,具体化されてい
  2635. ない変数でも構いませんが,第1引数は,シンボルか構造でなければなりません.た
  2636. だし,引数が構造の場合には構造の引数の中に変数があっても構いません.
  2637.  
  2638.  
  2639.  
  2640.  
  2641.  
  2642.  
  2643.  
  2644.  
  2645.  
  2646.                                 - 37 -
  2647.  
  2648.  
  2649. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2650.  
  2651.  
  2652. ----------------------------------------------------------------------------
  2653. 8. プログラムの読み込みと表示
  2654. ----------------------------------------------------------------------------
  2655.  
  2656. 8.1 プログラム読み込み述語
  2657. ----------------------------------------------------------------------------
  2658.  
  2659.  プログラムを読み込むための述語として以下に示す3種類の述語を使用することが
  2660. できます.
  2661. 1)consult/1
  2662. 2)reconsult/1
  2663. 3)[ ] (リスト)
  2664.  一般的に,consult/1 は,あるファイルをはじめて読み込む場合に使用し,recons
  2665. ult/1 は,プログラムを書き換えたなどで同一のファイルを2度め以降に読み込む場
  2666. 合に使用します.
  2667.  以下に,consult/1 とreconsult/1 の違いを簡単に説明します.consult/1 は,読
  2668. み込んだプログラム(節)を単純にデータベースに追加していきます.一方 reconsu
  2669. lt/1 は,読み込み中のファイルの中に定義されている述語と同じファンクタとアリテ
  2670. ィを持つものがデータベースにすでに存在している場合には,すでにデータベースに
  2671. 格納されている述語の定義を削除して,新しく読み込んでいるファイルの中だけで定
  2672. 義されている内容をデータベースに格納します.
  2673.  あるファイルの中に次のような述語が定義されているとします.
  2674.     test(1,X) :- write(X).
  2675.     test(2, X) :- writeq(X).
  2676.     test(3, X) :- display(X).
  2677. このファイルを一度読み込ませた後に,ファイルを編集して上記の述語の定義を以下
  2678. のように変更し再度読み込ませます.
  2679.     test(write, X) :- write(X).
  2680.     test(writeq, X) :- writeq(X).
  2681.     test(display, X) :- display(X).
  2682. consult/1で再度読み込みを行わせた場合には,test/2の定義は,変更前の定義に変更
  2683. 後の定義を追加した以下のようになります.
  2684.     test(1, X) :- write(X).
  2685.     test(2, X) :- writeq(X).
  2686.     test(3, X) :- display(X).
  2687.     test(write, X) :- write(X).
  2688.     test(writeq, X) :- writeq(X).
  2689.     test(display, X) :- display(X).
  2690. 一方,reconsult/1 で再度読み込みを行わせた場合には,test/2 の定義は,変更後の
  2691. 定義だけに更新され,以下のようになります.
  2692.     test(write, X) :- write(X).
  2693.     test(writeq, X) :- writeq(X).
  2694.     test(display, X) :- display(X).
  2695.  
  2696.  consult/1 と reconsult/1 の簡略記法としてリストを用いることができます.[fi
  2697. le] は consult(file), [-file] は reconsult(file) の簡略記法として,それぞれ利
  2698. 用することができます.また,[file1, file2, ...] とすることで,複数のファイル
  2699. の読み込みを一度に指定することができます.この場合には,file1, file2, ... の
  2700. 順番でファイルが読み込まれます.
  2701.  
  2702.  プログラムを記述したソースファイルの中には,次のような述語を定義しないでく
  2703. ださい.
  2704.     end_of_file.
  2705. end_of_file は,PROLOG の読み込み述語によって特別な項として認識されます.この
  2706. 項が上記のように述語定義として用いられている場合には,それが読み込まれた時点
  2707.  
  2708.  
  2709.                                 - 38 -
  2710.  
  2711.  
  2712. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2713.  
  2714.  
  2715. でソースファイルが終了したと判断されてしまいます.このため,以降に多くの述語
  2716. 定義があった場合でも,それらの述語定義は読み込まれなくなります.
  2717.  
  2718.  
  2719. 8.2 拡張子の自動補完
  2720. ----------------------------------------------------------------------------
  2721.  
  2722.  上記の3種類の述語でプログラムを読み込む場合には,指定するファイル名に明示
  2723. 的に拡張子を付けなくても,Quasar Prolog によって拡張子が自動的に補完されます.
  2724.  
  2725.  Quasar Prolog は,以下のような順序でファイル名の補完を行い,最初に見つかっ
  2726. たファイルを読み込みます.
  2727. 1)指定されたファイル名
  2728. 2)指定されたファイル名に‘.qso’を追加したファイル名
  2729. 3)指定されたファイル名に‘.qsr’を追加したファイル名
  2730. 4)指定されたファイル名に‘.pro’を追加したファイル名
  2731. 5)指定されたファイル名に‘.pl’を追加したファイル名
  2732.  
  2733.  例えば,test というファイル名を指定した場合には,以下のような順序で最初に見
  2734. つかったファイルを読み込みます.
  2735. 1)test
  2736. 2)test.qso
  2737. 3)test.qsr
  2738. 4)test.pro
  2739. 5)test.pl
  2740.  
  2741.  なお,拡張子 .qso はコンパイラに予約されているので,プログラムファイルの拡
  2742. 張子として使用しないでください.
  2743.  
  2744.  
  2745. 8.3 プログラムの読み込み時のエラーと警告
  2746. ----------------------------------------------------------------------------
  2747.  
  2748.  Quasar Prolog は,プログラムを読み込む際に,文法エラーを検出して指摘する機
  2749. 能や,綴り間違いがあるかもしれない変数名に対する警告を行う機能を持っています.
  2750.  
  2751.  
  2752. 1)文法エラー
  2753.  文法的に間違いがあるプログラムを読み込もうとした場合には,Quasar Prolog は,
  2754. 文法エラーが検出された部分を示し,検出されたエラーの内容を表示します.
  2755.  
  2756.  Quasar Prolog は,プログラムがコンソールから入力されている場合とファイルか
  2757. ら読み込まれている場合で,エラーが検出されたときの処理(後始末)が少し異なっ
  2758. ています.
  2759.  プログラムがユーザの手によってコンソールから直接入力されている場合には,エ
  2760. ラーが検出された行の終わりまでが読み飛ばされると同時に,その時点で読み込み中
  2761. であった項は捨てられ,新たな次の項の入力が催促されます.一方,プログラムがフ
  2762. ァイルから読み込まれている場合には,エラーが見つかった部分に最も近い所にある
  2763. フルストップ(節の終わりを示す‘.’と空白文字の組み合わせ)までが読み飛ばさ
  2764. れると同時に,その時点で読み込み中であった項は捨てられ,フルストップの次の部
  2765. 分からのプログラムが継続して読み込まれます.
  2766.  このように処理方法が異なる理由は,コンソールからプログラムが入力されている
  2767. 場合に間違いがわかったならば,次の行の入力からすぐに訂正できるようにするため
  2768. です.また,ファイルから読み込まれている場合には,できるだけ多くの文法エラー
  2769. を一回の読み込みで見つけるためにこのような処理が行われます.
  2770.  
  2771.  
  2772.                                 - 39 -
  2773.  
  2774.  
  2775. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2776.  
  2777.  
  2778.  
  2779. 2)変数名の警告
  2780.  1つの節のなかに,1度だけしか表れない変数がある場合に警告を表示します.こ
  2781. れは単に警告が出力されるだけで,対象となる節はちゃんと読み込まれていますので
  2782. 無視しても構いません.しかしながら,この警告が出力された場合には,綴り間違い
  2783. などで変数名に誤りがあることが多いので,誤りがないかどうか確認するようにして
  2784. ください.
  2785.  
  2786. 3)異なるファイル間での述語の重複を警告
  2787.  同じ述語が複数のファイルで定義されている場合には警告を出力します.
  2788.  
  2789.  
  2790. 8.4 プログラムの書き換えと変換
  2791. ----------------------------------------------------------------------------
  2792.  
  2793.  Quasar Prolog は consult/1 などによってプログラムを読み込む際に,サブゴール
  2794. として使用されている変数に対して明示的に call/1 を付加する変換を行います.例
  2795. えば,次の左のように記述されているプログラムは,右のように変換されて内部デー
  2796. タベースに追加されます.
  2797.     test(X) :- X, test1    ->    test(X) :- call(X), test1.
  2798.  
  2799.  Quasar Prolog では,ユーザが定義した変換ルールを使用して,プログラムを変換
  2800. しながら読み込むことができます.
  2801.  この機能を利用した例として,DEC-10 PROLOG 用に作成されたプログラムを Quasa
  2802. r Prolog 用に変換して読み込む機能があります.実際の例は,classic.qsr の macr
  2803. o_body/3, classic_macro/ を参照してください.
  2804.  
  2805.  
  2806. 8.5 プログラムの表示
  2807. ----------------------------------------------------------------------------
  2808.  
  2809. 8.5.1 述語定義の表示
  2810.  
  2811.  Quasar Prolog の内部に読み込まれている述語の定義は,listing/* によって表示
  2812. させることができます.listing/0 を使用すると,内部データベースの全ての述語定
  2813. 義が出力され,listing/1 を使用すると,引数で指定された述語の定義が出力されま
  2814. す.listing/1 を使用する場合には,次に示すように,引数として定義を出力させた
  2815. い述語のファンクタだけを与える方法と,ファンクタとアリティを与える方法を利用
  2816. することができます.
  2817.     listing(ファンクタ).
  2818.     listing(ファンクタ/アリティ).
  2819. 前者の方法では,ファンクタが同一の述語であれば,アリティが異なっていても全て
  2820. の述語の定義が出力されます.一方,後者の方法では,ファンクタとアリティで指定
  2821. された唯一の述語の定義のみが出力されます.
  2822.  listing/1 の引数としてリストを使用することもできます.リストを使用する場合
  2823. には,その要素を上記の2種類の方法で与えます.リストを引数として与えられた場
  2824. 合には,listing/1 は,リストの要素で指定されたすべての述語の定義を出力します.
  2825.  
  2826.  なお,listing/* によって定義を出力できるのは,使用者によって定義された述語
  2827. のみで,Quasar Prolog の組み込み述語の定義は出力されません.
  2828.  
  2829.  
  2830. 8.5.2 シンボル情報の表示
  2831.  
  2832.  ある文字列を含むシンボルや述語が定義されているかどうかを調べる述語として,
  2833.  
  2834.  
  2835.                                 - 40 -
  2836.  
  2837.  
  2838. Quasar Prolog ユーザーズマニュアル                実行制御とデータベース操作
  2839.  
  2840.  
  2841. apropos/* があります.apropos/0 を使用すると現在定義されている全てのシンボル
  2842. のリストが表示されます.このリストでは,各シンボルに述語定義や演算子定義がな
  2843. されている場合には,以下の情報が付加されています.
  2844. 1)その述語がシステム組込みの述語か使用者が定義した述語か
  2845. 2)定義されている述語のアリティ
  2846. 3)演算子の種類と優先順位
  2847.  apropos/1 を使用すると,引数で指定したシンボルあるいは文字列を含むシンボル
  2848. だけの一覧が,apropos/0 と同様に出力されます.
  2849.  
  2850.  
  2851.  
  2852.  
  2853.  
  2854.  
  2855.  
  2856.  
  2857.  
  2858.  
  2859.  
  2860.  
  2861.  
  2862.  
  2863.  
  2864.  
  2865.  
  2866.  
  2867.  
  2868.  
  2869.  
  2870.  
  2871.  
  2872.  
  2873.  
  2874.  
  2875.  
  2876.  
  2877.  
  2878.  
  2879.  
  2880.  
  2881.  
  2882.  
  2883.  
  2884.  
  2885.  
  2886.  
  2887.  
  2888.  
  2889.  
  2890.  
  2891.  
  2892.  
  2893.  
  2894.  
  2895.  
  2896.  
  2897.  
  2898.                                 - 41 -
  2899.  
  2900.  
  2901. Quasar Prolog ユーザーズマニュアル                      入出力とファイル操作
  2902.  
  2903.  
  2904. ----------------------------------------------------------------------------
  2905. 9. ファイルとストリーム
  2906. ----------------------------------------------------------------------------
  2907.  
  2908. 9.1 ファイル名
  2909. ----------------------------------------------------------------------------
  2910.  
  2911. 9.1.1 一般のファイル
  2912.  
  2913.  ファイルを操作する述語のファイル名を指定する引数としてシンボル型のデータを
  2914. 利用することができます.ファイル名をシンボル型として記述する場合には,ファイ
  2915. ル名に含まれる文字の種類によって引用符”’”が必要になります.例えば,ファイ
  2916. ルの拡張子を含めてファイル名を記述する場合には,ファイル名に英文字や漢字のほ
  2917. かに‘.’が含まれますので引用符が必要になります.具体的には,test.qsr という
  2918. ファイル名を指定したい場合には,'test.qsr' と記述する必要があります.
  2919.  ファイル名の英字の大文字と小文字の違いは,オペレーティングシステムによって
  2920. 扱いが異なります.オペレーティングシステムが UNIX の場合には,ファイル名の大
  2921. 文字小文字が異ると異るファイル名として認識されますが,TOWNS-OS, MS-DOS の場合
  2922. には,ファイル名の大文字小文字は意味を持たず,同一のファイルとして認識されま
  2923. す.なお,TOWNS-OS と MS-DOS の場合には,ユーザが指定したファイル名に大文字が
  2924. 含まれていても,処理系内部で小文字だけからなるファイル名に変換されます.
  2925.  ファイル名の指定は,絶対パスと相対パスのどちらでも指定することができます.
  2926. パス指定においてディレクトリを区切る文字としては,/ を使用します.TOWNS-OS と
  2927.  MS-DOS では,/ の替りに \ を使用することができますが,\ を使用した場合には,
  2928. 処理系内部で / に変換されます.
  2929.  
  2930.  
  2931. 9.1.2 特殊ファイル
  2932.  
  2933.  Quasar Prolog における特殊なファイル名として,以下の3種類があります.
  2934. 1)user_input
  2935. 2)user_output
  2936. 3)user
  2937.  user_input は端末装置からの入力,user_output は端末装置への出力を表すファイ
  2938. ル名あるいはストリームとして使用されます.この2種類の特殊ファイル名は,ファ
  2939. イル名とストリームとしての2種類の役割を持っており,ファイル名もしくはストリー
  2940. ムを指定する必要がある述語の引数の値として使用することができます.user_input
  2941.  と user_output が指定されると,ディスク上にそのファイル名のファイルが存在す
  2942. るかどうかにかかわらず,端末装置が入出力先になります.このため,ディスク上の
  2943.  user_input と user_output というファイルを扱うことは,基本的にはできません.
  2944. もし,どうしてもこれらのファイル名を持つファイルを操作したい場合には,'./use
  2945. r_input' あるいは './user_output' というファイル名を指定することによって,そ
  2946. れぞれが指定するファイルを操作することができます.
  2947.  consult/1, reconsult/1, [ ] を使用する場合には,端末装置からの入力を表すフ
  2948. ァイル名として user を使用することができます.
  2949.  
  2950.  
  2951. 9.2 ストリーム
  2952. ----------------------------------------------------------------------------
  2953.  
  2954.  Quasar Prolog の入出力は,ストリームに対して行います.ストリームは,データ
  2955. が流れる向きによって,入力ストリームと出力ストリームに分類されます.ストリー
  2956. ムは,以下のように表示されます.
  2957.     #<入力用 ファイルストリーム #xzzzzzzzz>
  2958.     #<出力用 ファイルストリーム #xzzzzzzzz>
  2959.  
  2960.  
  2961.                                 - 42 -
  2962.  
  2963.  
  2964. Quasar Prolog ユーザーズマニュアル                      入出力とファイル操作
  2965.  
  2966.  
  2967.  
  2968.  また,ストリームは,入出力を行う対象によって以下のように分類されます.
  2969. 1)ファイル
  2970. 2)プロセス間通信        (UNIX DOMAIN or MESSAGE)
  2971. 3)ネットワーク間通信    (INTERNET DOMAIN)
  2972.  
  2973.  
  2974. 9.3 ファイルのオープンとクローズ
  2975. ----------------------------------------------------------------------------
  2976.  
  2977. 9.3.1 ファイルのオープン
  2978.  
  2979.  ファイルに対する入出力を行う場合には,まず,ファイルをオープンしそのファイ
  2980. ルに結び付けられたストリームを得なければなりません.ファイルは,open/3 を使っ
  2981. てオープンすることができます.open/3 は,第1引数で指定されたファイルをオープ
  2982. ンすることができた場合には,そのファイルに結び付けられたストリームを第3引数
  2983. に返します.open/3 は,ファイルを入力,出力,追加の3種類の用途でオープンする
  2984. ことができます.入力を指定する場合には input,出力を指定する場合には output,
  2985. 追加を指定する場合には append を第2引数に与えます.入力を指定した場合には入
  2986. 力用ストリームが得られ,出力と追加を指定した場合には出力用ストリームが得られ
  2987. ます.
  2988.  ファイルを入力用にオープンしようとしたときに,指定したファイルが存在してい
  2989. なかった場合にはエラーになります.ファイルを出力用にオープンした場合には,指
  2990. 定したファイルがすでに存在しているか否かにかかわらず,まず,中身が空の新しい
  2991. ファイルが作成され,そのファイルに対して以降の操作が適用されます.もし,すで
  2992. にファイルが存在していた場合には,そのファイルは失われます.ファイルが追加用
  2993. にオープンした場合には,もし,指定したファイルがすでに存在していれば,そのフ
  2994. ァイルの最後から以降の操作が適用されます.もし,指定したファイルが存在してい
  2995. ない場合には,中身が空の新しいファイルが作成され,そのファイルに対して以降の
  2996. 操作が適用されます.
  2997.  同一のファイルに対して複数回の open/3 を使用することによって,同じファイル
  2998. に対して複数のストリームを同時にオープンすることができます.このような操作は,
  2999. 入力ストリームに関しては意味がある操作なので,問題なく使用することができます
  3000. が,出力ストリームに関しては動作を保証していません.
  3001.  
  3002.  
  3003. 9.3.2 ファイルのクローズ
  3004.  
  3005.  オープンされたファイル(ストリーム)をクローズする操作は,close/1 によって
  3006. 行います.close/1 の引数には,クローズしたいストリームを与えます.user_input
  3007.  と user_output に対して close/1 を使用した場合には,2つのストリームはともに
  3008. クローズされずに継続して使用できます.ただし,line_count/2 と line_position/
  3009. 2 で得られる値が,両者とも0に初期化されます.
  3010.  現在オープンされているストリームを全てクローズしたい場合には,close_all/0 
  3011. を使用します.close_all/0 は,user_input と user_output を除き,オープンされ
  3012. ている全てのストリームをクローズします.user_input と user_output は,なんら
  3013. 影響は受けません.なお,標準入出力が user_input,user_output 以外に切り替えら
  3014. れている場合には,標準入力,標準出力がそれぞれ user_input,user_output に戻さ
  3015. れます.
  3016.  
  3017.  
  3018. 9.4 ストリームに関する問い合わせ
  3019. ----------------------------------------------------------------------------
  3020.  
  3021. 1)ストリームの取得
  3022.  
  3023.  
  3024.                                 - 43 -
  3025.  
  3026.  
  3027. Quasar Prolog ユーザーズマニュアル                      入出力とファイル操作
  3028.  
  3029.  
  3030.  現在オープンされているストリームを取得したい場合には,current_stream/1 を使
  3031. 用します.
  3032.     current_stream(-Stream)
  3033.  current_stream/1 は複数回充足させることが可能で,成功する度に現在オープンさ
  3034. れているストリームを1つづつ返します.ただし,最初からオープンされているスト
  3035. リームである user_input と user_output は返しません.
  3036.  
  3037.  current_input/1 は標準入力に結び付けられている入力ストリームを返します.ま
  3038. た,current_output/1 は標準出力に結び付けられている入力ストリームを返します.
  3039.  
  3040.  
  3041.  
  3042. 2)ストリームの状態の調査
  3043.  
  3044.  ある項がストリーム型のデータか否かは,streamp/1 を使用して確認することがで
  3045. きます.また,input_stream_p/1 を使用すると,ある項が入力ストリームか否か,o
  3046. utput_stream_p/1 を使用すると,ある項が出力ストリームか否かを確認することがで
  3047. きます.
  3048.  
  3049.  line_count/2 は,第2引数で指定されたストリームで現在処理している行数を第1
  3050. 引数に返します.line_position/2 は,第2引数で指定されたストリームで現在処理
  3051. している行におけるバイト数を第1引数に返します.
  3052.  
  3053. #| まだです
  3054. stream_property/3
  3055.  
  3056. stream_property(+Stream, -File, -Mode)
  3057.     File ::= path
  3058.         | inet(host, port) | socket(port) | message(fd)
  3059.         | window(host, display)
  3060.     Mode ::= {input | output}({character | byte}) | closed
  3061. |#
  3062.  
  3063.  
  3064.  
  3065.  
  3066.  
  3067.  
  3068.  
  3069.  
  3070.  
  3071.  
  3072.  
  3073.  
  3074.  
  3075.  
  3076.  
  3077.  
  3078.  
  3079.  
  3080.  
  3081.  
  3082.  
  3083.  
  3084.  
  3085.  
  3086.  
  3087.                                 - 44 -
  3088.  
  3089.  
  3090. Quasar Prolog ユーザーズマニュアル                      入出力とファイル操作
  3091.  
  3092.  
  3093. 9.5 標準入出力の操作
  3094. ----------------------------------------------------------------------------
  3095.  
  3096. 9.5.1 標準入出力
  3097.  
  3098.  Quasar Prolog には多くの入出力用の述語があります.これらの入出力用の述語の
  3099. 中には,入出力操作を行うストリームを明示的に指定して呼び出すものと,そうでな
  3100. いものがあります.入出力操作を行う述語のうち,ストリームを明示的に指定しない
  3101. 述語が使用するストリームが,標準入出力と呼ばれます.Quasar Prolog が起動され
  3102. た時点では,標準入出力は端末に結び付けられています.したがって,ストリームを
  3103. 指定しない入出力述語を使用した場合には,端末に対して入出力操作が行われること
  3104. になります.
  3105.  
  3106.  
  3107. 9.5.2 標準入出力の切り替え
  3108.  
  3109.  標準入出力は,必要に応じて端末以外のストリームに切り替えることができます.
  3110. 標準入出力の切り替に関連する述語を以下に示します.
  3111.  
  3112. 1)入力
  3113.     see/1
  3114.     seeing/1
  3115.     seen/0
  3116.  
  3117. 2)出力
  3118.     tell/1
  3119.     telling/1
  3120.     told/0
  3121.  
  3122.  see/1 と tell/1 は,それぞれ指定されたストリーム(ファイル)に標準入力と,
  3123. 標準出力を切り替えます.
  3124.  see/1 あるいは tell/1 で指定されたファイルがまだオープンされていなければ,
  3125. ファイルが新たにオープンされてストリームが用意され,そのストリームに対して標
  3126. 準入出力が切り替えられます.一方,そのファイルがすでにオープンされストリーム
  3127. が利用可能になっている場合には,単に標準入出力がそのストリームに切り替えられ
  3128. るだけです.この場合,ストリームに対する入出力操作は,そのストリームに対して
  3129. 最後の操作が行われた部分から継続して処理が行われます.
  3130.  user_input,user_output に対して seen/0,told/0 を行った場合には,そのスト
  3131. リームは閉じられませんが,line_count/1 で得られる値が0に初期化されます.
  3132.  
  3133.  
  3134.  
  3135.  
  3136.  
  3137.  
  3138.  
  3139.  
  3140.  
  3141.  
  3142.  
  3143.  
  3144.  
  3145.  
  3146.  
  3147.  
  3148.  
  3149.  
  3150.                                 - 45 -
  3151.  
  3152.  
  3153. Quasar Prolog ユーザーズマニュアル                      入出力とファイル操作
  3154.  
  3155.  
  3156. 9.6 入出力操作
  3157. ----------------------------------------------------------------------------
  3158.  
  3159.  入出力用の述語は,それぞれ,標準入出力に対して操作を行うものと,指定された
  3160. ストリームに対して操作を行うものを対にして用意しています.
  3161.  
  3162.  
  3163. 9.6.1 入力操作
  3164.  
  3165. 1)項の入力
  3166.  
  3167.  項の入力は read/* を使用して行います.項を標準入力から入力する場合には,re
  3168. ad/1 を,項を指定したストリームから読み込む場合には read/2 を使用します.rea
  3169. d/* は項を読み込むと,第1引数の値として返します.
  3170.  read/* はフルストップを検出するまで項を読み込もうとします.したがって,rea
  3171. d/* で読み込まれる項の最後には,必ずフルストップを付加しなければなりません.
  3172. これは,ファイルに記述されている項だけでなく,端末から項を直接入力する場合で
  3173. も同様です.
  3174.  read/* がストリームの終端に遭遇した場合には,入力された項として end_of_fil
  3175. e を返します.
  3176.  
  3177.  入力するストリームが user_input (端末)の場合には,read/* は,ユーザに入力
  3178. を促すプロンプトを出力します.このプロンプトは prompt/2 によって変更すること
  3179. ができますが,変更していない場合には,'|: ' が使用されます.
  3180.  
  3181.  項の読み込み中に文法エラーが検出された場合には,read/* は,単に失敗します.
  3182.  
  3183.  
  3184.  
  3185. 2)文字の入力
  3186.  
  3187.  文字の入力は,read_char/* を使用して行います.標準入力から文字を入力する場
  3188. 合には read_char/1 を,指定したストリームから文字を入力する場合には read_cha
  3189. r/2 を使用します.read_char/* は文字を読み込むと,文字型のデータとして第1引
  3190. 数に返します.read_char/* がストリームの終端に遭遇した場合には,入力された項
  3191. として end_of_file を返します.
  3192.  1行の文字列の入力は,read_line_chars/* を使用して行います.標準入力から文
  3193. 字列を入力する場合には read_line_chars/1 を,指定したストリームから文字列を入
  3194. 力する場合には read_line_chars/2 を使用します.read_line_chars/* は文字列を読
  3195. み込むと,文字型リストのデータとして第1引数に返します.read_line_chars/* が
  3196. ストリームの終端に遭遇した場合には,それまでに入力された文字列の文字型リスト
  3197. を返します.
  3198.  
  3199.  
  3200. 3)入力プロンプトの変更
  3201.  read/* で端末から入力を行う場合に表示されるプロンプトは,prompt/2 で変更す
  3202. ることができます.prompt/2 で変更されたプロンプトは,次の質問を実行する際に,
  3203. 既定のプロンプト '|: ' に戻されます.
  3204.  
  3205.  
  3206. 9.6.2 出力操作
  3207.  
  3208. 1)項の出力
  3209.  
  3210.  項の出力を行う述語は以下の4種類があります.
  3211.  
  3212.  
  3213.                                 - 46 -
  3214.  
  3215.  
  3216. Quasar Prolog ユーザーズマニュアル                      入出力とファイル操作
  3217.  
  3218.  
  3219. A)write/*
  3220. B)writeq/*
  3221. C)display/*
  3222. D)print/*
  3223.  write/* は,現在の演算子定義に基づいて出力を行い,出力する項を構成している
  3224. 文字そのものだけを出力します.writeq/* は,現在の演算子定義に基づいて出力を行
  3225. い,出力する項が read/* によって読み込むことができるように,引用符が必要な場
  3226. 合には引用符を付加して出力します.display/* は,演算子定義を用いずに出力を行
  3227. うほかは writeq/* と同様です.
  3228.  
  3229.  これらの4種類の述語による出力では,項の終了を示すフルストップは付加されま
  3230. せん.したがって,出力した項を read/* を用いて再度読み込ませる場合など,フル
  3231. ストップが必要であれば write_char/* などで明示的に出力する必要があります.
  3232.  
  3233.  
  3234. 2)文字の出力
  3235.  
  3236.  文字型のデータを出力する方法として,write/* を使用する方法と,write_char/*
  3237.  を使用する方法があります.前者は,出力されたデータを read/* を使って場合に文
  3238. 字型のデータとして読み込めるように出力します.一方,後者は,文字型データで指
  3239. 定された文字自体を出力します.
  3240.  例えば,write(#\a) を実行すると #\a が出力されますが,write_char(#\a) を実
  3241. 行すると a が出力されます.
  3242.  文字型リストは,write_chars/* と write_line_chars/* を使用して出力すること
  3243. ができます.write_chars/* を使用して出力した場合には,出力されるのは指定され
  3244. た文字型リストを文字列として表示したものだけですが,write_line_chars/* を使用
  3245. して出力した場合には,出力された文字列の最後で改行が行われます.
  3246.  
  3247.  
  3248. 3)改行出力
  3249.  
  3250.  改行の出力は,terpri/* を使用して行います.flesh_line/* も改行を行うのに使
  3251. 用されますが,terpri/* が必ず改行出力を行うのと異なり,もし改行を行おうとして
  3252. いる出力ストリームで,次の文字の出力位置が明かに行の最初の位置にあることが検
  3253. 出された場合には,改行出力を行いません.
  3254.  
  3255.  
  3256. 9.6.3 書式指定を用いた出力
  3257.  
  3258.  format/* を使用して,書式指定付の出力を行うことができます.format/2 では,
  3259. 第1引数に書式指定,第2引数に出力するデータのリストを与えます.format/3 で
  3260. は,第1引数に出力ストリーム,第2引数に書式指定,第3引数に出力するデータの
  3261. リストを与えます.データのリストの要素数が書式指定によって必要となるデータの
  3262. 個数よりも少ない場合には,エラーとなります.逆にデータのリストの要素数が,書
  3263. 式指定によって必要となるデータの個数よりも多い場合には,余ったデータの要素が
  3264. 単に無視されるだけで,エラーは生じません.
  3265.  
  3266. ○ 書式指定子の一覧
  3267.  
  3268.     ~A    あらゆる項の出力
  3269.     ~Q    あらゆる項の出力(引用符が必要であれば付ける)
  3270.  
  3271.     ~C    文字型の出力
  3272.     ~L    文字列型のリストの出力
  3273.  
  3274.  
  3275.  
  3276.                                 - 47 -
  3277.  
  3278.  
  3279. Quasar Prolog ユーザーズマニュアル                      入出力とファイル操作
  3280.  
  3281.  
  3282.     ~D    10進数の出力
  3283.     ~B    2進数の出力
  3284.     ~O    8進数の出力
  3285.     ~X    16進数の出力
  3286.  
  3287.     ~F    浮動小数型の出力
  3288.     ~E    浮動小数型の出力
  3289.     ~G    浮動小数型の出力
  3290.  
  3291.     ~~    ~自身の出力
  3292.     ~%    改行出力
  3293.     ~&    改行出力(カーソルが行の先頭にあることが明らかではない場合)
  3294.     ~T    タブ出力
  3295.     ~|    改ページ出力
  3296.     ~{    繰り返しの記述
  3297.  
  3298.  
  3299. ○ オプションの一般型
  3300.  
  3301. ○ 項の出力
  3302.  ~A は,項を write/* と同様に出力し,~Q は,項を writeq/* と同様に出力しま
  3303. す.
  3304.  
  3305. ○ 文字の出力
  3306.  ~C は,項を write_char/* と同様に出力し,~L は,項を write_chars/* で出力す
  3307. るのと同様に出力します.
  3308.  
  3309. ○ 整数値の出力
  3310.  整数型のデータを ~D は10を基数として,~B は2を基数として,~O は8を基数
  3311. として,~X は16を基数として出力します.
  3312.  基数が10進数以外の場合でも書式指定の一部として指定しない限りは,基数を表
  3313. す #b, #o, #x などは出力に付加されません.このような出力が必要な場合には,次
  3314. のように明示的に基数を出力するように書式指定を行います.
  3315.     format('#x~X', [#x123])
  3316.  
  3317. ○ 浮動小数値の出力
  3318.  浮動小数型のデータを ~F は xxx.xxxx の形式で,~E は xxxeyy の形式で出力しま
  3319. す.~G はデータの値によって ~F, ~E の適切と考えられる形式を選択して出力を行い
  3320. ます.
  3321.  
  3322. ○ その他の書式指定子
  3323.  ~~ は,文字 ~ 自身を出力します.
  3324.  ~% は,terpri/* と同様に,~& は,flesh_line/* と同様に改行の出力を行います.
  3325.  
  3326. ~T    タブ出力
  3327. ~|    改ページ出力
  3328. ~{    繰り返しの記述
  3329.  
  3330.  
  3331.  
  3332.  
  3333.  
  3334.  
  3335.  
  3336.  
  3337.  
  3338.  
  3339.                                 - 48 -
  3340.  
  3341.  
  3342. Quasar Prolog ユーザーズマニュアル                      入出力とファイル操作
  3343.  
  3344.  
  3345. ----------------------------------------------------------------------------
  3346. 10. ファイルとディレクトリの操作
  3347. ----------------------------------------------------------------------------
  3348.  
  3349. 10.1 ファイルの操作
  3350. ----------------------------------------------------------------------------
  3351.  
  3352. 1)ファイルの存在の確認
  3353.  probe_file/1 を使用して,指定されたファイルが存在しているか否かを確認するこ
  3354. とができます.
  3355.  
  3356. 2)ファイルの消去
  3357.  delete_file/1 を使用して,指定されたファイルを消去することができます.
  3358.  
  3359. 3)ファイル名の変更
  3360.  rename_file/2 を使用して,第1引数で指定されたファイルのファイル名を第2引
  3361. 数で指定されたファイル名に変更します.
  3362.  
  3363.  
  3364.  
  3365. 10.2 ディレクトリの操作
  3366. ----------------------------------------------------------------------------
  3367.  
  3368. 1)ホームディレクトリの取得
  3369.  user_homedir_pathname/1 を使用して,使用者のホームディレクトリを取得するこ
  3370. とができます.
  3371.  
  3372. 2)ファイルの絶対パスの取得
  3373.  full_pathname/2 を使用して,相対指定されたファイルの絶対パスを取得すること
  3374. ができます.
  3375.  
  3376. 3)既定ディレクトリの変更
  3377.  change_directory/1 を使用して,現在の既定ディレクトリを変更することができま
  3378. す.
  3379.  
  3380. 4)ディレクトリの作成
  3381.  make_directory/1 を使用して,ディレクトリを作成することができます.
  3382.  
  3383.  
  3384.  
  3385.  
  3386.  
  3387.  
  3388.  
  3389.  
  3390.  
  3391.  
  3392.  
  3393.  
  3394.  
  3395.  
  3396.  
  3397.  
  3398.  
  3399.  
  3400.  
  3401.  
  3402.                                 - 49 -
  3403.  
  3404.  
  3405. Quasar Prolog ユーザーズマニュアル                                  算術演算
  3406.  
  3407.  
  3408. ----------------------------------------------------------------------------
  3409. 11. 算術演算
  3410. ----------------------------------------------------------------------------
  3411.  
  3412.  Cや FORTRAN などの多くの手続き型言語と同様に,Quasar Prologにおいても,算
  3413. 術式(計算式)をシステムに与えて数値演算をさせることができます.
  3414.  
  3415.  
  3416. 11.1 算術演算を行う述語
  3417. ----------------------------------------------------------------------------
  3418.  
  3419.  与えられた引数を算術式とみなして算術演算を行う述語を以下に示します.これら
  3420. の述語は,演算結果の代入を行うものと比較を行うものに分類されます.
  3421.  
  3422. 1)代入
  3423.     変数 := 式
  3424.         右辺の式を評価して左辺の変数に代入します.
  3425.  
  3426. 2)比較
  3427.     式1 =:= 式2
  3428.         式1と式2の評価結果が等しい場合に成功します.
  3429.     式1 ¥== 式2
  3430.         式1と式2の評価結果が異なる場合に成功します.
  3431.     式1 > 式3
  3432.         式1の評価結果が式2の評価結果よりも大きい場合に成功します.
  3433.     式1 < 式2
  3434.         式1の評価結果が式2の評価結果よりも小さい場合に成功します.
  3435.     式1 >= 式2
  3436.         式1の評価結果が式2の評価結果以上の場合に成功します.
  3437.     式1 =< 式2
  3438.         式1の評価結果が式2の評価結果以下の場合に成功します.
  3439.  
  3440.  両辺の式の評価結果の比較は,両辺の評価結果が整数値の場合には整数値で,両辺
  3441. の評価結果が浮動小数値の場合には浮動小数値で行われます.また,両者が整数値と
  3442. 浮動小数値と異なる場合には,整数値の方を浮動小数値に変換した後に,両者を浮動
  3443. 小数値で比較します.
  3444.  
  3445.  
  3446. 11.2 データ型
  3447. ----------------------------------------------------------------------------
  3448.  
  3449.  算術式の中に値として記述することができるデータ型を以下に示します.
  3450.  
  3451. 1)整数型
  3452.  
  3453. 2)浮動小数型
  3454.  
  3455. 3)シンボル型
  3456.  算術式の中で使用できるシンボルアトムは以下の4種類です.
  3457.     pi
  3458.     e
  3459.     cputime
  3460.         使用したCPU時間を秒単位で返します.
  3461.     runtime
  3462.         使用した実時間を秒単位で返します.
  3463.  
  3464.  
  3465.                                 - 50 -
  3466.  
  3467.  
  3468. Quasar Prolog ユーザーズマニュアル                                  算術演算
  3469.  
  3470.  
  3471.  これらは,全て浮動小数型の値として評価されます.
  3472.  
  3473. 4)文字型
  3474.  
  3475.  文字型のデータは,半角文字の場合には ASCII コード値の,全角文字の場合には 
  3476. JIS コード値の整数値として評価されます.文字型のデータと1文字のシンボルアト
  3477. ムを混同しないように注意してください.例えば,本来ならば,'#\a' と記述する部
  3478. 分に,誤って'a'と記述しないように注意してください.
  3479.  
  3480.  
  3481. 11.3 算術演算子
  3482. ----------------------------------------------------------------------------
  3483.  
  3484.  算術演算子は単項演算子と二項演算子に分類されます.算術式に使用できる算術演
  3485. 算子を以下に示します.演算子に関しては,この節のほかに,文法を述べている章で
  3486. の演算子の節も合わせて参照してください.なお,演算子は,op/3 を使用して新たに
  3487. 定義することができますが,算術演算子として算術式の中で評価できるのは,この節
  3488. に示しているものだけです.使用者が定義した演算子は,算術式の一部として利用す
  3489. ることはできないので注意してください.
  3490.  
  3491. 11.3.1 単項演算子
  3492.  
  3493.  単項演算子には以下の2種類があります.
  3494.  
  3495.     + 式
  3496.     - 式
  3497.  
  3498.  多くの PROLOG 処理系で + が単項演算子として定義されていませんが,Quasar Pr
  3499. ologでは,- との対称性を保持するために用意されています.
  3500.  
  3501.  
  3502. 11.3.2 二項演算子
  3503.  
  3504.  二項演算子には以下の9種類があります.
  3505.  
  3506.     式1 + 式2        加算
  3507.     式1 - 式2        減算
  3508.     式1 * 式2        乗算
  3509.     式1 / 式2        除算
  3510.     式1 // 式2    除算(整数)
  3511.     式1 /¥ 式2    ビット積
  3512.     式1 ¥/ 式2    ビット和
  3513.     式1 << 式2    左シフト
  3514.     式1 >> 式2    右シフト
  3515.  
  3516.  
  3517. 11.3.3 演算子の優先順位
  3518.  
  3519.  一つの算術式に複数の演算子が使用されている場合には,それぞれの演算子に与え
  3520. られている優先順位に基づいて,演算が行われます.
  3521.  以下に,Quasar Prolog の標準的な演算子定義を示します.
  3522.  
  3523.     演算子            優先順位    型
  3524.     + -            300         fx
  3525.     * / //            400        yfx
  3526.  
  3527.  
  3528.                                 - 51 -
  3529.  
  3530.  
  3531. Quasar Prolog ユーザーズマニュアル                                  算術演算
  3532.  
  3533.  
  3534.     + -            500        yfx
  3535.     << >>            550        yfx
  3536.     /\            600        yfx
  3537.     \/            650        yfx
  3538.     := =:= =\= > >= < =<    700        xfx
  3539.  
  3540.  括弧‘()’で式をくくることによって演算子の優先順位を変更させることができ
  3541. ます.括弧で式をくくると,くくられた式の演算が先に行われます.
  3542.  
  3543.  
  3544. 11.4 算術関数
  3545. ----------------------------------------------------------------------------
  3546.  
  3547.  式の中に記述できる関数を以下に示します.
  3548.  
  3549. 1)三角関数
  3550.  
  3551.  三角関数に与える角度の単位はラジアンです.
  3552.     sin(式)        式のサイン値を計算します
  3553.     cos(式)        式のコサイン値を計算します
  3554.     tan(式)        式のタンジェント値を計算します
  3555.     asin(式)        式のアークサイン値を計算します
  3556.     acos(式)        式のアークコサイン値を計算します
  3557.     atan(式)        式のアークタンジェント値を計算します
  3558.     sinh(式)        式のハイパボリックサイン値を計算します
  3559.     cosh(式)        式のハイパボリックコサイン値を計算します
  3560.     tanh(式)        式のハイパボリックタンジェント値を計算します
  3561.  
  3562. 2)指数対数関数
  3563.  
  3564.     exp(式)        式の指数関数値を計算します
  3565.     expt(式1,式2)    式1の式2乗の値を計算する
  3566.     log(式)        式の自然対数値を計算します
  3567.     log(式1,式2)    式2の値を底とする式1の対数を計算します.
  3568.  
  3569. 3)型変換
  3570.  
  3571.     integer(式)    式の整数値を返します
  3572.     float(式)    式の浮動小数値を返します
  3573.  
  3574. 4)その他
  3575.  
  3576.     abs(式)        式の絶対値を返します
  3577.     sqrt(式)        式の平方根値を返します
  3578.     floor(式)    式の小数点以下を切り捨てた値を返します
  3579.     ceiling(式)    式の小数点以下を切り上げた値を返します
  3580.     mod(式1,式2)    式1を式2で割った余りを返します
  3581.     neg(式)        式の1の補数値を返します
  3582.     not(式)        式の論理否定値を返します
  3583.  
  3584.  
  3585. 11.5 引数と演算結果のデータ型
  3586. ----------------------------------------------------------------------------
  3587.  
  3588.  算術演算子と関数が取ることができる引数の型と,算出された値のデータ型がどの
  3589.  
  3590.  
  3591.                                 - 52 -
  3592.  
  3593.  
  3594. Quasar Prolog ユーザーズマニュアル                                  算術演算
  3595.  
  3596.  
  3597. ようになるかという規則を以下に示します.
  3598.  
  3599.  
  3600. 11.5.1 算術演算子
  3601.  
  3602. 1)演算結果の型が引数の型によるもの
  3603.  
  3604.  引数には整数値と浮動小数値のどちらも使用することができます.なお,2つの引
  3605. 数のデータ型が異なっていてもかまいません.演算結果は引数の型により,式1と式
  3606. 2がともに整数型であれば演算結果は整数型,どちらか一方でも浮動小数型であれば
  3607. 演算結果は浮動小数型になります.
  3608.     式1 + 式2        加算
  3609.     式1 - 式2        減算
  3610.     式1 * 式2        乗算
  3611.     式1 mod 式2    剰余算
  3612.  
  3613. 2)演算結果が引数の型によらず浮動小数型
  3614.  
  3615.  以下の除算は式1,式2のデータ型にかかわらず,つねに浮動小数型の演算結果を
  3616. 返します.
  3617.     式1 / 式2        除算
  3618.  
  3619. 3)演算結果が引数の型によらず整数型
  3620.  
  3621.  以下の除算は式1,式2のデータ型にかかわらず,つねに整数型の演算結果を返し
  3622. ます.
  3623.     式1 // 式2    除算
  3624. この演算は,2つの式がどちらも整数型であれば,整数値の除算を行って小数点以下
  3625. を切り捨てた整数型の計算結果を得ます.また,2つの式のどちらかあるいは両者が
  3626. 浮動小数型であれば,その引数の小数点以下を切り捨てることによって整数型に変換
  3627. した後に整数型での除算を行ない,その計算結果の小数点以下を切り捨てて整数型の
  3628. 計算結果を得ます.
  3629.  
  3630. 4)演算結果も引数も整数型
  3631.  
  3632.  以下に示す算術演算子は,引数と演算結果はともに整数値
  3633.     式1 /¥ 式2
  3634.     式1 ¥/ 式2
  3635.     式1 >> 式2
  3636.     式1 << 式2
  3637.  
  3638.  
  3639. 11.5.2 関数
  3640.  
  3641.  関数が返す値の型を以下に示します.これらの関数の引数は,整数型でも浮動小数
  3642. 型でも構いません.
  3643.     sin(式)        浮動小数型
  3644.     cos(式)        浮動小数型
  3645.     tan(式)        浮動小数型
  3646.     asin(式)        浮動小数型
  3647.     acos(式)        浮動小数型
  3648.     atan(式)        浮動小数型
  3649.     sinh(式)        浮動小数型
  3650.     cosh(式)        浮動小数型
  3651.     tanh(式)        浮動小数型
  3652.  
  3653.  
  3654.                                 - 53 -
  3655.  
  3656.  
  3657. Quasar Prolog ユーザーズマニュアル                                  算術演算
  3658.  
  3659.  
  3660.     abs(式)        式の評価結果と同じ型
  3661.     exp(式)        浮動小数型
  3662.     expt(式1,式2)    式1と式2の評価結果が整数型であれば整数型
  3663.                 それ以外は浮動小数型
  3664.     log(式)        浮動小数型
  3665.     log(式1,式2)    浮動小数型
  3666.     sqrt(式)        浮動小数型
  3667.     floor(式)    整数型
  3668.     ceiling(式)    整数型
  3669.     integer(式)    整数型
  3670.     float(式)    浮動小数型
  3671.  
  3672.  
  3673. 11.6 算術エラー
  3674. ----------------------------------------------------------------------------
  3675.  
  3676.  算術エラーの検出機能は,今のところ,各マシン用のCコンパイラが持つエラー検
  3677. 出機能に強く依存しています.このため,ここに記述されているようには処理されな
  3678. いものがありますので注意してください.
  3679.  
  3680. 1)整数演算のオーバーフロー
  3681.  整数演算中にオーバーフローが生じた場合には,エラーの報告は行われません.
  3682.  
  3683. 2)浮動小数演算のオーバーフローとアンダーフロー
  3684.  浮動小数演算中にオーバーフローが生じた場合には,エラーが報告されます.また,
  3685. アンダーフロウが生じた場合には,その値は0に近似されます.
  3686.  
  3687. 3)関数の引数の定義域
  3688.  逆三角関数などの引数の定義域が定められている関数に与えられた引数値が,その
  3689. 関数の定義域からはずれている場合にはエラーが検出されます.
  3690.  
  3691. 4)関数の精度の喪失
  3692.  三角関数の sin や cos などの引数があまりに大きい場合には,算出された結果の
  3693. 精度が失われている可能性があります.このような場合には,エラーが検出されます.
  3694.  
  3695.  
  3696.  
  3697. 11.7 数値の有効精度
  3698. ----------------------------------------------------------------------------
  3699.  
  3700.  Quasar Prolog では,数値として整数型と浮動小数型を使用することができます.
  3701. これらの数値として扱える値の範囲と有効精度を以下に示します.
  3702.  Quasar Prolog では,入出力時や計算結果として得られた数値を記憶しておくとき
  3703. の精度と,式の計算中における精度では,数値の有効精度が異なっています.
  3704.  
  3705. 1)数値の格納時における精度
  3706.  整数として使用できる数値の精度は27ビットで,最大値は 67108863,最小値は,
  3707. -67108864 です.
  3708.  実数として使用できる数値の精度は29ビットで,表現できる数値の範囲は, 1e3
  3709. 8 から 1e-37,-1e38 から -1e-37 までです.
  3710.  また,仮数部の精度は,21ビット,6桁程度です.
  3711.  
  3712. 2)算術式の演算時における精度
  3713.  式の演算中は整数型,浮動小数型ともに32ビットの精度で処理が行われます.
  3714.  
  3715.  
  3716.  
  3717.                                 - 54 -
  3718.  
  3719.  
  3720. Quasar Prolog ユーザーズマニュアル                                  算術演算
  3721.  
  3722.  
  3723.  
  3724. 11.8 算術演算を行う上での注意
  3725. ----------------------------------------------------------------------------
  3726.  
  3727. 1)式を記述する文字
  3728.  算術演算式(数値,演算子,関数など)はすべて半角文字で記述してください.全
  3729. 角文字を用いた場合には,意図した演算子や関数として認識されずにエラーになりま
  3730. す.
  3731.  
  3732. 2)算術演算述語と単一化述語
  3733.  算術演算述語と単一化述語‘=’と混同しないように注意してください.
  3734.  算術演算述語では,引数を算術式と見なして計算を行い,その計算結果が算術式の
  3735. 代わりに使用されますが,単一化述語では,単一化述語は引数が算術式として評価さ
  3736. れずに,そのままの項として使用されます.
  3737.  
  3738.     | ?- 10 = 2 * 5.
  3739.     no.
  3740.  
  3741.     | ?- 10 =:= 2 * 5.
  3742.     yes.
  3743.  
  3744.     | ?- X = 100 / 20.
  3745.     X = 100 / 20
  3746.     yes.
  3747.  
  3748.  
  3749. 3)変数の値
  3750.  算術式に含まれている変数は,算術式が評価される前に必ず具体化されていなけれ
  3751. ばなりません.算術演算を行う際に,具体化されていない変数があった場合には,エ
  3752. ラーが生じます.
  3753.  例えば,プログラムの中に,次のような算術演算式がある場合には,この算術演算
  3754. 式が実行される前に,Xの値が定まっていなければなりません.
  3755.     Y := 10.0 * sin(X)
  3756.  
  3757.  
  3758.  
  3759.  
  3760.  
  3761.  
  3762.  
  3763.  
  3764.  
  3765.  
  3766.  
  3767.  
  3768.  
  3769.  
  3770.  
  3771.  
  3772.  
  3773.  
  3774.  
  3775.  
  3776.  
  3777.  
  3778.  
  3779.  
  3780.                                 - 55 -
  3781.  
  3782.  
  3783. Quasar Prolog ユーザーズマニュアル                                  デバッガ
  3784.  
  3785.  
  3786. ----------------------------------------------------------------------------
  3787. 12. デバッガ
  3788. ----------------------------------------------------------------------------
  3789.  
  3790.  
  3791. 12.1 PROLOGにおけるバグ
  3792. ----------------------------------------------------------------------------
  3793.  
  3794. 1)文法エラー
  3795.  プログラムの読み込み中に文法エラーが検出された場合には,その場所と,エラー
  3796. の内容が表示されます.
  3797.  
  3798. 2)綴り間違い
  3799.  綴り間違いが原因として起きるバグを2種類に大別すると,変数名の誤りと述語名
  3800. の誤りに分類できます.変数名に誤りがある場合には,ある変数が単一化によって値
  3801. が具体化されているつもりで処理を記述していても,綴りが間違っているために全く
  3802. 異なる変数として扱われ,値が具体化されていないという状態が多く生じます.また,
  3803. 述語名に誤りがある場合には,常にゴールが失敗するという状態が生じます.
  3804.  変数名の誤りに関しては,節の中で1度しか表れていない変数を表示し,警告する
  3805. 機能が用意されています.また,述語名の誤りに関しては,1つの節も定義されてい
  3806. ない述語が呼び出された場合に,エラーを検出する機能が用意されています.
  3807.  
  3808. 3)引数の個数の不一致
  3809.  PROLOG では,ゴールの引数の個数を間違えているためにプログラムが動かないこと
  3810. もよく起こります.特に,引数の個数が多い述語を利用している場合には,このよう
  3811. なバグが生じやすくなります.PROLOG では,引数の個数(アリティ)が異ると異る述
  3812. 語と見なされるために,一般的にこのようなバグは,ゴールの呼出が単純に失敗する
  3813. ようになります.このために,引数の個数に誤りがあるのか,プログラムに記述され
  3814. ている関係自体に誤りがあるのかがわからないという問題がありました.Quasar Pro
  3815. log には,前の項にも示したように,未定義の述語が呼び出された場合に,エラーを
  3816. 検出する機能が用意されています.
  3817.  
  3818. 4)関係,アルゴリズムの間違い
  3819.  プログラムとして記述されている関係や,アルゴリズムに間違いがある場合には,
  3820. 残念ながら自動的にバグのある場所を検出することはできません.このような場合に
  3821. は,Quasar Prolog のデバッグ機能を利用して,プログラムの実行過程を追跡して誤
  3822. りを修正することができます.
  3823.  
  3824.  
  3825. 12.2 エラーの検出
  3826. ----------------------------------------------------------------------------
  3827.  
  3828. ○ エラーの報告
  3829.  
  3830.  Quasar Prolog は,エラーを検出すると検出されたエラー内容を報告するエラーメ
  3831. ッセージを出力します.また,エラーメッセージに続いて,エラーが検出されたゴー
  3832. ルも表示されます.ただし,read/* による項の読み込み中に文法エラーが検出された
  3833. 場合には,ゴールは表示されずエラーが検出された行と文字の位置が表示されます.
  3834.  
  3835. ○ エラーの付加情報
  3836.  
  3837.  エラーメッセージの付加情報として,検出された誤りの修正に役立つ情報が記録さ
  3838. れている場合には,エラーメッセージに引き続いてその情報が出力されます.エラー
  3839. メッセージとともに出力される付加情報が不必要な場合には,error_guide/1 を使用
  3840. して,その出力を抑制することができます.エラーの付加情報を表示させないように
  3841.  
  3842.  
  3843.                                 - 56 -
  3844.  
  3845.  
  3846. Quasar Prolog ユーザーズマニュアル                                  デバッガ
  3847.  
  3848.  
  3849. する場合には,以下のようなゴールを実行し余す.
  3850.     | ?- error_guide(off).
  3851.  
  3852.  
  3853.  
  3854.  
  3855.  
  3856.  
  3857.  
  3858.  
  3859.  
  3860.  
  3861.  
  3862.  
  3863.  
  3864.  
  3865.  
  3866.  
  3867.  
  3868.  
  3869.  
  3870.  
  3871.  
  3872.  
  3873.  
  3874.  
  3875.  
  3876.  
  3877.  
  3878.  
  3879.  
  3880.  
  3881.  
  3882.  
  3883.  
  3884.  
  3885.  
  3886.  
  3887.  
  3888.  
  3889.  
  3890.  
  3891.  
  3892.  
  3893.  
  3894.  
  3895.  
  3896.  
  3897.  
  3898.  
  3899.  
  3900.  
  3901.  
  3902.  
  3903.  
  3904.  
  3905.  
  3906.                                 - 57 -
  3907.  
  3908.  
  3909. Quasar Prolog ユーザーズマニュアル                                  デバッガ
  3910.  
  3911.  
  3912. 12.3 デバッガの利用
  3913. ----------------------------------------------------------------------------
  3914.  
  3915.  Quasar Prolog は,デバッグを効率よく行うためのデバッガを装備しています.デ
  3916. バッガは PROLOG 処理系において標準的な方式であるボックスモデルに基づいた構成
  3917. になっています.
  3918.  ボックスモデルでは,以下のような処理の流れに着目して述語間の制御の流れを追
  3919. 跡していきます.
  3920. 1)述語の呼出
  3921. 2)述語の成功
  3922. 3)述語の再試行
  3923. 4)述語の失敗
  3924.  
  3925.  デバッガを利用するとプログラムの実行に関する詳細な情報を入手できるという利
  3926. 点が得られますが,一方で,制御スタック領域のメモリ使用量が激増するという問題
  3927. 点があります.このため,デバッガを使用しない場合にはほとんど制御スタックを使
  3928. 用しないプログラムであっても,デバッガを使用する場合には,制御スタック領域が
  3929. 多量に消費されて不足するために実行できないことがあります.
  3930.  
  3931.  
  3932. ○ ボックスモデル
  3933.  Quasar Prolog のデバッガは,ボックスモデルと呼ばれる PROLOG の実行モデルに
  3934. 基づいたデバッグ機能を提供しています.ボックスモデルは,後戻りや再充足といっ
  3935. た,他の言語には見られない PROLOG 特有のプログラムの実行過程を把握するために
  3936. 考えられたモデルです.
  3937.  
  3938.  
  3939. 12.4 デバッグモード
  3940. ----------------------------------------------------------------------------
  3941.  
  3942. 1)デバッグモードへの移行と解除
  3943.  デバッグモードへは debug/0 を使用して移行し,nodebug/0 を使用して終了しま
  3944. す.デバッガを起動すると,質問の入力を促すプロンプト '| ?- ' が出力される直前
  3945. の行に”% デバッグモード”と表示されます.
  3946.  debug/0 や nodebug/0 を実行させた際に,デバッガが指定した状態にすでになって
  3947. いた場合には,その旨表示され,デバッガの状態は変化しません.
  3948.  デバッガの状態を知りたい場合には,debugging/0 を実行することによって,デバ
  3949. ッガの設定状態とスパイポイントの一覧などを表示させることができます.
  3950.  
  3951. 2)デバッガの設定変更
  3952.  
  3953. 3)デバッグモードとトレースモード
  3954.  デバッグモードに入っただけでは,プログラムの実行の履歴を記録するためにメモ
  3955. リが消費されるだけで,デバッグ用の情報は何も表示されません.デバッグ用の情報
  3956. を表示させるためには,トレースモードに入るか,スパイポイントを設定する必要が
  3957. あります.
  3958.  
  3959.  デバッグモードやトレースモードに入っていない通常の状態を基本モードと呼ぶこ
  3960. とにし,モード変更を行うための述語の効果と関係を以下に示します.
  3961.  
  3962.              debug/0            debug/0
  3963.         -------->    <--------
  3964.  
  3965.                         trace/0
  3966.                     -------->
  3967.  
  3968.  
  3969.                                 - 58 -
  3970.  
  3971.  
  3972. Quasar Prolog ユーザーズマニュアル                                  デバッガ
  3973.  
  3974.  
  3975.         -------------------->
  3976.  
  3977.     基本モード        デバッグモード        トレースモード
  3978.  
  3979.                         notrace/0
  3980.             nodebug/0        <--------
  3981.         <--------
  3982.         <--------------------
  3983.  
  3984.  上記の図に示されるように,notrace/0 は,トレースモードを終了するのみで,デ
  3985. バッグモードを終了するものではないので注意してください.
  3986.  
  3987.  
  3988. 12.5 トレース
  3989. ----------------------------------------------------------------------------
  3990.  
  3991.  トレースの出力では,述語が呼び出される順序や,引数の値,成功あるいは失敗と
  3992. いった情報を得ることができます.
  3993.  
  3994.  
  3995. 12.5.1 トレースポートとトレースコマンド
  3996.  
  3997.  トレースモードでは,以下の4つのポートを通過する時にトレース情報が出力され
  3998. ます.
  3999. 1)述語の呼出
  4000. 2)述語の成功
  4001. 3)述語の再試行
  4002. 4)述語の失敗
  4003.  
  4004.  トレースコマンドを受け付けるように指定されているポートでは,トレースコマン
  4005. ドの入力を促すプロンプト ? が表示され,コマンドが入力されるまで実行が停止しま
  4006. す.一方,トレースコマンドを受け付けるように指定されていないポートでは,トレー
  4007. ス情報を表示した後に,すぐに次の処理が開始されます.
  4008.  トレースコマンドを受け付けるポートは,leash/1 を使用して指定します.leash/
  4009. 1 の引数には,トレースコマンドを受け付けるポートのリストを与えます.指定でき
  4010. る4つのポートを以下に示します.
  4011. 1)call    述語の呼出
  4012. 2)exit    述語の成功
  4013. 3)redo    述語の再試行
  4014. 4)fail    述語の失敗
  4015.  例えば,述語の呼出,再試行,失敗の3つのポートでトレースコマンドを受け付け
  4016. るようにしたい場合には,次のようなゴールを実行します.
  4017.     | ?- leash([call, redo, fail]).
  4018. また,全てのポートでトレースコマンドを受け付けないようにしたい場合には,ニル
  4019. を引数とする以下のようなゴールを実行します.
  4020.     | ?- leash([]).
  4021.  
  4022.  leash/1 の引数の簡略記法として,以下に示す5種類を使用することができます.
  4023. 1)full    [call,exit,redo,fail]
  4024. 2)tight    [call,redo,fail]
  4025. 3)half    [call,redo]
  4026. 4)loose    [call]
  4027. 5)off    []
  4028. これらの簡略記法を使用すると,全てのポートでトレースコマンドを受け付けるよう
  4029. にしたい場合には,次のようなゴールを実行します.
  4030.  
  4031.  
  4032.                                 - 59 -
  4033.  
  4034.  
  4035. Quasar Prolog ユーザーズマニュアル                                  デバッガ
  4036.  
  4037.  
  4038.     | ?- leash(full).
  4039.  
  4040.  leash/1 を使用して明示的に指定しなくても,デバッグモードに入ったときにトレー
  4041. スコマンドを受け付けるポートが自動的に既定値に設定されます.この既定値は,Qu
  4042. asar Prolog が起動された時点では half になっていますが,leash_default/1 を使
  4043. 用して変更することができます.
  4044.  
  4045.  Quasar Prolog で使用することができるトレースコマンドを以下に示します.これ
  4046. らのコマンドは,各行の左端の文字(半角)を入力することによって指示することが
  4047. できます.
  4048.  
  4049. c        creep        次のポートに移動する
  4050. <ret>        同上
  4051. s        skip        その述語の次のポートまでトレースを省略する
  4052. l        leap        次のスパイポイントに移動する
  4053. r        retry        ゴールを再実行する
  4054. f        fail        ゴールを失敗させる
  4055. w        write        ゴールを表示する
  4056. g {n}    ancestors n    親ゴールを表示する
  4057. n        nodebug        デバッグモードを終了する
  4058. +        spy        この述語にスパイポイントを設定する
  4059. -        nospy        この述語からスパイポイントを解除する
  4060. a        abort        処理を中断する
  4061. h        help        指示の一覧表示
  4062. ?            同上
  4063.  
  4064.  上記のトレースコマンドのうち,s (skip) は call (呼出),redo (再試行)の
  4065. ポートでのみ使用できますが,他のトレースコマンドは,4つのトレースポートすべ
  4066. てで使用できます.
  4067.  
  4068.  
  4069. 12.5.2 トレースコマンドの使用法
  4070.  
  4071. 1)逐次実行
  4072.  トレースのもっとも基本的な使用法は,creep を用いて,プログラムの実行を1つ
  4073. 1つ追跡していくことです.creep はリターンキーを入力するだけなので,操作も簡
  4074. 単です.creep を指定して,述語が呼ばれる順序や引数,成功した場合の引数などを
  4075. 調べることによって,プログラムの実行を詳細に分析することができます.
  4076.  
  4077. 2)トレースの省略
  4078.  creep を指定したトレースは,詳細な情報が得られるという利点がありますが,逆
  4079. に,多量の情報が出力されるために,その中に重要な情報が埋没してしまったり,ど
  4080. こをトレースしているのかがわからなくなったりするという欠点があります.このよ
  4081. うな問題を解する方法の1つとして,skip の利用が考えられます.
  4082.  述語の呼出や再試行のポートで skip を指示すると,その述語が成功あるいは失敗
  4083. して skip が開始されたところに帰ってくるまでトレースが省略されます.したがっ
  4084. て,実行される述語にバグがないことが明らかになっており,実行結果のみが得られ
  4085. ればよい場合には,skip を指示してトレースを省略することにより,多量のトレース
  4086. 結果に惑わされることがなくなりますし,どこをトレースしているかがわからなくな
  4087. ることも防げます.
  4088.  
  4089. 3)着目している述語への移動
  4090.  skip と同様に,冗長なトレースを回避するためのもう1つの方法として,leap の
  4091. 利用が考えられます.leap は次の節で説明しているスパイポイントと組み合わせて使
  4092. 用します.leap を指示すると,スパイポイントが設定されている述語のポートに遭遇
  4093.  
  4094.  
  4095.                                 - 60 -
  4096.  
  4097.  
  4098. Quasar Prolog ユーザーズマニュアル                                  デバッガ
  4099.  
  4100.  
  4101. するまでのトレースが省略されます.したがって,着目する述語だけにスパイポイン
  4102. トを設定し,leap を指示することによって,着目する述語だけのトレースを行うこと
  4103. ができます.もちろん,途中でより詳細なトレースが必要になった場合には,creep 
  4104. を指示することができます.
  4105.  leap の効果的な利用法の1つは,プログラムの実行を開始してすぐに,トレースを
  4106. 行いたい部分に迅速に移動するために使用することです.デバッグを行う際に,プロ
  4107. グラムのどの辺に問題があのかが明らかになっており,その周辺を集中的にトレース
  4108. しようというときに,その場所に迅速に移動するのに leap が役立ちます.このよう
  4109. な場合には,まず,デバッグするプログラムの中で,問題がありそうな部分の処理が
  4110. 開始される述語にスパイポイントを設定します.次に,プログラムの実行を開始し,
  4111. 最初のトレースポートで leap を指示します.これによって,問題がありそうな部分
  4112. までのトレースが省略され,着目している部分へ迅速に移動することができます.こ
  4113. の後は,必要に応じて,creep, skip, leap などを組み合わせて必要なトレース情報
  4114. を取得します.
  4115.  
  4116. 4)再実行
  4117.  トレースポートで retry を指示することによって,どのポートであっても,その述
  4118. 語が呼び出されたときに戻って再実行させることができます.この指示は,次のよう
  4119. な利用法が考えられます.
  4120.  トレースしているのが副作用のない述語であれば,まず skip してみます.その結
  4121. 果得られた結果が予想したものならば,そのまま処理を継続しますが,予想したもの
  4122. でないならば,retry を指示して述語の呼出を再度行い,今度は creep などで詳細に
  4123. トレースを行って問題点を探ります.このようにすることによって,無暗にトレース
  4124. を行うことを防ぐことができます.
  4125.  また,副作用がある述語では,retry を指示することによって,1度実行した後に
  4126. 再度実行するとどのような結果が得られるかを簡単に確認してみることができます.
  4127.  
  4128. 5)失敗
  4129.  引数の値などによって,失敗することが明らかな述語では,fail を指示することに
  4130. よって,強制的に失敗させることができます.これは,失敗することが明かであるに
  4131. も関わらず,処理時間が短くない処理に対して効果的です.また,本来は成功する述
  4132. 語であっても,失敗した場合に,プログラムがどのような反応を示すかということを
  4133. 調べるためにも使用することができます.
  4134.  
  4135.  
  4136. 12.5.3 トレース対象にならない述語
  4137.  
  4138.  トレースモードであってもトレース対象にならず,実行されたことが表示されない
  4139. 述語を以下に示します。
  4140. 1)!(カット)
  4141. 2)true
  4142. 3);(オア)
  4143. 4)call
  4144.  
  4145.  カットは,選択点を削除する機能を持っており,カットが実行されるまでのシステ
  4146. ムの内部状態を変化させてしまいます.このため,ボックスモデルの概念にはなじま
  4147. ないために対象外にしています.
  4148.  true は単位節が成功する場合に必ず実行されるため,表示されると邪魔になること
  4149. が多いのでトレース表示の対象外にしています.
  4150.  
  4151.  
  4152. 12.6 スパイポイント
  4153. ----------------------------------------------------------------------------
  4154.  
  4155.  トレースモードでは,通過する全てのポートでトレース情報が出力されます.簡単
  4156.  
  4157.  
  4158.                                 - 61 -
  4159.  
  4160.  
  4161. Quasar Prolog ユーザーズマニュアル                                  デバッガ
  4162.  
  4163.  
  4164. なプログラムではそれほど問題ではありませんが,プログラムが少し大きくなってく
  4165. ると,膨大なトレース情報が出力されるために,本来必要な情報がそのほかの雑多な
  4166. 情報の中に埋もれてしまい,デバッグを効率よく行うことができなくなるという問題
  4167. が生じます.このような場合に役立つのがスパイポイントです.
  4168.  スパイポイントは,デバッグ時に着目する述語に設定するもので,スパイポイント
  4169. が設定された述語は,トレースモードに入っていなくても,デバッグモードに入って
  4170. いるだけでトレース情報が表示され,トレースコマンドを使用することができるよう
  4171. になります.したがって,バグの発生箇所がある程度特定できているときには,スパ
  4172. イポイントを設定することによって,局所的で密度の高いデバッグ情報を取得するこ
  4173. とができるようになります.
  4174.  
  4175. 1)スパイポイントの設定と解除
  4176.  スパイポイントは,spy/1 を使用して設定し,nospy/1 を使用して解除します.ま
  4177. た,nospy/0 を使用することによって,現在設定されている全てのスパイポイントを
  4178. 解除することができます.
  4179.  spy/1 および,nospy/1 の引数の与え方は2種類あります.第1は,ファンクタ/
  4180. アリティの形式で引数を与える方法です.ファンクタとアリティはそれぞれ,シンボ
  4181. ル型と整数型で与えます.この方法では,与えられたファンクタとアリティで特定で
  4182. きるただ1つの述語だけが対象になります.第2は,シンボル型の引数を与える方法
  4183. です.この方法では,与えられた引数をファンクタとする述語すべてが対象になりま
  4184. す.
  4185.  nospy/* を使用してスパイポイントを明示的に解除しなければ,デバッグモードを
  4186. 終了してもスパイポイントの設定は残ったままになります.したがって,次にデバッ
  4187. グモードに入ったときには,解除されずに残っていたスパイポイントをそのまま利用
  4188. することができます.なお,基本モードにおいては,スパイポイントの設定は処理系
  4189. の実行速度やメモリ効率などの実行特性に影響を与えません.
  4190.  
  4191.  
  4192. 12.7 ブレーク
  4193. ----------------------------------------------------------------------------
  4194.  
  4195.  まだサポートされていません.
  4196.  
  4197.  
  4198.  
  4199.  
  4200.  
  4201.  
  4202.  
  4203.  
  4204.  
  4205.  
  4206.  
  4207.  
  4208.  
  4209.  
  4210.  
  4211.  
  4212.  
  4213.  
  4214.  
  4215.  
  4216.  
  4217.  
  4218.  
  4219.  
  4220.  
  4221.                                 - 62 -
  4222.