Prologプログラミング: データベース練習問題解答


練習問題1
太郎を表すのに taro ではなく, 大文字を使って Taro としたほうがわかりやすいと思うが, なぜそうしないだろうか.
大文字で始まる名前は変数であるから, Taro で太郎を表すことはできない. 具体的なものを指し示すには記号を使用する必要がある.
練習問題2
hyogo に子供がいて yoko という名前だとしよう ( naoyuki の母親の yoko とは別人). どの様な事実を付け加えればよいか.
father(hyogo, yoko). という事実を付け加えるのは間違いである. hyogo の子供の yoko と, naoyuki の母親の yoko とは別人 なのだから,別の記号で表す必要がある. したがって,たとえば hyogo の子供の yoko を記号 yoko2 で表すことにして, father(hyogo, yoko2). という事実を付け加えることになる.
練習問題3
このプログラムに常識とは矛盾する事実,たとえば father(hyogo, hyogo). を付け加えることはできるだろうか (常識では,自分が自分の父親にはなれない).
付け加えることができる. Prolog システムは常識を持ち合わせていないから, どんな事実でも付け加えることができる.
練習問題4
hyogo の母方の祖父を求めるにはどの様な質問をすれば良いか.
?- mother(M, hyogo), father(G, M).
練習問題5
?- father(F, naoyuki), father(F, C). は 何を質問していると考えられるだろうか.
naoyuki の父親の子供を尋ねている. おおまかには, naoyuki の兄弟姉妹を尋ねていると考えて良いが, 答えに naoyuki 自身も含まれてしまう点が異なる. 兄弟姉妹を尋ねるには, X と Y とが異なることを意味する 組込述語 X \== Y を利用して

         ?- father(F, naoyuki), father(F, C), C \== naoyuki.
     
とすればよい.
練習問題6
質問 ?- father(F, naoyuki), father(F, C). は どのように処理されるか.
まず father(F, naoyuki) の答え F=saburo が求められ, 次に father(saburo, C) の最初の答え C=naoyuki が得られ, 全体の最初の答えとして F=sabruo, C=naoyuki が表示される. ユーザがセミコロンを入れると, father(saburo, C) の次の答え C=shinji が得られ, 全体の答えとして F=sabruo, C=shinji が表示される. ユーザがさらにセミコロンを入れると, father(saburo, C) の次の答えを求めようとするが, 存在しないので後戻りし, father(F, naoyuki) の 次の答えを求めようとする. これも存在しないので質問全体が失敗し no が表示される.
練習問題7
「 GM が C の祖母である」を表す述語 grandmother(GM, C) を定義せよ.
たとえば,

        grandmother(GM, C) :- parent(P, C), mother(GM, P).
     
もちろん,右辺のコンマの前後が逆でもよい.
練習問題8
「 C が P の子供である」を表す述語 child(C, P) を定義せよ.
たとえば,

         child(C, P) :- parent(P, C).
     
練習問題9
「 C が G の孫である」を表す述語 grandchild(C, G) を定義せよ.
たとえば,

         grandchild(C, G) :- parent(G, P), parent(P, C).
     
練習問題10
「 X が Y の兄弟姉妹である」を表す述語 sibling(X, Y) を定義せよ.
たとえば,

         sibling(X, Y) :- father(F, X), father(F, Y), X \== Y.
     
練習問題11
「 X が Y の兄弟である」を表す述語 brother(X, Y) を定義せよ.
「 X が男である」を意味する述語 male(X) がすでに定義されていれば, それを使って,たとえば

         brother(X, Y) :- sibling(X, Y), male(X).
     
とできる.
練習問題12
「 S が P の息子である」を表す述語 son(S, P) を定義せよ.
たとえば,

         son(S, P) :- child(S, P), male(S).
     
練習問題13
「 U が C のおじである」を表す述語 uncle(U, C) を定義せよ.
たとえば,

         uncle(U, C) :- parent(P, C), brother(U, P).
     
練習問題14
「 D が P の子孫である」を表す述語 descendant(D, P) を定義せよ.
たとえば,次のプログラム

         descendant(D, P) :- child(D, P).
         descendant(D, P) :- child(C, P), descendant(D, C).
     
でもよいが,より簡単に

         descendant(D, P) :- ancestor(P, D).
     
などとできる.