AZ-Prolog ユーザーズマニュアル

## 1.はじめに

### 1-1. AZ-Prolog概要

AZ-Prologは、「ISO/DEC-10 Prolog」に準拠した、世界最速級の処理性能を誇る論理型言語Prolog処理系です。
Prologによる手軽なプログラム開発やデバッグの環境を提供する「インタプリタ」、インタプリタ上での実行を高速化する「バイトコード・コンパイラ」、さらに高速な単独実行プログラムの作成を実現する「C言語ソースコード・コンパイラ」、プログラムをWEBサイトとして公開可能にする「CGIインタプリタ」などを備えています。

豊富に提供される拡張機能（9章を参照)により、開発できるアプリケーションの幅や可能性はさらに広がりました。

また、64ビットOS対応により、OSの提供する広大なメモリ空間を利用することができるようになり、従来は解が求まらなかった巨大なプログラムも走らせることが可能となりました。
さらに、CPUのマルチコア化に伴い、その性能をフルに活用するため、プログラムを複数のプロセスに分散して並列で駆動するMPI(Message Passing Interface)ライクな仕組みを取り入れました。これにより、Prologプログラムをより高速に実行することが可能となっています。
Version8以降においては、AZ-Prolog用Eclipseプラグインを利用することにより、Prologプログラムの開発（ソース作成、ソース管理、デバッグなど）を効率よく、ビジュアルに行うことができます。
また、デバッグ機能をPrologの学習に援用すれば、Prologプログラミングの特徴である、再帰・ユニフィケーション・バックトラックなどの振る舞いを容易に理解、習得することができます。
AZ-Prolog用Eclipseプラグインはこちらです。
http://eclipse.az-prolog.com/index.html

### 動作環境

OS | Win32/64(Windows Vista,7,8)、Linux 32/64 (Ubuntu12.04,14.04,15.04)、Mac OS X(v10.9以上)
対応Cコンパイラ | Microsoft Visual C++ 2010 Express Edition以上、GCC
ハードウェア | 上記OSが動作する環境。64ビット版では6Gバイト以上のメモリを推奨
ディスク容量 | 60MB以上

※Win32版は64ビットOS上でも動作しますが、Win64版は32ビットOSでは動作しません。 一部の拡張機能については外部ライブラリを利用している関係から、2015年現在、32ビット版のみ対応のものがあります（現状はCaboChaのみ)。
Mac版は、v10.9以上でないと動作保障の対象外となります。
32ビット版と64ビット版の主な相違点

| 32ビット版 | 64ビット版
セルサイズ | 8byte | 16byte
整数の範囲 | -2147483648～2147483647 e_register/3,repeat/1のとる値も同じ | -9223372036854775808～9223372036854775807 e_register/3, repeat/1のとる値も同じ
数値演算 | - | 整数と浮動小数点数（倍精度)の混在する計算結果は浮動小数点数になりますが、浮動小数点数の仮数部（52ビット)よりも整数の範囲が大きいため、大きな整数の演算では、計算結果が情報落ちすることがあります。
数値アレイ | 1,2,4byte | 1,2,4,8byte
ヒープ・スタックサイズ | 合計最大2Gバイト | OSと実メモリの提供範囲

### AZ-Prolog Version 8 の主な特徴

- 世界最速級の処理性能
  「10-1.ベンチマークプログラム」に「他社製Prolog処理系との比較」を載せていますので、ご覧ください。
- 制約論理プログラミングが可能
  freeze/2、frozen/2、in /xfx、notin /xfx などの基本的な組込述語とProlog記述された制約論理パッケージが付属しており、複雑高度なプログラムが効率よく処理できます。
- ソケットプログラミングに対応
  ソケット系の拡張組込述語を利用して、ネットワーク対応のプログラミングが可能です。
- MPIライクなマルチプロセス並列処理機能のサポート
  並列化可能なモジュールをプロセスに分散し、CPUのコア数に比例した高速化が図れます。
- Microsoft Win32/64 API、OLEに対応（Windows版のみ)
  Windows APIを利用するための組込述語群が提供されています。また、OLEオートメーション（クライアント及びコントローラ)機能をサポートしています。
- 多様な外部ライブラリとの接続インターフェースの提供
  鬼車、MeCab、CaboCha、ODBC、Redisのインターフェースを備えています。
  ※OS、32/64bit別のサポート詳細は、9章の拡張機能パッケージをご覧ください。
- 広範囲の動作環境に対応
  Windows、Linux、UNIX、Macなどをはじめとする複数のOSに対応し、パーソナルコンピュータからエンジニアリングワークステーションに致るまで、広範囲に対応します。Prologソースは、各システムでほぼそのまま共通に利用できます。
- ISO準拠
  言語仕様は事実上のProlog標準仕様である「ISO/DEC-10 Prolog」に準拠しています。
- 各スタック領域などのワークエリアの大きさを自由に設定可能
  プログラムエリアなどのメモリ容量の制限を取払い、特に64ビット版では、ほぼ無限に等しい（上限はOSやハード構成に依存します)プログラムエリアを確保出来ます。 しかも、各ワークエリア毎の最大使用量を認識し、各ワークエリアを必要最小限に設定する事もできます。
- 様々な開発用・実行用環境を提供
  ・プログラム開発・デバッグ時に使用するインタプリタ
  ・実行／デリバリ時に威力を発揮するコンパイラ
  ・Webアプリケーションとして公開できるCGIインタプリタ
  これらを駆使することにより効率的なプログラム開発・実行とWebでの公開が可能です。
- C言語ソースを生成し、単独実行可能プログラムを生成可能
  AZ-Prologコンパイラはその出力としてC言語のソースコードを生成します。 通常は生成されたCソースを各OSの標準Cコンパイラでコンパイルし、リンカでAZ-Prologの組込述語ライブラリ・Cコンパイラ標準関数ライブラリなどとリンクすることにより「単独実行可能プログラム」を生成します。ユーザが作成した別のCプログラムと、ソースまたはオブジェクトレベルでのリンクも可能です。
- ユーザが作成した述語を組込述語として定義可能
  PrologやC言語で記述された述語をコンパイルして、インタプリタの組込述語として追加登録できます。それにより、さらにプログラム開発の効率が向上します。
- EmacsライクなマルチバッファのProlog用エディタ(AzEdit)を内蔵
  EmacsライクなPrologプログラム用のフルスクリーンエディタ(AzEdit)が標準のインタプリタに組込述語として内蔵され、同時に8個までのテキストファイルを編集する事が出来るマルチバッファ機能を備えています。また、エディタ白身がPrologで記述されており、そのソースコードも付属していますので、機能の追加・変更やキー割当て等のカスタマイズも自由に出来ます。
- 強力なソースレベルデバッガ
  トレース・スパイ・ブレーク機能を内蔵したソースレベルデバッガを備えています。またソースレベルデバッガでトレースする事でPrologの動作を把握できるため、Prolog言語を理解する上でも大きな助けとなります。
- 入力履歴のテンプレート機能
  トップレベル（コンソール画面上)で、過去に入力した文字列を10行前まで記憶し、そのままかまたは編集して再入力できるテンプレート機能があります。
- 豊富な組込述語(400以上)
- 算術演算
  AZ-Prologは浮動小数点演算をサポートしています。
  加えて、三角関数・対数・指数関数などの算術関数も利用できます。
- アレイ(配列)型
  データ型としてアレイを導入しました。データの高速な書換え・検索が可能です。
- 完全日本語対応
  AZ-Prologでは、コメント文だけでなく、アトム・述語名・変数名・その他どの部分にも漢字が使えます。 勿論、内蔵エディタ(AzEdit)も漢字に対応しています。
- グローバルレジスタ採用
  整数/実数/アトム/arrayのそれぞれに専用のレジスタが32個ずつ用意されています。
  assert述語による節の挿入やファイルの操作なしにグローバルなデータを保存（保持)できますから、さらに高速に実行できます。
- 任意の階層からより浅い階層に一気に実行制御を戻す大域脱出機能
  Prologの階層構造プログラムにおいて実行時にthrow述語のある階層から、Catch述語のあるより浅い階層に一気に実行制御を戻す（ジャンプする)事が可能です。
- プログラム開発をより容易にする豊富なサンプルプログラム集の付属
  より良い開発環境を提供するシステムユーティリティプログラム、プログラム作成のヒントとなる実用例のサンプルプログラム、プログラムの一部としてそのまま使えるユーティリティプログラムなどが付属しています。
  なお、拡張機能の一部機能では、Windows版またはLinux版・Mac版のみで対応しているものがあります。
  詳しくは、「9.拡張機能パッケージの概要　3.拡張機能のOS別実装一覧表」をご覧ください。
  また、改良のため予告なしに仕様変更・バージョンアップを行なう事が有りますのでご了承ください。
  バージョンアップ情報などは登録ユーザの皆様にはお知らせ致します。

### 1-2. このマニュアルについて

##### 1-2-1.マニュアルを読むために必要な知識

・Prolog言語の知識
AZ-Prologのシンタックスは「ISO/DEC-10 Prolog」に準拠していますので、その知識を前提とします。

このマニュアルの「4.Prolog言語」でもProlog言語について解説をしていますが、Prolog言語を全くご存じ無い方には少々説明が不足かも知れません。そこで、Prolog言語についての入門書を読みながらこのインタプリタを使っていかれることをお奨めします。
Prolog言語の入門書・解説書については次項の「1-2-2.Prolog言語に関する参考文献」で紹介します。

・OSの知識
各OSの基本的な使い方を始め、エディタの概念などは最低限知っている必要があります。また、AZ-Prologには、コマンドライン・ユーティリティーを実行出来る「system」述語と、一時的にOSのコマンド・プロンプトレベルに抜けられる「sh」述語などがあります。これらを使用する場合は、用途に応じた知識が必要です。

・Webサーバー、CGIの知識
AZ-PrologではPrologアプリケーションをCGIとしてWeb公開できる機能が実装されています。これらを利用するためには、Webサーバーの設定、CGIの知識が必要です。

##### 1-2-2.Prolog言語に関する参考文献

- （1)Prolog-KABA入門 柴山悦也･桜川貴司･荻野達也 著 岩波書店
- （2)Prolog入門 古川康一 著 オーム社
- （3)Prolog 中島秀之 著 産業国書
- （4)Prolog入門 後藤滋樹 著 サイエンス杜
- （5)知識指向言語Prolog 小谷善行 著 技術評論社
- （6)Prologプログラミング入門 安部意広 著 共立出版
- （7)Prologとその応用 溝口文雄　 監修 総研出版
- （8)はじめてのProlog 舟本奨 著 ナツメ社
- （9)Prologの技芸 Leon Sterling、Ehud Shapiro 著 共立出版
- （10)Prologで学ぶAI手法―推論システムと自然言語処理 高野真 著 啓学出版
- （11)Prologで学ぶAIプログラミング 赤間　世紀 著 工学社

##### 1-2-3.どの部分から読み始めるか

AZ-Prologを購入またはダウンロードされて、最初にサンプルプログラムを動かされると思います。

そのためにはまず「2.インストールと環境設定」に記述されているインストール方法の指示に従って、AZ-Prologの動作可能な環境を作ります。
インストールが終了し「3-2.やってみましょう」を参照されれば、サンプルプログラムを動かすことが出来ます。
その次にはご自分で簡単なプログラムを打ち込んで実行してみることでしょう。
プログラムを入力するには次の方法があります。

[1]外部のエディタを使って作成したプログラムをPrologに読み込む。

[2]コンソールから直接プログラムを入力する。

[3]標準のインタプリタに組込述語として内蔵されている、Prologプログラム向けのスクリーンエディタAzEditを使ってプログラムを入力し、そのエディタ・バッファの内容をインタプリタにプログラムとして直接転送する。

方法[1]と方法[2]は、「5-3.プログラムの入カ方法」で、方法[3]は「9-10.AzEditの使い方」でそれぞれ説明しています。

AZ-Prologの初版を開発した当時と比べ、現在では高機能なエディタが多くあります。 AzEditより使い慣れたエディタがあれば、そちらを使ってプログラムを入力する方が効率が上がると思われます。 従来からご使用頂いているユーザ様及びプログラムの互換性を考慮し、AzEditを付属しております。 用途に応じて、外部のエディタとAzEditを使い分けるとよりプログラムの開発効率が上がるようになります。
AZ-Prologに慣れてきたところで、デバッガを使ったり、組込述語の機能を調べ始めてください。 Prolog言語についてある程度知っておられる方や「Prolog」を使った経験がある方は、本システム独自の機能について必要に応じて参照してください。

### 1-3. 表記規則

##### 1-3-1.ユーザが入力する部分

以下の例では、ユーザが入力する部分を表しています。
また、「↓」はCR（キャリッジリターン／Enter)キーを押すことを表します。
＜例＞

    C:¥>Prolog↓

ここで「C:¥>」は、OSの対話型シェル（CMD.EXE等)レベルでコンソール（画面)に出力されるプロンプトであり、「Prolog↓」がユーザによって入力された（されるべき)文字列です。
また、ユーザが入力する部分に下線「_」が含まれる場合がありますので見落とさぬ様にご注意ください。

##### 1-3-2.述語の表記

Prologでは述語名とアリティ（引数の個数)で特定の述語が決まります（述語名が同じでもアリティが異なれば違う述語として扱われます)。
そこで、特定の述語を表すのに［述語名／アリティ］という記法を用いています。
＜例＞

true/0 | ・・・ | 名前が「true」で引数が無い述語
リカイスル/2 | ・・・ | 名前が「リカイスル」で引数が2個の述語

また、演算子及び算術関数は、上記の様に引数とともに表記する場合と、以下の例のように[演算子または算術関数名／オペレータの型]という記法で表記する場合があります。

＜例＞

+ /yfx | ・・・ | 引数が２個の中置演算子（X+Yのように用いる)
- /fy | ・・・ | 引数が１個の前置演算子（-Yのように用いる)

##### 1-3-3.コントロール・キャラクターと機能キー

例えば、キャラクター・コード（ASCIIコード)１のキャラクタを、「CTRL-A」のように表します。
また、コントロールキャラクタをキーボードから入力する場合は、「^」　を付けて表します。例えば、「CTRL-Ｘ」をキーボードから入力する場合は 「^X」と表します。
ただし
① 入力行を終了させるキー（キャリッジリターン)
② 入力を終了させるキー
③ 中断キー
以上の3つの機能キーはオペレーティング・システムによって異ったり、オペレーティング・システムの中には個人の好みにより、端末毎にキー割当てが変更できるものもあります。
従って本書では混乱を避ける為、それぞれ以下の様に表記しています。
① 入力行を終了させるキー・・・END_OF_LINEキー
② 人力を終了させるキー・・・・END_OF_INPUTキー
③ 中断キー・・・・・・・・・・INTERRUPTキー

##### 1-3-4.コメント

本文のプログラム中の「/* ・・・・ */」という文字列、またはある行の「%」以下はコメント文を表しています。
またコメント文ではありませんが、本マニュアルの中で説明文をプログラム中の「←」以下に書いてある所もあります。
注)実際のソースプログラムに「←」を書く事は文法上許されていません。

##### 1-3-5.「¥」と「＼」

JISキーボード以外のキーボードを採用している機種では、キャラクタコード［92］の「¥」はキートップ及び画面表示が「＼」となります。
本マニュアルでは国内のパソコン及びワークステーションの多くがJISキーボードを採用していることから「￥」で統一するものとします。

▲