スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Windows XPにおけるGNU Prologのセットアップのメモ

Windows XPにおけるGNU Prologのセットアップ作業の手順を自分のためにメモ。Prologは「プロログ」と読みます。

GNU Prologのインストール

MinGWの入手とインストール

GNU Prologをインストールする前に、MinGWをインストールする必要があります。

MinGWの入手、インストール、アンインストールの手順については、以下の記事をお読みください。

Windowsで使えるフリーのC/C++コンパイラ MinGW

GNU Prologの入手とインストール

GNU Prologは、以下のページからダウンロードできます:

The GNU Prolog web site

Table of contentsのDownloadをクリックしてリンク先へ飛びます。Windows用のバイナリが二種類ありますが、setup-gprolog-1.3.1-mingw.exe (compiled under ix86 / Windows XP + MSys with MinGW gcc) のほうをダウンロードします。

ダウンロードしたexeファイルをダブルクリックして実行し、ウィザードにしたがってインストールを行います。

コンソールから実行

[スタート]→[すべてのプログラム]→[GNU Prolog]→[GNU Prolog] で、GNU Prolog consoleが起動できます。

consultコマンドを使えば、関係を定義したファイルを読み込むことができます。以下、その例を示します。

以下のプログラムを、sazae_family.plという名前で保存します(Prologの拡張子は通常「pl」か「pro」です)。ここでは、c:\srcフォルダの下に保存するものとします:

% child(X, Y):X は Y の子供である
child(sazae, namihei).
child(sazae, fune).
child(katsuo, namihei).
child(katsuo, fune).
child(wakame, namihei).
child(wakame, fune).
child(tarao, sazae).
child(tarao, masuo).

コンソールを起動して、以下のようにファイルのパスを引数にしてconsultコマンドを実行します:

| ?- consult('c:\\src\\sazae_family.pl').
compiling c:/src/@prolog/sazae_family-org.pl for byte code...
c:/src/@prolog/sazae_family-org.pl compiled, 9 lines read - 971 bytes written, 31 ms

yes
| ?-

関係を定義したファイルを読み込んだら、「?-」のあとに質問を入力していきます。

sazaeはfuneの子供か?:

| ?- child(sazae, fune).

yes

masuoはnamiheiの子供か?:

| ?- child(masuo, namihei).

no

namiheiの子供は誰か?:

| ?- child(X, namihei).

X = sazae ? ;

X = katsuo ? ;

X = wakame ? ;

no

答えは一つずつ表示されます。セミコロン(;)を入力すると次の答えを探しに行き、Enterキーを押すと中断します。全て探し終わると「no」が返ります。

wakameを子供とする者(つまり、wakameの親)は誰か?:

| ?- child(wakame, Y).

Y = namihei ? ;

Y = fune

yes

最後の答えで「yes」が返ります。実を言うと、なぜさっきが「no」で今度が「yes」なのか、その違いの理由が私にはわかりません。SWI-Prologでも似たような挙動になります。

taraoを孫とする者(つまり、taraoの祖父母)は誰か?:

| ?- child(tarao, X), child(X, Y).


X = sazae
Y = namihei ? ;

X = sazae
Y = fune ? ;

no

taraoかkatsuoのどちらか一方を子供にもつ者は誰か?:

| ?- child(katsuo, X); child(tarao, X).

X = namihei ? ;

X = fune ? ;

X = sazae ? ;

X = masuo

yes

終了するときは、「halt.」を入力します:

| ?- halt.

コンパイルしてから実行

まず、環境変数「PATH」の値に「C:\GNU-Prolog\bin」を追加します。

Windowsのコマンドプロンプトを起動し、「gplc --version」でバージョン情報を表示して、パスが通っていることを確認します。

>gplc --version
Prolog compiler (GNU Prolog) 1.3.1
By Daniel Diaz
Copyright (C) 1999-2009 Daniel Diaz
GNU Prolog comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Prolog
under the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING.

以下のプログラムを、sazae_family.plという名前で保存します:

% child(X, Y):X は Y の子供である
child(sazae, namihei).
child(sazae, fune).
child(katsuo, namihei).
child(katsuo, fune).
child(wakame, namihei).
child(wakame, fune).
child(tarao, sazae).
child(tarao, masuo).

gplcコマンドでコンパイルします:

>gplc sazae_family.pl -o sazae_family

すると、sazae_family.exeが作られます(-oはコンパイラが生成する実行形式ファイルの名前を指定するオプションです。-oオプションを省略すると、そのファイルの名前がfoo.plに対してfoo.exeになります)。これを実行すると、以下のようになります:

>sazae_family
GNU Prolog 1.3.1
By Daniel Diaz
Copyright (C) 1999-2009 Daniel Diaz
| ?- 

あとは、上の「コンソールから実行」で述べたようにして、「?-」のあとに質問を入力していきます。

対話しないで実行する方法

以下のプログラムを、hello.plという名前で保存します:

:-initialization(hello).
hello :- write('Hello!'), nl.

gplcコマンドに「--no-top-level」を付加してコンパイルします:

>gplc hello.pl -o hello --no-top-level

すると、hello.exeができます。これを実行すると、以下のようになります:

>hello
Hello!

>

つまり、コンパイル時に「--no-top-level」を付加すると、実行時に対話モードになりません。

もう一つ例を挙げます。以下のプログラムを、sazae_family2.plという名前で保存します:

% child(X, Y):X は Y の子供である
child(sazae, namihei).
child(sazae, fune).
child(katsuo, namihei).
child(katsuo, fune).
child(wakame, namihei).
child(wakame, fune).
child(tarao, sazae).
child(tarao, masuo).

% ======================================

% P が成り立てば true を、成り立たなければ fail を X に代入
istrue(P, X) :- P, !, X = true; X = fail. 

% ======================================

:- initialization(sazae_family).
sazae_family :- 

% masuo は namihei の子供か?
istrue(child(masuo, namihei), X0), write(X0), nl,

% fune の子供を列挙する
findall(X1, child(X1, fune), List1), write(List1), nl,

% tarao を子供にもつ者(つまり、taraoの親)を列挙する
findall(X2, child(tarao, X2), List2), write(List2), nl,

% child(X, Y) が成り立つすべての組 (X, Y) を列挙する
findall([X3, Y3], child(X3, Y3), List3), write(List3), nl.

gplcコマンドに「--no-top-level」を付加してコンパイルします:

>gplc sazae_family2.pl -o sazae_family2 --no-top-level

すると、sazae_family2.exeが作られます。これを実行すると、以下のようになります:

>sazae_family2
fail
[sazae,katsuo,wakame]
[sazae,masuo]
[[sazae,namihei],[sazae,fune],[katsuo,namihei],[katsuo,fune],[wakame,namihei],[w
akame,fune],[tarao,sazae],[tarao,masuo]]

【theme : プログラミング
【genre : コンピュータ

プロフィール

よしいず

Author:よしいず
MATHEMATICS.PDFというウェブサイトを運営しています。

管理の都合上、トラックバックとコメントはオフにしてあります。ブログ経験者なら分かっていただけると思いますが、スパム(アダルトやその他の宣伝)ばかりなのが現実です。

リンクは自由です。当サイトの記事に対する間違いの指摘・意見・感想などを述べた記事からのリンクは歓迎です。ただし、ブログ記事アップ直後はミスが多く、頻繁に修正します。場合によっては削除する可能性もあります。その際、何も断りもなく修正・削除しますがご了承ください。内容を参考にする場合には投稿後一週間ほど様子を見てからにしてください(笑)。

記事の間違いを指摘するときは、その具体的箇所、理由(仕様に反するなど)・根拠(参考にした文献など)、代替案(同じ結果を得るための正しいやり方)も教えてください。そうしないと、(指摘される側および第三者はその時点では無知の状態なので、)どこが間違いなのか分かりませんし、本当に間違っているのかどうかが判断・検証できません。実際、間違いだと指摘されたことが結局は正しかったというケースもありますので。

このブログのタイトル一覧

リンク
月別アーカイブ
カテゴリ
最新記事
検索フォーム
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。