Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
6 views

Logic-Programming (1)

This document covers the fundamentals of logic programming and Prolog, including declarative programming, facts, rules, predicates, and the structure of Prolog programs. It discusses key concepts such as unification, resolution, and the handling of failures, as well as practical examples like calculating factorials and traversing graphs. Additionally, it introduces list processing and type determination in Prolog.

Uploaded by

607Aditi Patil
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
6 views

Logic-Programming (1)

This document covers the fundamentals of logic programming and Prolog, including declarative programming, facts, rules, predicates, and the structure of Prolog programs. It discusses key concepts such as unification, resolution, and the handling of failures, as well as practical examples like calculating factorials and traversing graphs. Additionally, it introduces list processing and type determination in Prolog.

Uploaded by

607Aditi Patil
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 54

Unit 4 - Logic Programming

Some "declarative" slides on


logic programming and Prolog.
Syllabus
❑Computing with relations
❑ Introduction to Prolog
❑ Data Structures in Prolog, Programming Techniques
❑ Control in Prolog
❑ Cuts.
Introduction to Logic Programming
❑Declarative programming describes what is desired
from the program, not how it should be done
❑Declarative language: statements of facts and
propositions that must be satisfied by a solution to the
program

real(x). proposition: x is a real number.


x > 0. proposition: x is greater than 0.
Declarative Languages
❑what is a "declarative language"?

❑give another example (not Prolog) of a declarative


language.

SELECT * FROM COUNTRY WHERE CONTINENT = 'Asia';


Facts, Rules, ...
❑What is a proposition?

❑What are facts?

❑What are rules?

❑What is a predicate?

❑What is a compound term?


Facts: The ways of stating the relationship between objects
fish(salmon).
likes(cat, tuna).
Predicates: A Relationship is called Predicate
fish, likes
Compound terms:
likes(cat, X), fish(X)
Atoms: Names of individuals are known as Atoms
cat, salmon, tuna
Rule: Are implications that are stated during a consult
operation
eats(cat,X) ⊂ likes(cat,X), fish(X).
A Really Simple Directed Graph
(1) edge(a, b).
a
(2) edge(a, c).
(3) edge(c, d).
(4) path(X, X).
b c (5) path(X, Y) ⊂
edge(X, N), path(N, Y).

d
Question: What are the...
❑ atoms
❑ facts
❑ rules
Clausal Form
❑Problem: There are too many ways to express
propositions.
■difficult for a machine to parse or understand
❑Clausal form: standard form for expressing
propositions

Consequent Antecedent

Example:
path(X, Y) ⊂ edge(X, N) ∩ path(N, Y).
Clausal Form Example
path(X, Y) ⊂ edge(X, N) ∩ path(N, Y).

Meaning:
if there is an edge from X to N and there a path from N
to Y,
then there is a path from X to Y.
The above is also called a "headed Horn clause".
In Prolog this is written as a proposition or rule:

path(X, Y) :- edge(X, N) , path(N, Y).


Query
❑A query or goal is an input proposition that we want
Prolog to "prove" or disprove.
❑A query may or may not require that Prolog give us a
value that satisfies the query (instantiation).
❑Method for retrieving the information from a program
1 ?- edge(a,b).
Yes
2 ?- path(c,b).
No
3 ?- path(c,X).
X = c ;
X = d ;
No
Logical Operations on Propositions
Propositional Connections:
1. Negation: ~p
2. Disjunction (or) : p v q = F iff p = F and q =F
3. Conjuctions (and) : p and q = T iff p = T and q = T
4. Implication (->) :
p -> q = ~p or q
= F only if p = T and q = F
Unification
Unification is a process of finding values of variables
(instantiation) to match terms. Uses facts.

(1-3) edge(a,b). edge(a,c). edge(c,d). (Facts)


(4) path(X,X). (Rule)
(5) path(X,Y) := edge(X,N), path(N,Y). (Rule)
?- path(a,d). This is the query (goal).
Instantiate { X=a, Y=d }, and unify path(a,d) with Rule 5.
After doing this, Prolog must satisfy:
edge(a,N). This is a subgoal.
path(N,d). This is a subgoal.
Unification in plain English
Compare two atoms and see if there is a substitution
which will make them the same.

1. edge(a, b). (Fact)


5. path(X, Y) :- edge(X, N) , path(N, Y).
6. path(a, Z). (Query)

How can we unify 6 with 5?


Let X := a
Let Y := Z
Resolution
Resolution is an inference rule that allows propositions to
be combined.
❑Idea: match the consequent (LHS) of one proposition
with the antecedent (RHS term) of another.
Resolution Example
1. edge(a, b). (Fact)
5. path(X, Y) :- edge(X, N) , path(N, Y).
6. path(a, Z). (Query)

How can we unify 6 with 5?


Let X := a
Let Y := Z
Resolution: path (a,Z) :- edge(a,N), path(N,Z)
N = b , path(b, Z) : edge(b, N1), path(N1, Z) = F
N = c, path(c,Z) : edge(c, N1), path(N1,Z)
N1 = d: Solution Z = b,c,d
How to handle failures
❑Prolog can work backwards towards the facts using
resolution, instantiation, and unification.
❑As it works, Prolog must try each of several choices.
❑These choices can be stored as a tree.

?- path(a,d). The goal.


Unify: unify path(a,d)with Rule 5 by instantiate { X=a,Y=d }
Subgoal: edge(a,N).
Instantiate: N=b which is true by Fact 1.
Subgoal: path(b,d).
Unify: path(b,d)with Rule 5: path(b,d) :- edge(b,N),path(N,d)
Failure: can't instantiate edge(b,N) using any propositions.
How to handle failures (2)
❑When a solution process fails, Prolog must undo some
of the decisions it has made.
❑This is called backtracking.
■same as backtracking you use in recursion.
❑Marks a branch of the tree as failed.
How it Works (1)
There are 2 search/execution strategies that can be
used by declarative languages based on a database of
facts.
1. Forward Chaining
2. Backward Chaining
❑ what are the meanings of these terms?
How it Works (2)
1. Forward Chaining
2. Backward Chaining
❑ Which strategy does Prolog use?
❑ Under what circumstances is one strategy more
effective than the other?
Consider two cases:
■ large number of rules, small number of facts
■ small number of rules, large number of facts
E.g.
Facts : fatherof(aa, bb)
fatherof(bb,cc)
male(aa)
male(bb)
female(cc)
Rules: gfo(X,Y) :- fatherof(X,Z) and fatherof(Z,Y)
Queries:
gfo(aa,cc)?

gfo(dd,bb)?
CUTS
1. The Process of query evaluation often requires
considerable backtracking.
2. To save time, CUTS was introduced
3. CUT(!) indicates that if backtracking must be applied,
the pattern fails
4. It limits the search space for a solution
5. e.g gfo(aa, cc), female(cc)
- Yes
gfo(aa,cc), !, female(cc)
-No
Cut has not effect in forward direction
PROLOG: PROgramming in LOGic

The only "logic" programming language in common use.


3 Parts of a Prolog Program
1. A database contains two kinds of information.
▪ What information is in a database?

2. A command to read or load the database.


▪ in Scheme you can use load("filename")
▪ in Prolog use consult('filename')

3. A query or goal to solve.


Ancestors
File: ancestors.pl

ancestor(X,Y) :- parent(X,Y).
ancestor(X,Y) :-
ancestor(X,Z), ancestor(Z,Y).
parent(X,Y) :- mother(X,Y).
parent(X,Y) :- father(X,Y).
father(bill, jill).
mother(jill, sam).
mother(jill, sally).
Query the Ancestors

?- consult('/pathname/ancestors.pl').

ancestor(bill,sam).
Yes
?- ancestor(bill,X).
X = jill ;
X = sam ;
ERROR: Out of local stack
?- ancestor(X,bob).
ERROR: Out of local stack
Understanding the Problem
❑You need to understand how Prolog finds a solution.

ancestor(X,Y) :- parent(X,Y).
ancestor(X,Y) :-
Depth-first search
ancestor(X,Z), ancestor(Z,Y). causes immediate
parent(X,Y) :- mother(X,Y). recursion
parent(X,Y) :- father(X,Y).
father(bill,jill).
mother(jill,sam).
father(bob,sam).
Factorial
File: factorial1.pl

factorial(0,1).
factorial(N,N*M) :- factorial(N-1,M).
❑ The factorial of 0 is 1.
❑ The factorial of N is N*M if the the factorial of N-1 is M

?- consult('/path/factorial1.pl').
?- factorial(0,X).
X = 1
Yes
?- factorial(1,Y).
ERROR: Out of global stack
Query Factorial

?- consult('/path/factorial1.pl').
?- factorial(2,2).
No
?- factorial(1,X).
ERROR: Out of global stack

Problem: Arithmetic is not performed automatically.

?- 2*3 = 6. ?- 6 is 2*3.
No Yes is(6,2*3).
?- 2*3 = 2*3. ?- 2*3 is 6.
Yes No
l-value = r-value ?
Arithmetic via Instantiation: is
❑"=" simply means comparison for identity.
factorial(N, 1) :- N=0.

❑"is" performs instantiation if the left side doesn't have a


value yet.
product(X,Y,Z) :- Z is X*Y.

■this rule can answer the query:


product(3,4,N).
Answer: N = 12.
■but it can't answer:
product(3,Y,12).
is does not mean assignment!
❑This always fails: N is N - 1.
% sumto(N, Total): compute Total = 1 + 2 + ... + N.
sumto(N, 0) :- N =< 0.
sumto(N, Total) :=
Total is Subtotal + N,
N is N-1, always fails
sumto(N, Subtotal).

?- sumto(0, Sum).
Sum = 0.
Yes
?- sumto(1, Sum).
No
is : how to fix?
❑How would you fix this problem?

% sumto(N, Total): compute Total = 1 + 2 + ... + N.


sumto(N, 0) :- N =< 0.
sumto(N, Total) :=

N1 is N-1, always fails


sumto(N1, Subtotal),
Total is Subtotal + N.

?= sumto(5, X).
Factorial revised
File: factorial2.pl

factorial(0,1).
factorial(N,P) :- N1 is N-1,
factorial(N1,M), P is M*N.

Meaning:
❑ The factorial of 0 is 1.
❑ factorial of N is P
if N1 = N-1
and factorial of N1 is M
and P is M*N.
Query Revised Factorial

?- consult('/path/factorial2.pl').
?- factorial(2,2).
Yes
?- factorial(5,X).
X = 120
Yes
but still has some problems...

?- factorial(5,X).
X = 120 ; request another solution

ERROR: Out of local stack


?- factorial(X,120).
Factorial revised again
File: factorial3.pl Makes the rules mutually exclusive.

factorial(0,1).
factorial(N,P) :- not(N=0), N1 is N-1,
factorial(N1,M), P is M*N.

?- factorial(5,X).
X = 120 ;
No
?-
Readability: one clause per line
factorial(0,1).
factorial(N,P) :- not(N=0), N1 is N-1,
factorial(N1,M), P is M*N.

factorial(0,1).
factorial(N,P) :- Better
not(N=0),
N1 is N-1,
factorial(N1,M),
P is M*N.
Finding a Path through a Graph
edge(a, b). a
edge(b, c).
edge(b, d). b
edge(d, e). edge(d, f).
path(X, X). c d
path(X, Y) :- edge(X, Z), path(Z, Y).
e f
?- edge(a, b).
Yes
?- path(a, a).
Yes
?- path(a, e).
Yes
?- path(e, a).
No
How To Define an Undirected Graph?
edge(a, b). a
edge(b, c).
edge(b, d). b
edge(d, e).
edge(d, f). c d
edge(X, Y) := not(X=Y), edge(Y, X).
path(X, X). e f
path(X, Y) :- edge(X, Z), path(Z, Y).

?- edge(b, a).
Yes
?- path(a, b).
Yes
?- path(b, e).
No
Queries and Answers
❑When you issue a query in Prolog, what are the
possible responses from Prolog?
% Suppose "likes" is already in the database
:- likes(jomzaap, 219212). % Programming Languages.
Yes.
:- likes(papon, 403111). % Chemistry.
No.
:- likes(Who, 204219). % Theory of Computing?
Who = pattarin

❑Does this mean Papon doesn't like Chemistry?


Closed World Assumption
❑What is the Closed World Assumption?

❑How does this affect the interpretation of results from


Prolog?
List Processing
❑[Head | Tail] works like "car" and "cdr" in Scheme.
❑Example:
?- [H | T ] = [a,b,c,d,e].
returns:
H = a
T = [b,c,d,e]

❑This can be used to build lists and decompose lists.


❑Can use [H|T] on the left side to de/construct a list:
path(X, Y, [X|P]) :-
edge(X, Node),
path(Node, Y, P).
member Predicate
❑Test whether something is a member of a list
?- member(a, [b,c,d]).
No.

❑can be used to have Prolog try all values of a list as


values of a variable.
?- member(X, [a1,b2,c3,d4] ).
X = a1
X = b2
X = c3
member Predicate example
❑Use member to try all values of a list.
❑Useful for problems like
■Queen safety
■enumerating possible rows and columns in a game.

% dumb function to find square root of 9


squareroot9(N) :-
member(N,[1,2,3,4,5,5,6,7,8,9]),
9 is N*N.
appending Lists
?- append([a,b],[c,d,e],L).
L = [a,b,c,d,e]

?- append([],[a,b,c],L).
L = [a,b,c]

❑append can resolve other parameters, too:


?- append(X, [b,c,d], [a,b,c,d] ).
X = a
Defining your own 'append'
append([], List, List).
append([Head|Tail], X, [Head|NewTail]) :-
append(Tail, X, NewTail).
Type Determination
❑Prolog is a weakly typed language.
❑It provides propositions for testing the type of a variable
PREDICATE SATISFIED (TRUE) IF
var(X) X is a variable
nonvar(X) X is not a variable
atom(A) A is an atom
integer(K) K is an integer
real(R) R is a floating point number
number(N) N is an integer or real
atomic(A) A is an atom or a number or a string
functor(T,F,A) T is a term with functor F, arity A
T =..L T is a term, L is a list.
clause(H,T) H :- T is a rule in the program
Tracing the Solution
?- trace.
[trace] ?- path(a,d).
Call: (8) path(a, d) ? creep
Call: (9) edge(a, _L169) ? creep
Exit: (9) edge(a, b) ? creep
Call: (9) path(b, d) ? creep
Call: (10) edge(b, _L204) ? creep
Exit: (10) edge(b, c) ? creep
Call: (10) path(c, d) ? creep
Call: (11) edge(c, _L239) ? creep
^ Call: (12) not(c=_G471) ? creep
^ Fail: (12) not(c=_G471) ? creep
Fail: (11) edge(c, _L239) ? creep
Fail: (10) path(c, d) ? creep
Redo: (10) edge(b, _L204) ? creep
Solution Process
(1) path(X,X).
(2) path(X,Y) := edge(X,Z), path(Z,Y).
?- path(a,c).

Stack Substitution (Instantiation)


[path(a,c), path(X,X)]
[path(a,c), path(a,a)] X = a
Undo.
[path(a,c), path(X,X)]
[path(a,c), path(c,c)] X = c
Undo.
Solution Process (2)
(1) path(X,X).
(2) path(X,Y) := edge(X,Z), path(Z,Y).
?- path(a,c).

Stack Substitution (Instantiation)


[path(a,c), path(X,Y)] (Rule 2)
[path(a,c), path(a,Y)] X = a
X = a, Y = c
edge(a,Z), path(Z,c) new subgoals
edge(a,b), path(b,c) X = a, Y = c, Z = b
path(b,c) edge(a,b) is a fact - pop it.
What does this do?

% what does this do?


sub([], List).
sub([H|T], List) :-
member(H, List),
sub(T, List).
What does this do?
Underscore (_) means "don't care".
It accepts any value.
% what does this do?
foo([], _, []).
foo([H|T], List, [H|P]) :-
member(H, List),
foo(T, List, P).
foo([H|T], List, P) :-
not( member(H, List) ),
foo(T, List, P).
Max Function
❑Write a Prolog program to find the max of a list of
numbers:
■max( List, X).
■max( [3, 5, 8, -4, 6], X).
X = 8.
❑Strategy:
■use recursion
■divide the list into a Head and Tail.
■compare X to Head and Tail. Two cases:
■Head = max( Tail ). in this case answer is X is Head.
■X = max( Tail ) and Head < X.
■what is the base case?
Max Function

% max(List, X) : X is max of List members


max([X], X). base case
max([H|Tail], H) :- 1st element is max
max(Tail, X),
H >= X.
max([H|Tail], X) :- 1st element not max
complete this
case.
Towers of Hanoi
% Move one disk
move(1,From,To,_) :-
write('Move top disk from '),
write(From),
write(' to '), See tutorials at:
write(To),
www.csupomona.edu and
nl.
www.cse.ucsc.edu
% Move more than one disk.
move(N,From,To,Other) :-
N>1,
M is N-1,
move(M,From,Other,To),
move(1,From,To,_),
move(M,Other,To,From).
Learning Prolog
❑The Textbook - good explanation of concepts
❑Tutorials:
■http://www.thefreecountry.com/documentation/onlineprolog.sht
ml has annotated links to tutorials.
■http://www.cse.ucsc.edu/classes/cmps112/Spring03/language
s/prolog/PrologIntro.pdf last section explains how Prolog
resolves queries using a stack and list of substitutions.
■http://cs.wwc.edu/~cs_dept/KU/PR/Prolog.html explains
Prolog syntax and semantics.
■http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/conte
nts.html has many examples

You might also like