CONSTANTS
tt="Family Tree"
DOMAINS
h=symbol % h stands for human
hl=h* % list of humans; defined to support this kind of queries: findall(P,p(P,i),LP) where i is an input symbol.
PREDICATES
mama(h,h) % (mama,copil)
tata(h,h) % (T,C)
sora(h,h) % (F,O)
frate(h,h) % (M,O)
ssf(h,h) % sora sau frate
bunici(h,h) % (B,N)
bunic(h,h) % (B,N)
bunica(h,h) % (B,N)
cuplu(h,h) % (M,F), (F,M)
unchi(h,h) % (U,N)
matusa(h,h) % (M,N)
predecesor(h,h) % (P,C)
succesor(h,h) % (S,C)
% cel mai indepartat predecesor
cmip(h, h) % (CMIP,C)
% cel mai indepartat succesor
cmis(h,h) % (CMIS,C)
rudes(h,h)
rudea(h,h)
DATABASE
p(h,h) % parinte(P,C)
f(h) % feminin
m(h) % masculin
soti(h,h)
%GOAL
%write(tt),nl,write("Mama Tatianei este: "),mama(X,tatiana),write(X),nl.
CLAUSES
% (*,*) all
tata(T,C):-p(T,C),m(T).
mama(M,C):-p(M,C),f(M).
frate(F,X):-tata(T,F),tata(T,X),X<>F,m(F).
sora(S,X):-tata(T,S),tata(T,X),X<>S,f(S).
ssf(X,Y):-sora(X,Y);frate(X,Y).
bunici(B,N):-p(P,N),p(B,P).
bunic(B,N):-bunici(B,N),m(B).
bunica(B,N):-bunici(B,N),f(B).
cuplu(X,Y):-soti(X,Y);soti(Y,X).
unchi(U,N):-p(P,N),frate(U,P).
matusa(M,N):-p(P,N),sora(M,P).
% (o,i),(i,i) % (i,o),(o,o)
predecesor(PR,S):-p(PR,S);
p(P,S),predecesor(PR,P).
% (o,i),(i,i) % (i,o),(o,o)
succesor(S,P):-predecesor(P,S).
% cel mai indepartat predecesor
% (o,i),(i,i) % (i,o),(o,o)
cmip(CMIP,D):-predecesor(CMIP, D),not(predecesor(_,CMIP)).
% cel mai indepartat succesor
% (o,i),(i,i) % (i,o),(o,o)
cmis(CMIS,X):-succesor(CMIS, X),not(succesor(_,CMIS)).
% (i,i),(i,o),(o,i),(o,o)
rudes(X,Y):-cmip(Y,X);
cmip(X,Y);
cmip(Z,X),predecesor(Z,Y),X<>Y;
cmip(Z,Y),predecesor(Z,X),X<>Y.
% (i,i),(i,o),(o,i),(o,o)
rudea(X,Y):-cuplu(X,Y);
cuplu(X,A),rudes(Y,A),not(succesor(Y,A));
cuplu(A,Y),rudes(X,A),not(succesor(X,A));
cuplu(A,B),rudes(X,A),rudes(Y,B),not(succesor(X,A)),not(succesor(Y,B)).
% FACTS:
m(ion).
m(adrian).
m(alex).
m(vasile).
m(nicu).
m(gelu).
m(alin).
m(david).
f(anda).
f(cati).
f(tatiana).
f(ana).
f(maria).
% p(P,C)
p(george,ion).
p(ion,adrian).
p(ion,tatiana).
p(adrian,anda).
p(cati,tatiana).
p(cati,adrian).
p(tatiana,alex).
p(tatiana,gelu).
p(tatiana,maria).
p(nicu,alex).
p(nicu,gelu).
p(nicu,maria).
p(vasile,nicu).
p(ana,nicu).
p(alin,david).
% soti(M,F)
soti(ion,cati).
soti(vasile,ana).
soti(nicu,tatiana).