~/blog/introduction-to-logic-programming-with-prolog-prolog-installation-sample-code-usage
Published on

Prolog言語で論理プログラミング入門・Prologのインストール方法・サンプルコード・使い方

2329文字4分で読めます–––
閲覧数
Authors
  • avatar
    Name
    Shou Arisaka nyapp.buzz/shou
    short bio
    Z世代の情報技術者。Next.jsで自作SNSを個人開発中。

prologは論理プログラミング言語と呼ばれる、PythonやJavaScriptをはじめとした流行のプログラミング言語とは大きく異なる特性を持ったプログラミング言語のひとつである。prologは形式論理の一階述語論理に倣っている。

# install prolog on ubuntu
sudo apt update ; sudo apt-get install swi-prolog

The basic constructs of logic programming, terms and statements, are inherited from logic. There are three basic statements:

Facts are fundamental assertions about the problem domain (e.g. “Socrates is a man”) Rules are inferences about facts in the domain (e.g. “All men are mortal.“) Queries are questions about that domain (e.g. “Is Socrates mortal?“)

上記の通り、prologのコードにはFacts Rules Queriesの3つの属性がある。 大雑把に言って、factsは真実であること、rulesは真実に関連する事柄、queriesは質問である。

Introduction to logic programming with Prolog

prologの実行は以下のように行われる。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_3e65d686-900b-4903-9416-c2ea5fdb7d2f.png
yuis@yuis:~/pg/prolog$ cat > dev.pl
man(socrates).
mortal(X) :- man(X).
yuis@yuis:~/pg/prolog$ prolog -q
?- mortal(socrates).
ERROR: Undefined procedure: mortal/1 (DWIM could not correct goal)
?- [dev].
true.

?- mortal(socrates).
true.

?-

以下ではエラーとなる。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_d677592f-854a-437c-b49e-86b100533044.png
yuis@yuis:~/pg/prolog$ prolog -q
?- man(socrates).
ERROR: Undefined procedure: man/1 (DWIM could not correct goal)
?-

何が言いたいかというと、factsとrulesに関してはファイルにて記述しそれを読み込み、queriesに関してはインタラクティブシェル上で実行する、という方法を取るべきである、ということ。

Loading files in Prolog - Stack Overflow

多くのprolog参考記事を見てみると、man(socrates).といったfactsをインタラクティブシェル上で実行して定義できるかのような書き方がされているが、それをやるとエラーに見舞われる、という話。バージョンか何かが違うんだろう。

よって、インタラクティブシェルに直接コードを載せたい場合は以下のような書き方となる。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_eaa31ad9-370b-4fb1-af40-ae17ce4baafd.png
yuis@yuis:~/pg/prolog$ prolog -q <<< " $( printf "[dev].\nmortal(socrates)." )"
true.

true.

個人的なやり方を紹介すると、ファイルを2つ用意して、factsとrulesのファイル、queriesのファイルとわけて以下のようにしてやっている。

prolog <<< " $( printf "[dev_facts].\n$( cat dev_queries.pl )" ) "
avatar

Shou Arisaka

情報技術者 / Z世代プログラマー / SaaSアプリやSNSを開発
今すぐ話そう!

15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。

Created with Fabric.js 5.2.4 何かご質問がありますか?