Ubuntu 24.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の前提(事実)ファイルを準備する。
% mkdir -p ~/Sandbox/Prolog % cd ~/Sandbox/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:一階述語ホーン節_
2025年度「知識表現」第10回で紹介した論理プログラミングの例を試してみる。
- 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).
実行してみる。今回は検討過程をtrace命令で表示する。
% 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
(検討過程を表示させる)
| ?- trace.
The debugger will first creep -- showing everything (trace)
yes
{trace}
(質問:「ジュンコの友達のうち、ヒロシが好きな人はいるか、そしてそれは誰か?」)
| ?- ?- f(junko, X), love(hiroshi, X).
      1    1  Call: f(junko,_23) ?  (後藤注:Enterキーを押すと次のステップに進む)
      1    1  Exit: f(junko,ichiro) ? (X=ichiroとして検討を進める)
      2    1  Call: love(hiroshi,ichiro) ?
      3    2  Call: tall(ichiro) ?
      4    3  Call: f(junko,ichiro) ?
      4    3  Exit: f(junko,ichiro) ?
      3    2  Exit: tall(ichiro) ?
      5    2  Call: girl(ichiro) ?
      5    2  Fail: girl(ichiro) ? (ichiroが女の子という文はKBにないのでFail)
      3    2  Redo: tall(ichiro) ? (間違った時点へ過程をさかのぼっていく)
      4    3  Redo: f(junko,ichiro) ?
      4    3  Fail: f(junko,ichiro) ?
      3    2  Fail: tall(ichiro) ?
      2    1  Fail: love(hiroshi,ichiro) ?
      1    1  Redo: f(junko,ichiro) ? (X=ichiroとしたのが不適切だったのでここまで戻る)
      1    1  Exit: f(junko,keiko) ? (X=keikoとして検討を進める)
      2    1  Call: love(hiroshi,keiko) ?
      3    2  Call: tall(keiko) ?
      4    3  Call: f(junko,keiko) ?
      4    3  Exit: f(junko,keiko) ?
      3    2  Exit: tall(keiko) ?
      5    2  Call: girl(keiko) ?
      5    2  Exit: girl(keiko) ? (KBにkeikoは女の子であるという文があるので矛盾しない)
      2    1  Exit: love(hiroshi,keiko) ?
X = keiko
(3 ms) yes
{trace}
以上の実行結果より、「ジュンコの友達のうち、ヒロシが好きな人はいる。それはケイコである。」という回答を得た。
終了するときにはCtrl-cを押し、その後eを押す。