mushroompot

mushroompot

全栈,全干,全菜。 be a fullstack man, just for fun!
twitter

《論理プログラミング入門》クイックリーディングノート

論理プログラミング#

新年には、《Logic Progrmming 入門》という本を読むために 1 日以上の時間を費やしました(以下、この本とします)。以前から論理プログラミングの本を読んでいましたが、その時は主に Prolog 言語に焦点を当てて学習していました。

論理プログラミングはデータベースとして使用できるのか?#

これまで読んだ Prolog の本とは異なり、この本では論理プログラミングの説明をデータベースの観点から進めています。一般的な Prolog の本では、古典的な家族関係を切り口に論理プログラミングの魅力を説明しますが、この本ではデータセットから始めています。
この本では、論理プログラミングの形式を明確に示しています:
facts + rules + query
論理プログラミングの形式から、データベースとの密接な関係が見えてきます。関係型データベースの形式を思い出してみましょう。例えば、MySQL を使用する場合:

データベースがあるとします
--------------------------
-- iD -- name -- age -----
-- 0  -- tim  -- 32  -----
-- 1  -- ada  -- 23  -----
-- 2  -- tom  -- 23  -----
--------------------------
この時、名前がtimの顧客のすべての情報をMySQLのクエリ文で検索します
select * from person where name = 'tim';
結果は以下のようになります
--------------------------
-- iD -- name -- age -----
-- 0  -- tim  -- 32  -----
--------------------------

上記のプロセスを Prolog で表現すると、次のようにデータセットを構築できます。

% facts

person(0,tim,32).
person(1,ada,23).
person(2,tom,23).

%query

person(X,tim,Y).

% result

X = 0.
Y = 32.

上記の Prolog コードでは、まず一連の事実(facts)を構築し、それからその事実に基づいて必要な変数をクエリし、最後にクエリの結果を得ることができます。
ただし、この方法で事実を構築する場合、いくつかの問題が発生する可能性があります。例えば、person (0,tim,32) の場合、各値の意味がわからないことがあります。例えば、0 と 32 は ID と年齢であることがわかりません。次のように構築することができます。

% facts

person(id(0),name(tim),age(32)).
person(id(1),name(ada),age(23)).
person(id(2),name(tom),age(23)).

%query

person(X,name(tim),Y).

% result

X = id(0).
Y = age(32).

これにより、各位置の値の意味を示すことができます。
もちろん、この例だけを見ても、Prolog は MySQL と比べて特に利点がなく、むしろいくつかのストレージの負担を増やす可能性があります。
単純なクエリの場合、Prolog はその利点を示すことができません。Prolog(論理プログラミング)の特定の機能を示すために、古典的な家族関係の例を取り上げる必要があります。

古典的な家族関係の例#

大家族の系図を想像することができます。系図関係を設計してみましょう。

% 系図関係のいくつかの事実
male(charles).
male(william).
male(peter).
male(henry).
male(andrew).
male(edward).
male(viscount).
male(savanna).

female(elizabeth).
female(anne).
female(zara).
female(beatrice).
female(eugenie).
female(louise).
female(isla).

parent(elizabeth,charles).
parent(elizabeth,anne).
parent(elizabeth,andrew).
parent(elizabeth,edward).

parent(anne,peter).
parent(anne,zara).
parent(charles,william).
parent(charles,henry).
parent(andrew,beatrice).
parent(andrew,eugenie).
parent(edward,louise).
parent(edward,viscount).
parent(peter,savanna).
parent(peter,isla).

% maleは男性を、femaleは女性を表し、parent(X,Y)はXがYの親(父または母)であることを示します。

論理的な問題に直面した場合、論理プログラミングを使用すると時間を大幅に節約できます。例えば、grandparent の関係をクエリしたい場合、次のルールを記述するだけです。

grandparent(X,Y) :- parent(X,Z),parent(Z,Y).

% このルールはgrandparentの論理的な関係を説明しており、
% grandparentは実際には親の親であることを示しています。

ここから、論理プログラミングのいくつかの利点を感じることができます。プログラムを書く際には、実際には論理的な制約のルールを書いているだけであり、論理プログラミング言語(例えば Prolog)のエンジンはそのルールに基づいて対応する解を探し出すことができます(本質的には検索です)。

更新#

この本では、facts と querys の説明の後、updates の説明が始まります。したがって、この本は確かに論理プログラミングをデータベースの観点から紹介しています。
本には、update の構文の例が示されています。

p(a,b) & ~q(b) ==> ~p(a,b) & p(b,a)
p(X,Y) & ~q(Y) ==> ~p(X,Y) & p(Y,X)

これにより、データベースのルールが更新されます。

データ構造#

この本では、リスト、セット、木の 3 種類のデータ構造について説明していますが、他の Prolog の本とあまり変わりません。

まとめ#

《Logic Progrmming 入門》は一読の価値があります。この本を読むことで、論理プログラミングをよく理解することができます。Prolog 関連の本を読む前に、まずこの本を読むこともおすすめです。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。