Kunal AI Lab
Kunal AI Lab
Practical File
Submitted By:
Name: Kunal Singh Solanki
Date: 08/02/2024
Roll No: 1716110101
Branch: CSE
Year: 4th
Submitted To:
Index
INDEX
EXPERIMMENT
S NO. DATE REMARKS
Study of prolog
1.
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), Marten van Emden at Edinburgh (experimental
demonstration) and Alian Colmer Auer 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 centered around 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
Programming in PROIOG is accomplished by creating a database of facts and rules about objects,
their properties, and their relationships to other objects. Queries then can be posed about the
objects and valid conclusions will be determined and returned by the program Responses to user
queries are determined through a form of inference control known as resolution.
FOR EXAMPLE:
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:
grand f.gher( 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 mela-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.
Practical: - 02
Objective: - Write simple fact for the statements using PROLOG.
Statements:
1. The Cakes are delicious.
2. The Chicken is delicious.
3. The Chicken is spicy.
4. Priya relishes coffee.
5. Priya likes food if they are delicious.
6. Prakash likes food if they are spicy and delicious.
Statements in Prolog:
1. delicious(cakes).
2. delicious(chicken).
3. spicy(chicken).
4. relishes(priya, coffee).
5. likes(priya, Food) if delicious(Food). %Here Food is a variable
6. likes(prakash,Food) if spicy(Food) and delicious(Food).
Program Clauses:
delicious(cakes).
delicious(chicken).
spicy(chicken).
relishes(priya, coffee).
likes(priya, Food):-delicious(Food).
likes(prakash, Food):- spicy(Food), delicious(Food).
Output:
Goal 2: What does food Priya like.
Output:
Program:
Domains:
disease,indication=symbol
name-string
Predicates:
hypothesis(name,disease)
symptom(name,indication)
response(char)
go
goonce
clauses
go:-
goonce
write("will you like to try again (y/n)?"),
response(Reply),
Reply='n'.
go.
goonce:-
write("what is the patient's name"),nl,
readln(Patient),
hypothesis(Patient,Disease),!,
write(Patient,"probably has",Disease),!,
goonce:-
write("sorry, i am not ina position to diagnose"),
write("the disease").
symptom(Patient,fever):-
write("does",Patient,"has a fever (y/n)?"),nl,
response(Reply),
Reply='y',nl.
symptom(Patient,rash):-
Output:
Factorial Program:
factorial(0,1).
factorial(N,F):-
N>0,
N1 is N-1,
factorial(N1,F1),
F is N * F1.
Output:
Fibonacci Program:
fib(0, 1) :- !.
fib(1, 1) :- !.
fib(N, F) :-
N>1,
N1 is N-1,
N2 is N-2,
fib(N1, F1),
fib(N2, F2),
F is F1+F2.
Output:
Practical: - 03
Objective: Write predicates one converts Centigrade temperatures to Fahrenheit, the other
checks if a temperature is below freezing.
Program:
Output:
Practical:- 04
Explanation: Assume that a room containing a Monkey, a Table and a Banana. The Banana is
hanging from the ceiling of the room. Table is not below the banana. Monkey is anywhere in the
room. In this program/problem we will prove that monkey can grasp the banana. If the monkey is
clever he can grasp the banana by placing the table below the banana. Monkey only can reach the
banana if he jumps from the table, otherwise he cannot reach to banana by jumping from floor or
anywhere in room (except table). Monkey (strong monkey) can push the table.
Program:
on(floor,monkey).
on(fllor,box).
in(room,monkey).
in(room,box).
in(room,banana).
at(ceiling,banana).
strong(monkey).
grasp(monkey).
climb(monkey,box).
push(monkey,box):-strong(monkey).
under(banana,box):-push(monkey,box).
canreach(banana,monkey):-at(floor,banana);
at(ceiling,banana),under(banana,box),climb(monkey,box).
canget(banana,monkey):-canreach(banana,monkey),grasp(monkey).
Output:
Practical: - 07
Objective: Write a program to solve traveling salesman problem.
Program:
road("A","B",200).
road("C","A",300).
road("B","C",100).
road("B","D",120).
road("C","D",130).
route(Town1 , Town2 , Distance):-road(Town1, Town2 , Distance).
route(Town1 , Town2 , Distance):-road(Town1, X , Distance1),route(X , Town2 , Distance2) ,
Distance is Distance1+Distance2,!.
Output:
Program:
Output:
?-nqueens(4),nl.
board([q(1,2),q(2,4),q(3,1),q(4,3),[],[],[7,4,1],[7,4,1])
yes
Practical: - 09
Objective: Write a program to solve water jug problem using LISP.
;;;MAIN FUNCTION
(defun dfs (start-state depth lmt)
(setf *node* 0)
(setf *limit* lmt)
(dfs-node start-state depth) )
;dfs-node expands a node and calls dfs-children to recurse on it
(defun dfs-node (state depth)
(setf *node* (+ 1 *node*))
(cond
((is-goal state) (list state))
((zerop depth) nil)
((> *node* *limit*) nil)
((let ((goal-child (dfs-children (child-states state) (- depth 1))))
(and goal-child (cons state goal-child)))) ;for back-tracking if the branch don't have a goal
state )) ;dfs-children expands each node recursively and give it ;to dfs-node to process