Prolog 7 - Concepts
Download
Report
Transcript Prolog 7 - Concepts
Prolog Concepts
A declarative language
Most programming languages are imperative—you tell the
computer what to do to solve a problem
Prolog is declarative—you give it the data it needs, and it solves the
problem for you
Consider:
append([], List, List).
append([Head | Tail], List, [Head | More]) :append(Tail, List, More).
This defines what it means append lists
You can use it to append two lists
You can use it to find what to append to a list to get another list
You can use it to find what list to append to to get another list
You can test whether the relation holds between three lists
2
append examples I
3 ?- append([a, b], [c, d], X).
X = [a, b, c, d].
4 ?- append([a, b], X, [a, b, c]).
X = [c].
5 ?- append(X, [c, d], [a, b, c, d]).
X = [a, b]
false.
2
append examples I
6 ?- append(X, Y, [a, b, c]).
X = [], Y = [a, b, c]
X = [a], Y = [b, c]
X = [a, b], Y = [c]
X = [a, b, c], Y = []
false.
7 ?- append([a, b], X, Y).
Y = [a, b|X].
8 ?- append(X, [a, b, c], Y).
X = [], Y = [a, b, c]
X = [_G1989], Y = [_G1989, a, b, c]
X = [_G1989, _G1995], Y = [_G1989, _G1995, a,
b, c]
2
A constraint satisfaction language
Prolog is also one of a number of constraint satisfaction
languages
You tell it the constraints on a problem (e.g. the solution must
be someone who is both female and rich), and it finds a solution
that satisfies those constraints
A “logic puzzle” is nothing more than a set of constraints
(e.g. every man has a different tie)
3
A homoiconic language
Prolog is homoiconic—that is, there is no distinction
between “statements” in the language and the “data”
that the languages processes
When you provide “input” to a Prolog program (e.g. for
an adventure game), you use the same syntax as when
you write the program
We haven’t emphasized homoiconicity in Prolog,
because it is more important in some of the other
languages we will be studying
4
Prolog does backtracking
You don’t have to implement backtracking in Prolog; the
language does it for you
The only other “language” I know of that does this is Regular
Expressions, which are a “sublanguage” of most modern
programming languages
loves(chuck, X)
call
fail
female(X)
rich(X)
exit
redo
5
Prolog uses unification
The basic rules of unification are:
Any value can be unified with itself
A variable can be unified with another variable
A variable can be unified with any value
Two different structures can be unified if their constituents can
be unified
Lists are a particularly important kind of structure
A variable can be unified with a structure containing that same
variable
Unification is reflexive, symmetric, and transitive
6
Unification and pattern matching
Parameter transmission is by unification, not assignment
member(H, [H | T]).
member(H, [_ | T]) :- member(H, T).
Thus, parameters are not restricted to simple variables
Note also the use of the “don’t care” variable, _
Many other languages use pattern matching, which is like
unification, but may be asymmetric:
value match { pattern1 => code1; pattern2 => code2; … }
7
Lists
Lists, not arrays, are the fundamental data structures in
Prolog and nearly all functional languages
Non-empty lists consist of a head (the first element in the list)
and a tail (a list of the remaining elements)
Although the syntax may differ, this way of treating a list is
common among functional languages
8
Predicates as functions
Prolog has no functions, so it cannot be a functional language
But we can do something similar with predicates
map(_, [], []).
map(P, [H|T], [H2|T2]) :- call(P, H, H2), map(P, T, T2).
filter(_, [], []).
filter(P, [H|T], [H|T2]) :- call(P, H), filter(P, T, T2).
filter(P, [_|T], L) :- filter(P, T, L).
twice(X, Y) :- Y is 2 * X.
even(X) :- X mod 2 =:= 0.
31 ?- map(twice, [1, 2, 3], X).
X = [2, 4, 6] .
32 ?- filter(even, [1, 2, 3, 4], X).
X = [2, 4]
8
Prolog is a theorem prover
Prolog is an implementation of resolution theorem
proving in a programming language
Because it is based on logic, there is very little that is ad
hoc or arbitrary about Prolog
9
Resolution
A clause is a disjunction (“or”) of zero or more literals, some or all of which
may be negated
sinks(X) dissolves(X, water) ¬denser(X, water)
Any expression in the predicate calculus can be put into clause form
X Y can be rewritten as X Y
Conjunctions (“ands”) can be rewritten as separate clauses
The existential quantifier can be replaced by a Skolem function
If the existential quantifier is under control of a universal quantifier, replace it with a
function of the universally quantified variable
Otherwise, just replace with a constant (whose value need not be known)
Universal quantifiers, , can be dropped
Here is the resolution principle:
X someLiterals
X someOtherLiterals
---------------------------------------------conclude: someLiterals someOtherLiterals
Clauses are closed under resolution
From
and
10
The End
11