% Prolog-esimerkki DR-kurssille / SJ

% Prolog-tulkki itselle: http://www.swi-prolog.org
% Prolog-tulkki cs:llä: bp
% bp ei sulata UTF-8 ääkkösiä

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

% tiivistelmä Prolog -syntaksista:
% lauseen loppuun . (piste)
% muuttujat Isolla alkukirjaimella, vakiot pienellä
% A :- B     tarkoittaa  B -> A (implikaatio)
% ,  tarkoittaa ja
% ;  tarkoittaa tai
% =  tarkoittaa sama
% \= tarkoittaa eri
% \+ tarkoittaa ei (negaatio)
% ! tarkoittaa, että lopetetaan kun yksi tulos on löytynyt

% varsinainen esimerkki

% sukupuusääntöjä
% monet näistä voisi ilmaista toisinkin

% X on Y:n poika / tytär
poika(X,Y) :- isä(Y,X), mies(X).
poika(X,Y) :- äiti(Y,X), mies(X).
tytär(X,Y) :- isä(Y,X), nainen(X).
tytär(X,Y) :- äiti(Y,X), nainen(X).

% vanhempi on isä tai äiti
vanhempi(X, Y) :- isä(X, Y); äiti(X, Y).

% X on Y:n veli (edes puoliksi)
veli(X, Y) :- isä(Z, X), isä(Z, Y), mies(X), X \= Y.
veli(X, Y) :- äiti(Z, X), äiti(Z, Y), mies(X), X \= Y.

% X on Y:n sisko (edes puoliksi)
sisko(X, Y) :- isä(Z, X), isä(Z, Y), nainen(X), X \= Y.
sisko(X, Y) :- äiti(Z, X), äiti(Z, Y), nainen(X), X \= Y.

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

% täyssisar
tayssisar(X, Y) :- isä(Z1, X), isä(Z1, Y), äiti(Z2, X), äiti(Z2, Y), X \= Y.

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

% isoisä on vanhemman isä
isoisä(X, Y) :- isä(X, Z) , vanhempi(Z, Y).
isoäiti(X, Y) :- äiti(X, Z) , vanhempi(Z, Y).

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

% serkuilla on sama isovanhempi, mutta eivät ole sisaruksia, eikä hlö itse \+ on negaatio
serkku(X, Y) :- isovanhempi(Z, X), isovanhempi(Z, Y), \+ sisarus(X, Y), X \= Y.

% harjoitustehtäviä:
%
% setä: isän veli
% eno: äidin veli
% täti isän tai äidin sisar

% lisää harjoituksia, näihin joutuu lisäämään uuden käsitteen
%
% käly: puolison sisar, veljen vaimo
% nato: aviomiehen sisar
% lanko: puolison veli, sisaren aviomies
% anoppi: puolison äiti
% appi: puolison isä
% miniä: pojan vaimo


% tämän suvun kuvaus:
% lisäile tänne tietoa


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

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

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

äiti(meeri, eeva).
äiti(merja, matti).

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

