%%%%% % プログラムの読み方 % % 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). %%%%%%%%%%%%%%%%%%