%:- use_module(library(lists)). % This library provides e.g. append(X, Y, Z) % and other built-in predicates concerning lists /************************ ex1:family *******************************/ male(andrew). male(todd). male(mike). male(peter). male(john). male(jason). male(william). male(ian). female(susan). female(ann). female(elizabeth). female(mary). female(jenny). female(josephine). female(vicky). parent(mary,andrew). parent(mary,todd). parent(mary,susan). parent(jason,andrew). parent(jason,todd). parent(jason,susan). parent(vicky,mike). parent(vicky,peter). parent(john,mike). parent(john,peter). parent(jenny,ann). parent(jenny,elizabeth). parent(william,ann). parent(william,elizabeth). parent(josephine,mary). parent(josephine,john). parent(josephine,jenny). parent(ian,mary). parent(ian,john). parent(ian,jenny). child(A,B) :- parent(B,A). son(A,B) :- male(A),parent(B,A). daughter(A,B) :- female(A),parent(B,A). mother(A,B) :- parent(A,B),female(A). father(A,B) :- parent(A,B),male(A). grandparent(A,B) :- parent(A,C),parent(C,B). % All solutions occur twice, because parent(C,A) matches with % father and mother. % A \== B ensures that brother(X, X) is _not_ a solution. brother(A, B) :- parent(C, A), parent(C, B), male(A), A \= B. % Solutions occur only ones because parents(C, A) is replaced by % mother(C, A) or father(C, A) resp. brother2(A, B) :- mother(C, A), mother(C, B), male(A), A \= B. brother3(A, B) :- father(C, A), father(C, B), male(A), A \= B. /************************ ex2:factorial *******************************/ factorial(0,1). factorial(N,F) :- N > 0, N1 is N-1, factorial(N1,F1), F is N*F1. /************************ ex3:exponential *******************************/ exp(X, 0, 1). exp(X, N, Y) :- N > 0, N1 is N-1, exp(X, N1, Y1), Y is X*Y1. /************************ ex4:reverse *******************************/ reverse(X, Y) :- reverse(X, [], Y). reverse([], Y, Y). reverse([H|T], Y0, Y) :- reverse(T, [H|Y0], Y). /************************ ex5:append *******************************/ append([], Ys, Ys). append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs). prefix(Xs, Ys) :- append(Xs, As, Ys). suffix(Xs, Ys) :- append(As, Xs, Ys). last(X, Xs) :- append(As, [X], Xs). /************************ ex6:delete *******************************/ delete(X, [X|Tail], Tail). delete(X, [Y|Tail], [Y|Tail1]) :- delete(X, Tail, Tail1). /************************ ex7:permutation *******************************/ permutation([], []). permutation(L, [X| P]) :- delete(X, L, L1), permutation(L1, P). /************************ ex8:subset *******************************/ member(X, [X|_Tail]). member(X, [_Y|Tail]) :- member(X, Tail). subset([], _). subset([X|Tail], Set) :- member(X, Set), subset(Tail, Set).