Programma Prolog: parentele.pl

Di seguito il listato del programma prolog sulle parentele di Archimede. Per eseguirlo fare copia e incolla in un file di testo e salvarlo come parentele.pl
Poi avviare gprolog (potete scaricarlo sotto licenza GNU) e digitate [parentele].
A questo punto potete fare tutte le domande che volete e Archimede vi risponderà!


padre('Stefano', 'Bruno').    /*leggere: Stefano padre di Bruno*/
padre('Pippo', 'Gisella').
padre('Bruno', 'Aurora').
padre('Bruno', 'Archimede').
padre('Salvatore', 'Emma').
padre('Francesco', 'Martina').
/* non posso inserire una definizione di padre se no faccio cicli infiniti */

madre('Anna', 'Bruno').
madre('Nuccia', 'Gisella').
madre('Gisella','Aurora').
madre('Gisella','Archimede').
madre('Paola','Emma').
madre('Sandra','Martina').
/*come padre*/

figlio(X,Y) :- maschio(X), genitore(Y,X). /*X è figlio di Y se X è maschio e se Y è  genitore di X*/
figlia(X,Y) :- femmina(X), genitore(Y,X).

genitore(X,Y) :- padre(X,Y).    /*X è genitore di Y se X è padre di Y*/
genitore(X,Y) :- madre(X,Y).

maschio('Archimede').
maschio('Andrea').
maschio(X) :- padre(X,Y).    /* X è maschio se X è padre di qualcuno*/
femmina('Aurora').
femmina('Martina').
femmina('Emma').
femmina('Valentina').
femmina(X) :- madre(X,Y).

soru('Sandra','Gisella').
soru('Valentina','Gisella').
sorella(X,Y) :- soru(X,Y). /* proprietà commutativa, per impedire cicli infiniti non posso scrivere sorella(X,Y) :- sorella(Y,X).*/
sorella(X,Y) :- soru(Y,X). /* ma devo cambiare il nome ai fatti*/
sorella(X,Y)  :- femmina(X), madre(Z,X), padre(W,X), madre(Z,Y), padre(W,Y), X \== Y.    /*X \== Y (X diverso da Y)per impedire sorella(X,X)*/
/* X è sorella di Y se X è femmina e se la madre e il padre di X sono anche madre e padre di Y */

frati('Andrea','Gisella').
frati('Salvatore','Bruno').
fratello(X,Y) :- frati(X,Y). /* proprietà commutativa, vedi sorella*/
fratello(X,Y) :- frati(Y,X).
fratello(X,Y) :- maschio(X), madre(Z,X), padre(W,X), madre(Z,Y), padre(W,Y), X \== Y. /*come sorella*/

nonno(X,Y) :- padre(X,Z), genitore(Z,Y).    /*X è nonno di Y se X è padre di Z e Z è genitore di Y*/
nonna(X,Y) :- madre(X,Z), genitore(Z,Y).

nipote(X,Y) :- nonno(Y,X).        /* X è nipote di Y se Y è nonno o nonna o zio o zia di X */
nipote(X,Y) :- nonna(Y,X).
nipote(X,Y) :- zio(Y,X).
nipote(X,Y) :- zia(Y,X).

zio(X,Y) :- fratello(X,Z), genitore(Z,Y).    /* lo zio è il fratello di un genitore*/
zio(X,Y) :- sposato(X,Z), sorella(Z,W), genitore(W,Y). /* non posso scrivere zio(X,Y) :- sposato(X,Z), zia(Z,Y) perché si creano loop */
zia(X,Y) :- sorella(X,Z), genitore(Z,Y).
zia(X,Y) :- sposato(X,Z), fratello(Z,W), genitore(W,Y).

cugino(X,Y) :- figlio(X,Z), zio(Z,Y).        /* il cugino è il figlio dello zio*/
cugino(X,Y) :- figlio(X,Z), zia(Z,Y).
cugina(X,Y) :- figlia(X,Z), zio(Z,Y).
cugina(X,Y) :- figlia(X,Z), zia(Z,Y).

sposi('Bruno','Gisella').
sposi('Francesco','Sandra').
sposi('Stefano','Anna').
sposi('Pippo','Nuccia').
sposi('Salvatore','Paola').
sposato(X,Y) :- sposi(X,Y).     /*proprietà commutativa*/
sposato(X,Y) :- sposi(Y,X).