Answers to tutorial 11 (from CP3210 - Geoff)

%=====================================================================
%----Write a program that stores information about your family, 
%----and will answer queries about relationships. 
%----Information about individual people must be stored as facts 
%----containing the persons name, sex and parents' 
%----names, e.g. person(geoff,male,bob,margaret).

%----Here are the queries you should be able to answer ...

%?-sibling(Person,Sibling). Algorithm : Siblings have the same parents.
%?-brother(Person,Brother). Algorithm : A brother is a male sibling.
%?-sister(Person,Sister).   Algorithm : A sister is a female sibling.
%?-father(Person,Father).
%?-mother(Person,Mother).
%?-parent(Person,Parent).   Algorithm : Either a mother or father
%?-offspring(Person,Offspring). Algorithm : The inverse of parent.
%?-son(Person,Son).         Algorithm : A son is a male offspring.
%?-daughter(Person,Daughter). %A daughter is a female offspring.
%?-aunt(Person,Aunt).       Algorithm : An aunt is a parent's sister.
%?-uncle(Person,Uncle).     Algorithm : An uncle is a parent's brother.
%?-nephew(Person,Nephew).   Algorithm : A nephew is a sibling's son.
%?-niece(Person,Niece).     % A niece is a sibling's daughter.
%?-descendant(Person,Descendant). %A descendant is an offspring or 
%                                  a descendant's offspring.
%?-ancestor(Person,Ancestor).  % The inverse of descendant.
%?-relation(Person,Relation).  % Descendants of most distant ancestor.
%==================================================================
%----The Sutcliffe family tree
%----Marriage indicated by +
%----
%----             unknown1+unknown2    unknown3+unknown4
%----                     |                    |
%----unknown7+unknown8    -------bob+maggie-----    unknown9+unknow0
%----        |                     /|\                      |
%----      chris+jill-------------- | ---------------geoff+jade
%----          /                    |
%----         |   unknown5+unknown6 |
%----       jimi          |         |
%----                     sharon + jim
%----                           / \
%----                     gareth   anthony
%----
%-----------------------------------------------------------------------------
%----Facts about people in the family tree. These facts have the
%----semantics person(,,,).
person(bob,male,unknown1,unknown2).
person(maggie,female,unknown3,unknown4).
person(jill,female,bob,maggie).
person(jim,male,bob,maggie).
person(geoff,male,bob,maggie).
person(chris,male,unknown7,unknown8).
person(sharon,female,unknown5,unknowm6).
person(jade,female,unknown9,unknown0).
person(jimi,male,chris,jill).
person(gareth,male,jim,sharon).
person(anthony,male,jim,sharon).
%---------------------------------------------------------------------
%----To find the siblings of a person. Same parents.
sibling(Person,Sibling):-
    person(Person,_,Father,Mother),
    person(Sibling,_,Father,Mother),
    Person \== Sibling.
%---------------------------------------------------------------------
%----To find the brothers of a person. Male sibling
brother(Person,Brother):-
    sibling(Person,Brother),
    person(Brother,male,_,_).
%---------------------------------------------------------------------
%----To find the sisters of a person. Female sibling
sister(Person,Sister):-
    sibling(Person,Sister),
    person(Sister,female,_,_).
%---------------------------------------------------------------------
%----To find the father of a person.
father(Person,Father):-
    person(Person,_,Father,_).
%---------------------------------------------------------------------
%----To find the mother of a person.
mother(Person,Mother):-
    person(Person,_,_,Mother).
%---------------------------------------------------------------------
%----Parent is either mother or father
parent(Person,Parent):-
    father(Person,Parent).

parent(Person,Parent):-
    mother(Person,Parent).
%--------------------------------------------------------------------
%----To find the offspring of a person. Reverse parent.
offspring(Person,Offspring):-
    parent(Offspring,Person).
%--------------------------------------------------------------------
%----To find the sons of a person. A male offspring
son(Person,Son):-
    offspring(Person,Son),
    person(Son,male,_,_).
%-------------------------------------------------------------------
%----To find the daughters of a person. A female offspring
daughter(Person,Daughter):-
    offspring(Person,Daughter),
    person(Daughter,female,_,_).
%--------------------------------------------------------------------
%----To find the aunts of a person. The sister of a parent.
aunt(Person,Aunt):-
    parent(Person,Parent),
    sister(Parent,Aunt).
%--------------------------------------------------------------------
%----To find the uncles of a person. The brother of a parent.
uncle(Person,Uncle):-
    parent(Person,Parent),
    brother(Parent,Uncle).
%--------------------------------------------------------------------
%----To find the nephews of a person. Sons of siblings
nephew(Person,Nephew):-
    sibling(Person,Sibling),
    son(Sibling,Nephew).
%--------------------------------------------------------------------
%----To find the nieces of a person. Daughters of siblings
niece(Person,Niece):-
    sibling(Person,Sibling),
    daughter(Sibling,Niece).
%--------------------------------------------------------------------
%----To find the descendants of a person. First case is for immediate 
%----descendants, second is for descendants of the immediate descendants.
descendant(Person,Descendant):-
    offspring(Person,Descendant).

descendant(Person,Descendant):-
    offspring(Person,Offspring),
    descendant(Offspring,Descendant).
%-------------------------------------------------------------------
%----To find the ancestors of a person. Reverse descendant.
ancestor(Person,Ancestor):-
    descendant(Ancestor,Person).
%-------------------------------------------------------------------
%----To find the relations of a person, find the descendants of the
%----most distant ancestors. Note, unless you have a hermaphrodite at the
%----top, and not inter-breeding, some people will be listed multiple times.
relation(Person,Relation):-
    most_distant_ancestor(Person,Relation).

relation(Person,Relation):-
    most_distant_ancestor(Person,MostDistantAncestor),
    descendant(MostDistantAncestor,Relation),
    Person \== Relation.
%-----------------------------------------------------------------
%----Find any most distant ancestor
most_distant_ancestor(Person,MostDistantAncestor):-
    parent(Person,Parent),
    !,
    most_distant_ancestor(Parent,MostDistantAncestor).

most_distant_ancestor(Person,Person).
%----------------------------------------------------------------
%==================================================================