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を押す。