AI Lab File (KCS751A)
AI Lab File (KCS751A)
Experiment No: 01
1. Study of PROLOG.
PROLOG-PROGRAMMING IN LOGIC:
PROLOG stands for Programming, In Logic — an idea that emerged in the early 1970’s
to use logic as programming language. The early developers of this idea included Robert
Kowaiski at Edinburgh (on the theoretical side), Marrten van Emden at Edinburgh (experimental
demonstration) and Alian Colmerauer at Marseilles (implementation).
David D.H. Warren’s efficient implementation at Edinburgh in the mid -1970’s greatly
contributed to the popularity of PROLOG. PROLOG is a programming language centred on a
small set of basic mechanisms, including pattern matching, tree based data structuring and
automatic backtracking. This Small set constitutes a surprisingly powerful and flexible
programming framework. PROLOG is especially well suited for problems that involve objects-
in particular, structured objects- and relations between them.
SYMBOLIC LANGUAGE:
PROLOG is a programming language for symbolic, non-numeric computation. It is
especially well suited for solving problems that involve objects and relations between objects.
For example, it is an easy exercise in prolog to express spatial relationship between objects, such
as the blue sphere is behind the green one. It is also easy to state a more general rule: if object X
is closer to the observer than object Y. and object Y is closer than Z, then X must be closer than
Z. PROLOG can reason about the spatial relationships and their consistency with respect to the
general rule. Features like this make PROLOG a powerful language for ArtJIcia1 LanguageA1,)
and non- numerical programming.
There are well-known examples of symbolic computation whose implementation in other
standard languages took tens of pages of indigestible code, when the same algorithms were
implemented in PROLOG, the result was a crystal-clear program easily fitting on one page.
FOR EXAIPLE:
a) FACTS:
Some facts about family relationships could be written as:
sister( sue,bill)
parent( ann.sam)
male(jo)
female( riya)
b) RULES:
To represent the general rule for grandfather, we write:
grandfather( X2)
parent(X,Y)
parent( Y,Z)
male(X)
c) QUERIES:
Given a database of facts and rules such as that above, we may make queries by typing after a
query a symbol’?’ statements such as:
?-parent(X,sam) Xann
?grandfather(X,Y)
X=jo, Y=sam
META PROGRAMMING:
A meta-program is a program that takes other programs as data. Interpreters and
compilers are examples of meta-programs. Meta-interpreter is a particular kind of meta-program:
an interpreter for a language written in that language. So a PROLOG interpreter is an interpreter
for PROLOG, itself written in PROLOG. Due to its symbol- manipulation capabilities,
PROLOG is a powerful language for meta-programming. Therefore, it is often used as an
implementation language for other languages. PROLOG is particularly suitable as a language for
rapid prototyping where we are interested in implementing new ideas quickly. New ideas are
rapidly implemented and experimented with.
Advantages:
a. Easy to build database. Doesn’t need a lot of programming effort.
b. Pattern matching is easy. Search is recursion based.
c. It has built in list handling. Makes it easier to play with any algorithm involving lists.
Disadvantages:
a. LISP (another logic programming language) dominates over prolog with respect to I/O
features.
b. Sometimes input and output is not easy.
Applications:
Prolog is highly used in artificial intelligence (AI). Prolog is also used for pattern matching
over natural language parse trees.
OUTCOME: Students will get the basic idea of how to program in prolog and its working
environment.
Experiment No: 02
Simple Facts
In Prolog we can make some statements by using facts. Facts either consist of a
particular item or a relation between items. For example we can represent the fact that it is sunny
by writing the program:
sunny.
We can now ask a query of Prolog by asking
?- sunny.
?- is the Prolog prompt. To this query, Prolog will answer yes. sunny is true because (from
Facts have some simple rules of syntax. Facts should always begin with a lowercase letter and
end with a full stop. The facts themselves can consist of any letter or number combination, as
well as the underscore _ character. However, names containing the characters -, +, *, /, or other
mathematical operators should be avoided.
Here are some simple facts about an imaginary world. /* and */ are comment
raining. /* it is raining */
OUTCOME: Student will understand how to write simple facts using prolog.
Experiment No: 03
LOGIC:
In domain section declare variable say x, y, z, A,N of type string.
Establish the relationship as below>-
1)
parent(x,y):-
father(x,y).
parent(x,y):-
mother(x,y).
2)
grandparent(x,y):-
parent(x,z).
parent(z,y).
3)
son(x,y):-
male(x).
parent(y,x).
4)
uncle(x,y):-
parent(z,y).
brother(x,y).
5)
brother(x,y):-
male(X).
parent(z,x).
parent(z,y).
6)
cousins(x,y):-
uncle(z,y).
parent(z,x).
7)
grandchild(x,y):-
son(x,z).
son(z,y).
8)
sister(x,y):-
female(x).
parent(z,x).
parent(z,y).
male(mohit).
male(sunil).
female(sheela).
female(meera).
female(reeta).
Experiment No: 04
Program:
Production rules:
Arithmetic:
c_to_f → f is c * 9 / 5
OUTCOME: Student will understand how to write a program using the rules.
Experiment No: 05
Imagine a room containing a monkey, chair and some bananas. That have been hanged from the
centre of ceiling. If the monkey is clever enough he can reach the bananas by placing the chair
directly below the bananas and climb on the chair .The problem is to prove the monkey can
reach the bananas. The monkey wants it, but cannot jump high enough from the floor. At the
window of the room there is a box that the monkey can use. The monkey can perform the
following actions:-
4) Grasp the banana if it is standing on the box directly under the banana.
Production Rules
can_reach → clever,close.
get_on: → can_climb.
Parse Tree
Clauses:
in_room(bananas).
in_room(chair).
in_room(monkey).
clever(monkey).
can_climb(monkey, chair).
tall(chair).
can_reach(X, Y):-
clever(X),close(X, Y).
get_on(X,Y):-
can_climb(X,Y). under(Y,Z):-
in_room(X),in_room(Y),in_room(Z),can_climb(X,Y,Z).
close(X,Z):-get_on(X,Y),
under(Y,Z);
tall(Y).
Output:
Queries:
?- can_reach(A, B).
A = monkey.
B = banana.
?- can_reach(monkey, banana).Yes.
OUTCOME: Student will understand how to solve monkey banana problem using rules in
prolog.
Experiment No: 06
6. WAP in turbo prolog for medical diagnosis and show the advantage and
disadvantage of green and red cuts.
Program:
Domains:
disease,indication=symbol
name-string
Predicates:
hypothesis(name,disease)
symptom(name,indication)
response(char)
go
goonce
clauses
go:-
goonce
response(Reply),
Reply='n'.
go.
goonce:-
readln(Patient),
hypothesis(Patient,Disease),!,
write(Patient,"probably has",Disease),!,
goonce:-
write("the disease").
symptom(Patient,fever):-
response(Reply),
Reply='y',nl.
symptom(Patient,rash):-
response(Reply),
Reply='y',
symptom(Patient_body,ache):-
response(Reply).
Reply='y',nl.
symptom(Patient,runny_nose):-
response(Reply),
Reply='y'
hypothesis(Patient,flu):-
symptom(Patient,fever),
symptom(Patient,body_ache),
hypothesis(Patient,common_cold):-
symptom(Patient,body_ache),
STUDENT NAME (ROLL NO.) Page 12 of
24
IEC-CET
Symptom(Patient,runny_nose).
response(Reply):-
readchar(Reply),
write(Reply).
Output:
go.
OUTCOME: Student will understand how to create a expert system using prolog.
Experiment No: 07
Program:
Factorial:
factorial(0,1).
factorial(N,F) :-
N>0,
N1 is N-1,
factorial(N1,F1),
F is N * F1.
Output:
Goal:
?- factorial(4,X).
X=24
Fibonacci:
fib(0, 0).
fib(1, 1, 0).
X > 1,
X1 is X - 1,
Y1 is Y2 + Y3.
Output:
STUDENT NAME (ROLL NO.) Page 14 of
24
IEC-CET
Goal:
?-fib(10,X).
X=55
OUTCOME: Student will understand the implementation of Fibonacci and factorial series
using prolog.
Experiment No: 08
Program:
In the 4 Queens problem the object is to place 4 queens on a chessboard in such a way that no
queens can capture a piece. This means that no two queens may be placed on the same row,
column, or diagonal.
domains
queens = queen*
freelist = integer*
predicates
nondeterm nqueens(integer)
clauses
nqueens(N):-
makelist(N,L),
Diagonal=N*2-1,
makelist(Diagonal,LL),
placeN(N,board([],L,L,LL,LL),Final),
write(Final).
placeN(_,board(D,[],[],D1,D2),board(D,[],[],D1,D2)):-!.
placeN(N,Board1,Result):-
place_a_queen(N,Board1,Board2),
placeN(N,Board2,Result).
place_a_queen(N,
board(Queens,Rows,Columns,Diag1,Diag2),
board([q(R,C)|Queens],NewR,NewC,NewD1,NewD2)):-
nextrow(R,Rows,NewR),
findandremove(C,Columns,NewC),
D1=N+C-R,findandremove(D1,Diag1,NewD1),
D2=R+C-1,findandremove(D2,Diag2,NewD2).
findandremove(X,[X|Rest],Rest).
findandremove(X,[Y|Rest],[Y|Tail]):-
findandremove(X,Rest,Tail).
makelist(1,[1]).
makelist(N,[N|Rest]) :-
N1=N-1,makelist(N1,Rest).
STUDENT NAME (ROLL NO.) Page 17 of
24
IEC-CET
nextrow(Row,[Row|Rest],Rest).
Output:
Goal:
?-nqueens(4),nl. board([q(1,2),q(2,4),q(3,1),q(4,3),[],[],[7,4,1],
[7,4,1])
yes
Experiment No: 09
Program:
Production Rules:-
route(Town1,Town2,Distance) road(Town1,Town2,Distance).
route(Town1,Town2,Distance)
road(Town1,X,Dist1),route(X,Town2,Dist2),Distance=Dist1+Dist2,
domains
town = symbol
distance = integer
predicates
nondeterm road(town,town,distance)
nondeterm
route(town,town,distance) clauses
road("tampa","houston",200).
STUDENT NAME (ROLL NO.) Page 19 of
24
IEC-CET
road("gordon","tampa",300).
road("houston","gordon",100).
road("houston","kansas_city",120).
road("gordon","kansas_city",130).
route(Town1,Town2,Distance):-
road(Town1,Town2,Distance).
route(Town1,Town2,Distance):-
road(Town1,X,Dist1),
route(X,Town2,Dist2),
Distance=Dist1+Dist2,!.
Output:
Goal:
X=320
Experiment No: 10
Program:
(defun child-states
(state) (remove-null
(list
(fill-first-jug state)
(fill-second-jug state)
(pour-first-second state)
(pour-second-first state)
(empty-first-jug state)
(empty-second-jug state))))
STUDENT NAME (ROLL NO.) Page 21 of
24
IEC-CET
(cond
((null x) nil)
;return the state when the first jug is filled (first jug can hold 3)
(cond
;returns the state when the second jug is filled (second jug can hold 5)
(cond
(s (get-second-jug state)))
(cond
((<= (+ f s) 5)
(get-state 0 (+ f s)))
(get-state (- (+ f s) 5) 5)))))
(s (get-second-jug state)))
(cond
((<= (+ f s) 3)
(get-state (+ f s) 0))
(get-state 3 (- (+ f s) 3))))))
(cond
(cond
;;;MAIN FUNCTION
(setf *node* 0)
(cond
(and goal-child (cons state goal-child)))) ;for back-tracking if the branch don't have a goal state
))
(cond
depth))))