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