「7つの言語 7つの世界」第4章の学習のために、GNU Prolog(プロログ)言語をインストールします。
プロローグと読んでいたけど、プロログなんだね。
7つの言語 7つの世界
- Ruby
- Io
- Prolog
- Scala
- Erlang
- Cloijure
- Haskell
GNU Prolog
Git repository (Source Forge)
https://sourceforge.net/p/gprolog/code/ci/457f7b447c2b9e90a09956ff15fd277d269b1d98/tree/
最新バージョンは 1.4.5、2018-10-23更新。
SWI Prolog
Git repository (GitHub)
https://github.com/SWI-Prolog/swipl
最新バージョンは、8.2.0、2020-05-27 リリース。
prolog installで検索したら、SWI-Prologがヒットしたよ
書籍では、GNU Prolog 1.3.1 を使っているそうよ。
拡張子は .pl。VS CodeではPerlのラクダアイコンが表示されてしまったよ。
行末のドット(.)を忘れないでね
Windows 10
GNU Prolog
http://www.gprolog.org/#download のページから、Windows intel 64 bits auto-install setup (compiled under x86_64 / Windows 7 with MSVC++). をダウンロードしてください。
ダウンロードしたインストーラを起動してください。
インストール先はこのままです。
メニューもこのままです。
拡張子の関連付けです。好みでチェックをはずしてください。筆者は、.pl のチェックをはずしました。
Installボタンをクリックします。
すぐにインストールは完了しました。
デスクトップのGNU Prologアイコンをダブルクリックすると、GNU Prolog consoleウィンドウが表示されました。バージョンは、1.4.5です。
File>Change Dir... で、GNU Prolog consoleウィンドウのカレントディレクトリを選択します。
筆者は、friends.pl を C:\Users\aoki.makoto\projects\personals\study_7lang\prolog\friends.pl に作成したので、C:\aoki.makoto\taro\projects\personals\study_7lang\prolog を選択しました。
macOS(Mac OS X) 10.15.4
GNU Prolog
homebrewでインストールします。
$ brew install gnu-prolog
バージョンは、GNU Prolog 1.4.5 でした。
$ gprolog --version
Prolog top-Level (GNU Prolog) 1.4.5
By Daniel Diaz
Copyright (C) 1999-2018 Daniel Diaz
GNU Prolog comes with ABSOLUTELY NO WARRANTY.
This is free software; see the source or the file
named COPYING for copying conditions.
$ which gprolog
/usr/local/bin/gprolog
Code language: Bash (bash)
コマンドラインのヘルプ
$ gprolog --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.
Code language: Bash (bash)
インタープリタを起動します。
$ gprolog
GNU Prolog 1.4.5 (64 bits)
Compiled Aug 20 2018, 15:27:00 with clang
By Daniel Diaz
Copyright (C) 1999-2018 Daniel Diaz
| ?-
Code language: Bash (bash)
インタープリタのヘルプは、Ctrl + C を押してから、"e"を押します。
$ gprolog
GNU Prolog 1.4.5 (64 bits)
Compiled Aug 20 2018, 15:27:00 with clang
By Daniel Diaz
Copyright (C) 1999-2018 Daniel Diaz
| ?-
Prolog interruption (h for help) ? e
$
Code language: Bash (bash)
Ubuntu 18.04
GNU Prolog
aptでインストールします。
$ sudo apt install gprolog
Code language: Bash (bash)
バージョンは、GNU Prolog 1.4.5 でした。
$ gprolog --version
Prolog top-Level (GNU Prolog) 1.4.5
By Daniel Diaz
Copyright (C) 1999-2016 Daniel Diaz
GNU Prolog comes with ABSOLUTELY NO WARRANTY.
This is free software; see the source or the file
named COPYING for copying conditions.
$ which gprolog
/usr/bin/gprolog
Code language: Bash (bash)
コマンドラインのヘルプ
$ gprolog --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.
Code language: Bash (bash)
インタープリタを起動します。
$ gprolog
GNU Prolog 1.4.5 (64 bits)
Compiled Feb 5 2017, 10:30:08 with gcc
By Daniel Diaz
Copyright (C) 1999-2016 Daniel Diaz
| ?-
Code language: Bash (bash)
インタープリタを終了するには、Ctrl + C を押してから、"e"を押します。
$ gprolog
GNU Prolog 1.4.5 (64 bits)
Compiled Feb 5 2017, 10:30:08 with gcc
By Daniel Diaz
Copyright (C) 1999-2016 Daniel Diaz
| ?-
Prolog interruption (h for help) ? e
$
Code language: Bash (bash)
何がいけないのか、p76 の friendでエラーが...
| ?- friend(wallace, wallace).
no
| ?- friend(grommit, wallace).
uncaught exception: error(existence_error(procedure,likes/0),friend/0)
| ?- friend(grommit, wallace).
uncaught exception: error(existence_error(procedure,likes/0),friend/0)
Code language: Bash (bash)
Ubuntuでは、SWI-Prologで試すことにしました。
SWI Prolog
aptでインストールします。
$ sudo apt install swi-prolog
Code language: Bash (bash)
コマンド名は、swipl。バージョンは、SWI-Prolog 7.6.4 でした。
$ swipl --version
SWI-Prolog version 7.6.4 for amd64
$ which swipl
/usr/bin/swipl
Code language: Bash (bash)
コマンドラインのヘルプ
$ swipl --help
swipl: Usage:
1) swipl --help Display this message (also -h)
2) swipl --version Display version information (also -v)
3) swipl --arch Display architecture
4) swipl --dump-runtime-variables[=format]
Dump link info in sh(1) format
5) swipl [options] prolog-file ... [-- arg ...]
6) swipl [options] [-o output] -c prolog-file ...
7) swipl [options] [-o output] -b bootfile -c prolog-file ...
Options:
-x state Start from state (must be first)
-[LGT]size[KMG] Specify {Local,Global,Trail} limits
-t toplevel Toplevel goal
-g goal Initialisation goal
-f file User initialisation file
-F file System initialisation file
-l file Script source file
-s file Script source file
-p alias=path Define file search path 'alias'
[+/-]tty Allow tty control
-O Optimised compilation
--nosignals Do not modify any signal handling
--nodebug Omit generation of debug info
--quiet Quiet operation (also -q)
--traditional Disable extensions of version 7
--home=DIR Use DIR as SWI-Prolog home
--pldoc[=port] Start PlDoc server [at port]
Code language: Bash (bash)
インタープリタを起動します。
$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 7.6.4)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.
For online help and background, visit http://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).
?-
Code language: Bash (bash)
インタープリタのヘルプは、Ctrl + C を2回押してから、"e"を押します。
$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 7.6.4)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.
For online help and background, visit http://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).
?- ^C
^C
WARNING: By typing Control-C twice, you have forced an asynchronous
WARNING: interrupt. Your only SAFE operations are: c(ontinue), p(id),
WARNING: s(stack) and e(xit). Notably a(abort) often works, but
WARNING: leaves the system in an UNSTABLE state
Action (h for help) ? exit
$
Code language: Bash (bash)
p98 fd_domain、fd_all_different
SWI-Prologには、fd_domain、fd_all_different がないようです。
GNU Prolog | SWI-Prolog |
---|---|
fd_domain(Puzzle, 1, 4) | %% sudoku.plの先頭で:- use_module(library(clpfd)). Puzzle ins 1..4 |
fd_all_different(Head) | all_different(Head) |
結果を省略表示しないようにするには
結果のリストが長いと、省略表示されてしまいます。
?- sudoku([_,_,2,3, _,_,_,_, _,_,_,_, 3,4,_,_], S).
S = [4, 1, 2, 3, 2, 3, 4, 1, 1|...].
Code language: Prolog (prolog)
質問の最後を「; true.」にすると、w待ちになるので、wを押すと、省略せずに表示されます。
?- sudoku([_,_,2,3, _,_,_,_, _,_,_,_, 3,4,_,_], S); true.
S = [4, 1, 2, 3, 2, 3, 4, 1, 1|...] [write] <-- ここでwを押す
S = [4, 1, 2, 3, 2, 3, 4, 1, 1, 2, 3, 4, 3, 4, 1, 2]
Code language: Prolog (prolog)
";"を押さずに、すべての解を表示するには
また、";"を押さずに、すべての結果を表示するには、質問の最後に「, print(解), nl, fail.」を追加するといいようです。
?- eight_queens([(1,A), (2,B), (3,C), (4,D), (5,E), (6,F), (7,G), (8,H)]), print([A,B,C,D,E,F,G,H]), nl, fail.
[1,5,8,6,3,7,2,4] <-- ";"の入力待ちにならない
[1,6,8,3,7,4,2,5]
[1,7,4,6,8,2,5,3]
[1,7,5,8,2,4,6,3]
[2,4,6,8,3,1,7,5]
(省略)
Code language: Prolog (prolog)
参考サイト
Prolog 入門と演習 2020年4月14日
http://www.k-techlabo.org/www_prolog/prolog_main.pdf
おすすめ書籍
「Prologの技芸」と「Prologへの入門(PrologとAI)」がバイブル的な存在ね
「Prologの技芸」は中古で8000円以上もするよ!
もともと定価5800円と高いのね。
「Prologへの入門(PrologとAI)」を読んだらどうかしら?