% Prolog-esimerkki DR-kurssille / SJ

% Prolog-tulkki itselle: http://www.swi-prolog.org
% Prolog-tulkki cs:lla: bp
% bp ei sulata UTF-8 aakkosia

% ohjelman suku1.pl lataaminen: [suku1].
% poistuminen: halt. (tai Cntr-D)

% tiivistelma Prolog -syntaksista:
% lauseen loppuun . (piste)
% muuttujat Isolla alkukirjaimella, vakiot pienella
% A :- B     tarkoittaa  B -> A (implikaatio)
% ,  tarkoittaa ja
% ;  tarkoittaa tai
% =  tarkoittaa sama
% \= tarkoittaa eri
% \+ tarkoittaa ei (negaatio)
% ! tarkoittaa, etta lopetetaan kun yksi tulos on loytynyt

% varsinainen esimerkki

% sukupuusaantoja
% monet naista voisi ilmaista toisinkin

% X on Y:n poika / tytar
poika(X,Y) :- isa(Y,X), mies(X).
poika(X,Y) :- aiti(Y,X), mies(X).
tytar(X,Y) :- isa(Y,X), nainen(X).
tytar(X,Y) :- aiti(Y,X), nainen(X).

% vanhempi on isa tai aiti
vanhempi(X, Y) :- isa(X, Y); aiti(X, Y).

% X on Y:n veli (edes puoliksi)
veli(X, Y) :- isa(Z, X), isa(Z, Y), mies(X), X \= Y.
veli(X, Y) :- aiti(Z, X), aiti(Z, Y), mies(X), X \= Y.

% X on Y:n sisko (edes puoliksi)
sisko(X, Y) :- isa(Z, X), isa(Z, Y), nainen(X), X \= Y.
sisko(X, Y) :- aiti(Z, X), aiti(Z, Y), nainen(X), X \= Y.

% X on Y:n sisarus (sukupuolineutraali). ; on tai
% voidaan maaritella veljeyden tai siskouden kautta:
%sisarus(X, Y) :- veli(X, Y) ; sisko(X, Y).
% tai voidaan maaritella yhteisen vanhemman kautta:
sisarus(X, Y) :- vanhempi(Z, X), vanhempi(Z, Y).

% tayssisar
tayssisar(X, Y) :- isa(Z1, X), isa(Z1, Y), aiti(Z2, X), aiti(Z2, Y), X \= Y.

% isovanhempi
isovanhempi(X, Y) :- vanhempi(X, Z) , vanhempi(Z, Y).

% isoisa on vanhemman isa
isoisa(X, Y) :- isa(X, Z) , vanhempi(Z, Y).
isoaiti(X, Y) :- aiti(X, Z) , vanhempi(Z, Y).

% lapsenlapsi
lapsenlapsi(X, Y) :- isovanhempi(Y, X).

% serkuilla on sama isovanhempi, mutta eivat ole sisaruksia, eika hlo itse \+ on negaatio
serkku(X, Y) :- isovanhempi(Z, X), isovanhempi(Z, Y), \+ sisarus(X, Y), X \= Y.

% harjoitustehtavia:
%
% seta: isan veli
% eno: aidin veli
% tati isan tai aidin sisar

% lisaa harjoituksia, naihin joutuu lisaamaan uuden kasitteen
%
% kaly: puolison sisar, veljen vaimo
% nato: aviomiehen sisar
% lanko: puolison veli, sisaren aviomies
% anoppi: puolison aiti
% appi: puolison isa
% minia: pojan vaimo


% taman suvun kuvaus:
% lisaile tanne tietoa


mies(matti).
mies(paavo).
mies(pekka).
mies(ville).
mies(vihtori).

nainen(pirkko).
nainen(eeva).
nainen(pirjo).
nainen(emma).

isa(ville, matti).
isa(vihtori, eeva).
isa(vihtori, emma).
isa(matti, pekka).		% matti on pekan isa
isa(matti, paavo).		
isa(matti, pirkko).

aiti(meeri, eeva).
aiti(merja, matti).

aiti(eeva, pirkko).		% eeva on pirkon aiti
aiti(eeva, pirjo).
aiti(eeva, paavo).
aiti(emma, liisa).

