Ubuntu 20.04 LTSへのgprologのインストールメモ

はじめに_

論理型プログラミング言語prologのインタプリターGNU prolog (gprolog)のインストールメモ

リンク_

インストール_

% sudo apt install -y gprolog

動作確認1:命題ホーン節_

% prolog --help
Usage: gprolog [OPTION]... 

  --consult-file FILE         consult FILE inside the the top-level
  --init-goal    GOAL         execute GOAL before entering the top-level
  --entry-goal   GOAL         execute GOAL inside the top-level
  --query-goal   GOAL         execute GOAL as a query for the top-level
  -h, --help                  print this help and exit
  --version                   print version number and exit
  --                          do not parse the rest of the command-line

Report bugs to bug-prolog@gnu.org.

Prologプログラミング (PDF)に従い、動かしてみる。

まず、Prologの前提(事実)ファイルを準備する。

% touch h2co3.gpl

適当なエディタでh2co3.gplの中身を以下のようにする。

mg :- mgo,h2. 
h2o :- mgo, h2. 
co2 :- c, o2. 
h2co3 :- co2, h2o.
mgo.
h2.
o2.
c.

上の「mg :- mgo,h2. 」の意味は、「mgoとh2が成り立つならばmgが成り立つ」という意味になる(論旨式の mgo & h2 => mg)の意味。その他、h2o, co2, h2co3が成り立つ条件が記載され、mgo, h2, o2, cが成り立っていることを示している。

作成したプログラムを読み込む。

% prolog
GNU Prolog 1.4.5 (64 bits)
Compiled Feb 23 2020, 20:14:50 with gcc
By Daniel Diaz
Copyright (C) 1999-2020 Daniel Diaz
| ?- consult('h2co3.gpl').
compiling /home/gotoh/Sandbox/Prolog/h2co3.pl for byte code...
/home/gotoh/Sandbox/Prolog/h2co3.pl compiled, 8 lines read - 1105 bytes written, 12 ms

yes
| ?- listing. (注:読み込んだプログラムの表示)

% file: /home/gotoh/Sandbox/Prolog/h2co3.pl

mg :-
	mgo,
	h2.

h2o :-
	mgo,
	h2.

co2 :-
	c,
	o2.

h2co3 :-
	co2,
	h2o.

mgo.

h2.

o2.

c.

yes

引き続き、前提の下で質問が成り立つかを試す。

| ?- mg. (前提の下でmgはなりたつか?)

yes
| ?- mgo. (前提の下でmgoはなりたつか?)

yes
| ?- h2o. (前提の下でh2oはなりたつか?)

yes
| ?- h2co3. (前提の下でh2co3はなりたつか?)

yes
| ?- au. (前提の下でauはなりたつか?auという前提はないのでエラーでる。)
uncaught exception: error(existence_error(procedure,au/0),top_level/0)

| ?- o2. (前提の下でo2はなりたつか?)

yes

終了するときにはCtrl-cを押し、その後eを押す。

動作確認2:一階述語ホーン節_

2022年度「知識表現」第8回で紹介した論理プログラミングの例を試してみる。

  • hiroshi, ichiro, junko, keiko はそれぞれヒロシ、イチロウ、ジュンコ、ケイコを表

す。

  • 述語は以下の通り
    • boy(X):「Xは男子である」
    • girl(X): 「Xは女子である」
    • tall(X): 「Xは背が高い」
    • f(X, Y): 「XとYは友達である」
    • love(X, Y): 「XはYが好き」
  • KBは以下のとおり
    • イチロウは男子である。ケイコは女子である
    • ジュンコの友達はみんな背が⾼い
    • ヒロシは背の⾼い女子なら誰でも好きだ
    • イチロウとケイコはジュンコの友達である
  • 質問は次のとおり「ジュンコの友達のうち、ヒロシが好きな人はいるか、そしてそれは誰か?」

以上のKBをPrologプログラムで記述する。

% touch lp_sample.gpl

エディタでlp_sample.gplを開き、KBを以下のように記述する。なお、同じ述語の記述は連続して記述しないと「warning: discontiguous predicate ***」というエラーがでて読み込まれない(以下の例だとf(junko, keiko).の記述をboy(ichiro).の下に移動させるとエラーが出る)。

コメント行を記述するときには冒頭に%を置く。

tall(X) :- f(junko,  X).
love(hiroshi,  X) :- tall(X), girl(X).
f(junko,  ichiro).
f(junko,  keiko).
boy(ichiro) .
girl(keiko).

実行してみる。

% prolog
GNU Prolog 1.4.5 (64 bits)
Compiled Feb 23 2020, 20:14:50 with gcc
By Daniel Diaz
Copyright (C) 1999-2020 Daniel Diaz

(プログラムの読み込み)
| ?- consult('lp_sample.gpl').
compiling /home/gotoh/Sandbox/Prolog/lp_sample.gpl for byte code...
/home/gotoh/Sandbox/Prolog/lp_sample.gpl compiled, 6 lines read - 1043 bytes written, 4 ms

yes

(読み込んだプログラムの中身表示)
| ?- listing.

% file: /home/gotoh/Sandbox/Prolog/lp_sample.gpl

tall(A) :-
	f(junko, A).

love(hiroshi, A) :-
	tall(A),
	girl(A).

f(junko, ichiro).
f(junko, keiko).

boy(ichiro).

girl(keiko).

yes

(質問:「ジュンコの友達のうち、ヒロシが好きな人はいるか、そしてそれは誰か?」)
| ?- f(junko, X), love(hiroshi, X).

X = keiko

yes

以上の実行結果より、「ジュンコの友達のうち、ヒロシが好きな人はいる。それはケイコである。」という回答を得た。

戻る_