%%%%%
% プログラムの読み方
% 
% p.  は   「p」
% p :- q1, q2, q3.  は  「q1 かつ q2 かつ q3 ならば p」
% :- の左辺には1つしか書けない。
% :- の右辺には0個以上いくつでも書ける。
% 大文字で始まる文字列は変数。X, Y, Z, ...
% 小文字で始まる文字列は述語名または定数。 alice,append,...

%%% example.pl
is_mother(alice, charlie).
is_mother(alice, eliza).
is_mother(eliza, george).
is_mother(hillary, fritz).

is_husband(bob, alice).
is_husband(fritz, eliza).

is_father(X, Z) :- is_husband(X, Y),  is_mother(Y, Z).

is_parent(X, Y) :- is_mother(X, Y).
is_parent(X, Y) :- is_father(X, Y).

is_grandparent(X, Z) :- is_parent(X, Y), is_parent(Y, Z).

is_spouse(X, Y) :- is_husband(X, Y).
is_spouse(X, Y) :- is_husband(Y, X).

is_ancester(X, Y) :- is_parent(X, Y).
is_ancester(X, Z) :- is_parent(X, Y), is_ancester(Y, Z).

is_relative(X, X).
is_relative(X, Y) :- is_spouse(X, Y).
is_relative(X, Y) :- is_ancester(X, Y).
is_relative(X, Y) :- is_ancester(Y, X).

% the following code is buggy.
is_superrelative(X, Y) :- is_relative(X, Y).
is_superrelative(X, Z) :- is_relative(X, Y), is_superrelative(Y, Z).
%%%%%%%%%%%%%%%%%%
add(X, 0, X).
add(X, s(Y), s(Z)) :- add(X, Y, Z).

times(X, 0, 0).
times(X, s(Y), W) :- times(X, Y, Z), add(Z, X, W).

power(X, 0, s(0)).
power(X, s(Y), W) :- power(X, Y, Z), times(Z, X, W).
%%%%%%%%%%%%%%%%%%
% factorial function 
fact(N, 1) :- N < 1, ! .
fact(N, X) :- N1 is N - 1, fact(N1, X1), X is X1 * N .
%
append([], X, X).
append([X | L], M, [X | N]) :- append(L, M, N).
%%%%%%%%%%%%%%%%%%

