入出力
皆さんのPrologプログラムも随分いろいろなことができるようになってきました。でも、いろいろなことができるようになると、もっと複雑なことをしたい、しかも、簡単に実現したい、CではこういうことができるのにPrologではできないの?などなどの疑問・要望が噴出すると思います。そこで、本章と次章ではPrologの組み込み関数について学習します。本章では先ず入出力を中心に学習します。次章ではその他の組み込み関数について学習します。そうして、いよいよPrologの応用プログラムに突入です。乞うご期待。
11.1 ファイルアクセスとread/write
C言語でもファイルアクセスをやりましたね。データが大量になる場合はプログラム中に保持しておくのは大変です。やはり、是非ファイルを活用したい。Prologのファイルアクセスは簡単です。openの代わりに読み込み用にはsee、書き出し用にはtell、closeの代わりにseen、toldを用います。読み込みはread、書き出しはwriteです。read/writeに関しては、特に指示がなければ入力はキーボードから、出力はディスプレイに行われます。従って、画面出力もファイル出力もwriteとなります。
- see(File)
ファイルFileがこの後クローズされるまで、入力はこのファイルから読み込まれます。
- seen
現在オープンしているファイルをクローズして、入力はキーボードから行われるようになります。
- tell(File)
ファイルFileがこの後クローズされるまで、出力はこのファイルに書き出されます。
- told
現在オープンしているファイルをクローズして、出力はディスプレイに行われるようになります。
- read(Data)
データを1つ読み込んでDataとユニファイさせます。ファイルの終わりになったらDataはend_of_fileとユニファイされます。
- write(Data)
Dataを出力します。
次のようにするとresult.plというファイルにaaaという文字が書き込まれます。
?- tell('result.pl').
yes
?- write(aaa).
yes
?- told.
yes
上の操作を参考にファイルにいくつかのデータを書き込んでみましょう。これをエディタで読み込んで確認してください。次に同様にファイルから書き込んだデータを読み出してみましょう。
改行を書き出す場合はnlを使います。
?- A is 2,write(this_A_is_),write(A),nl.
this_A_is_ 2
?-
《演習問題》
- リストの要素を1つずつ改行しながら書き出すプログラムwritelistを作りなさい。writelistは次のように動作します。
?- writelist([a,aa,aaa]).
a
aa
aaa
- 整数のリストを棒グラフにするプログラムgraphを作りなさい。graphは次のように動作します。
?- graph([1,2,3,4]).
*
**
***
****
11.2 プログラムの読み込み
プログラムの読み込みは以下のようにしていますね。例えば、file.plという名称のファイルならば
?- ['file.pl'].
です。実はこれは省略記法で、Prologの処理系によっては使えないことがあります。プログラムの読み込みを行う正規の関数は以下の通りです。
- consult(File)
PrologにファイルFileからプログラムを読み込みます。
- reconsult(File)
consultと同じですが、重複した節を更新します。
閑話休題
コンピュータ・サイエンスのカリキュラムとして最も権威あるものは、恐らくACM(The Association Computing Machinery)でしょう。ACMのコンピュータ・サイエンスのカリキュラムは1968年以来ほぼ10年毎に改訂されてきました。"ACMカリキュラム68"の後に"ACMカリキュラム78"が出て、次の"ACMカリキュラム88"は先ずプロトタイプとして発表され、後に本格的なカリキュラムとして"ACMカリキュラム91"が発表されました。UCB(University of Calfornia at Berkeley)、MIT(Massachusetts Institute of Technology)、Stanford大学、CMU(Carnegie Mellon University)などの先端的大学は勿論、アメリカの多くの大学はACMカリキュラムを基に、大学独自の哲学・政策・目標に基づく科目群を加えて編成してきました。
このACMカリキュラムの中で人工知能に関してはどのように規定されているのでしょう。ACMカリキュラムには"人工知能のモデル"と題したモジュールがあります。このモジュールの中心的課題は「人間の知能のある面をシミュレートするようにマシンと抽象モデルを設計するにはどうしたらよいか?」です。この問題に答えるために記号処理言語(Lisp,Scheme,Prolog)を導入しています。規則の評価による知識表現の原理について論じ、人工知能の重要な一部の分野(例えばエキスパート・システム、自然言語処理、定理証明、ゲームプレイ)の応用を示しています。そのようなシステムに通常付随する計算量と制約の問題についても触れています。
講義の題材
- 人工知能の目標、限界と予測、記号処理システムと知識表現、記号処理言語(Lisp,Scheme,Prolog)の紹介
- エキスパート・システム、規則に基づいた推論、論理、演繹、シンプルな例についての説明
- 自然言語理解、音声と視覚システム、問題と結果のサーベイ
- 人工知能システムの計算量の管理、検索、知識成長、サブワールド、知識獲得のためのハードウェアとソフトウェア
実習
- 記号処理のための単純なLispプログラム(例:自然言語の構文解析)を開発する。
- 知識表現と質疑応答のための単純な規則に基づいたシステム(例:家族木、疾病・症候分類ネットワーク)を作り、実行する。
- もっと複雑な既に完成したシステム(例:MYCIN、SHRDLU、チェスプレイのプログラム)を実行し、計算量の問題を調査する
目次に戻る