In: Computer Science
In order to complete these exercises, you will need to install prolog from swi-prolog.org.
Write a Prolog program by creating a file with you favorite program editor like Notepad++ that contains the following facts:
here the predicate parent(X,Y) means X is the parent of Y
you can also copy/paste or download the following database from the
course website
female(pam). female(liz). female(ann). female(pat). male(tom). male(bob). male(jim). parent(pam,bob). parent(tom,bob). parent(tom,liz). parent(bob,ann). parent(bob,pat). parent(pat,jim).
(a) Load this file into Prolog, usually this is done with the consult file predicate: ?- consult(‘<filename>’).
On Windows you can load the fact database with the menu point
File®Consult.
also overloads a bare string list by consulting each item in the
list: ['family_tree.pl'].
% these are the family facts
female(pam).
female(liz).
female(ann).
female(pat).
male(tom).
male(bob).
male(jim).
parent(pam,bob). % pam is parent of bob (etc.)
parent(tom,bob).
parent(tom,liz).
parent(bob,ann).
parent(bob,pat).
parent(pat,jim).
will work. Once you have loaded the program pose the following queries:
?- female(ann).
?- female(jim).
?- parent(X,bob).
?- parent(tom,X).
?- parent(X,ann),parent(X,pat).
What are the answers to these queries? Beware, for some queries here might be more than one answer. To get all the answers type a ';' and carriage return at the question mark.
(b) Now, using the parent predicate formulate the following Prolog queries:
1. Who is Pat's parent?
2. Does Liz have a child?
SWI-Prolog
3. Who is Pat's grandparent?
(c) Given the above facts, extend the program by writing rules defining the following predicates:
sister(X,Y) -- X is the sister of Y.
son(X,Y) -- X is the son of Y.
father(X,Y) -- X is the father of Y. grandmother(X,Y) -- X is the
grandmother of Y. ancestor(X,Y) -- X is an ancestor of Y.
(Hint: this predicate might come in handy: different(X,Y):- not(X=Y). Some predicate definitions might be recursive.)
Add these rules to your existing file and attach the file to your submission
Demonstrate that your program works by posing the following queries:
4. ?- sister(X,pat).
5. ?- sister(X,Y).
6. ?- son(jim,X).
7. ?- father(X,bob).
8. ?- grandmother(X,ann). 9. ?- ancestor(X,jim).
Hand in the source code of your prolog program and a proof of the program execution.
For each of parts a, b, and c, you should include screenshots of the relevant contents of the SWI-Prolog console. Part c additionally requires you to attach your .pl file.
%The complete prolog code is as follows:
female(pam).
female(liz).
female(ann).
female(pat).
male(tom).
male(bob).
male(jim).
parent(pam,bob).
parent(tom,bob).
parent(tom,liz).
parent(bob,ann).
parent(bob,pat).
parent(pat,jim).
different(X,Y):- not(X=Y).
% here X is the sister of Y, so we first check if X is a
female
% we trhen use a third varible that signifies the parenst of X and
Y
% for X to be sister of Y they must have the same parents
sister(X,Y):-female(X),parent(Z,X),parent(Z,Y),different(X,Y).
%here X is the son of Y, so we first check if X is a male
%then we find all the cases where Y is the parent of X
son(X,Y):- male(X),parent(Y,X).
%here X is the father of Y, we check if X is a male
%then we afind all the cases where X is the parent of Y
father(X,Y):-male(X),parent(X,Y).
%here X is the grandmother of Y, we first check if X is a
female
%we then use Z which holds the parent of Y and then find the
parents of Z
grandmother(X,Y):-female(X),parent(Z,Y),parent(X,Z),different(X,Y).
%here X is the ancestor of Y, we first find all the parents of
Y
%we then recursively call the predicate, we use Z to hold the
parents of Y
% then we find all the parents of Z and keep on doing it
recursively until the facts get exhausted
ancestor(X,Y):-parent(X,Y).
ancestor(X,Y):-parent(X,Z),ancestor(Z,Y).
OUTPUT:
(a)
(b)

note in (b) 3 "who is pats grandparents" variable X holds pats parents and variable Y holds pats grandparents.
(c)
