% CS342, Lecture 37 examples (Wed., Dec. 6, 1989)


% find last element of a list
find_last(X, [X]).
find_last(X,[_|Y]) :- find_last(X,Y).

%% Peano arithmetic: s(0) represents 1, s(s(0)) represents 2, etc.

sum(0,X,X).
sum(s(X),Y,s(Z)) :- sum(X,Y,Z).
prod(0,X,0).
prod(s(X),Y,Z) :- prod(X,Y,W), sum(Y,W,Z).

% division
quotient(X,Y,Z) :- prod(Y,Z,X).

% comparisons
lessthan(0,s(I)).
lessthan(s(I),s(J)) :- lessthan(I,J).
equal(0,0).
equal(s(I),s(J)) :- equal(I,J).
lessthanequal(I,J):- equal(I,J).
lessthanequal(I,J):- lessthan(I,J).

% generation of numbers in a closed interval
generate(I,J,K) :- lessthanequal(I,K),lessthan(K,J).
generate(I,J,K) :- lessthanequal(I,K),equal(K,J).


mbr(Head, [Head|_]).
mbr(Element,[_|Tail]) :- mbr(Element,Tail).

mbr1(Head, [Head|_]):- !.
mbr1(Element,[_|Tail]) :- mbr1(Element,Tail).

unmarried_student(X) :- not(married(X)), student(X).
student(bill).
married(joe).

set_eql([], []).
set_eql([X|L1], L2):- del(X,L2,L3), set_eql(L1,L3).

del(X,[X|Y],Y).
del(X,[Y|L1],[Y|L2]) :- del(X,L1,L2).
