Prolog Examples

Prolog programs are shown indented and in bold, user input is shown in bold red. The rest is Prolog output


How to quit Prolog :)


?- halt.

Family tree basic example

% A number of facts stored in file 'facts.pro'
parent(kim,holly).
parent(margaret,kim).
parent(herbert,margaret).
parent(john,kim).
parent(felix,john).
parent(albert,felix).
?- consult('facts.pro').
Yes

?- parent(margaret,john).
No

?- parent(margaret,X).
X = kim     <enter>
Yes

?- parent(X,kim).
X = margaret     ;
X = john     ;
No

?- parent(X,Y).
X = kim
Y = holly    ;

X = margaret
Y = kim    <enter>
Yes

?- parent(X,X).
No

?- parent(margaret,X) , parent(X,holly).
X = kim    <enter>
Yes

?- parent(X,kim) , parent(Y,X) , parent(Z,Y).
X = john
Y = felix
Z = albert    <enter>
Yes


The grandparent and greatgrandparent rule

% This is added at the end of file 'facts.pro'.

% grandparent rule
grandparent(GP,GC) :-
       parent(GP,P), parent(P,GC).

% greatgrandparent rule
greatgrandparent(GGP,GGC) :-
       parent(GGP,GP), parent(GP,P), parent(P,GC).

The recursive ancestor rule

% ancestor rule base case
ancestor(X,Y) :-
       parent(X,Y).

% ancestor rule recursion
ancestor(X,Y) :-
       parent(Z,Y), ancestor(X,Z).

The three versions of the sibling rule

% This rule does not work because sibling(kim,kim) is true!
sibling(X,Y) :-
       parent(Z,X), parent(Z,Y).


% This rule does not work because the first goal will always fail!
sibling(X,Y) :-
       not(X=Y), parent(Z,X), parent(Z,Y).


% This rule works
sibling(X,Y) :-
       parent(Z,X), parent(Z,Y), not(X=Y).

The append rule

% base case
append([], B, B).

% recursive case
append([ Head | TailA ], B, [ Head | TailC ]) :-
       append(TailA, B, TailC).

?- append( [1], [2], Z).
Z = [1,2]    <enter>
Yes

?- append( X, [3,4], [1,2,3,4]).
X = [1,2]    <enter>
Yes


Numerical Computation


?- X = 2 + 3.
X = 2+3    <enter>
Yes

?- X is 2 + 3.
X = 5    <enter>
Yes

?- Y is X + 2, X = 1.
   ERROR: Args are not suffciently instanciated

?- X = 1, Y is X + 2.
X = 1
Y = 3    <enter>
Yes


The list length rule

% base case
mylength([], 0).

% recursive case
mylength([ _ | Tail ], Len) :-
       mylength(Tail, TailLen),
       Len is TailLen + 1.

Towers of Hanoi

% The goal is to move disks from one peg to another, using only one % extra peg, while never putting a larger disk on a smaller disk. Initially % all disks are piled on one single peg. % % Basic move, just to print out what happens
move(A,B) :-
       nl, write('Move top disk from '),
       write(A), write(' to '), write(B).

% The rule transfer(N,A,B,X) is designed to move N disks from peg A to peg B using peg X

% transfer rule base case
transfer(1,A,B,X) :-
       move(A,B).

% transfer rule recursive case
transfer(N,A,B,X) :-
       M is N-1,
       transfer(M,A,X,B),
       move(A,B),
       transfer(M,X,B,A).

?- transfer(3,peg1,peg3,peg2).
Move top disk from peg1 to peg3
Move top disk from peg1 to peg2
Move top disk from peg3 to peg2
Move top disk from peg1 to peg3
Move top disk from peg2 to peg1
Move top disk from peg2 to peg3
Move top disk from peg1 to peg3
Yes



?- transfer(5,peg1,peg3,peg2).
Move top disk from peg1 to peg3
Move top disk from peg1 to peg2
Move top disk from peg3 to peg2
Move top disk from peg1 to peg3
Move top disk from peg2 to peg1
Move top disk from peg2 to peg3
Move top disk from peg1 to peg3
Move top disk from peg1 to peg2
Move top disk from peg3 to peg2
Move top disk from peg3 to peg1
Move top disk from peg2 to peg1
Move top disk from peg3 to peg2
Move top disk from peg1 to peg3
Move top disk from peg1 to peg2
Move top disk from peg3 to peg2
Move top disk from peg1 to peg3
Move top disk from peg2 to peg1
Move top disk from peg2 to peg3
Move top disk from peg1 to peg3
Move top disk from peg2 to peg1
Move top disk from peg3 to peg2
Move top disk from peg3 to peg1
Move top disk from peg2 to peg1
Move top disk from peg2 to peg3
Move top disk from peg1 to peg3
Move top disk from peg1 to peg2
Move top disk from peg3 to peg2
Move top disk from peg1 to peg3
Move top disk from peg2 to peg1
Move top disk from peg2 to peg3
Move top disk from peg1 to peg3
Yes


See This site for a bunch of solutions for the Tower of Hanoi problems.


The Farmer, Goat, Cabbage, etc.