Transcript X - Piazza
Chapter 15
Functional Programming Languages
Chapter 15 Topics
Introduction
Mathematical Functions
Fundamentals of Functional Programming Languages
The First Functional Programming Language: LISP
Introduction to Scheme
COMMON LISP
ML
Haskell
Applications of Functional Languages
Comparison of Functional and Imperative Languages
2
Introduction
The design of the imperative languages is
based directly on the von Neumann
architecture
Efficiency is the primary concern, rather than the
suitability of the language for software
development
3
Introduction
The design of the functional languages is
based on mathematical functions
Based on theoretical basis mostly, but relatively
unconcerned with the architecture of the
machines on which programs will run
4
Lambda Expression
Lambda calculus is developed by Church 1941
Square function
is equivalent to lambda expressions (x) x * x
Application , (( (x) x * x)2) evaluates to 4.
5
Lambda Expression
According to Church, Lambda calculus (recursive
definition):
Any identifier is lambda expression Function application
If M and N are lambda expression, Application of M to
N, written MN is also lambda expression
Function abstraction M with parameter x
An abstraction , x. M, where M is lambda expression,
x is an identifier, is also lambda expression.
6
Lambda Expression
BNF Grammar rules for lambda calculus:
Example of lambda expression:
Parameter, body
Function application (MN)
7
Lambda Expression
In lambda expression x.M : x identifier is said
to be bound in M . Any identifier NOT bound in
M is said to be free.
Bound variable is a place holder. They can be
renamed consistently with ANY FREE variable.
Definition of free variable is
8
Lambda Expression
Replace x with N
substitution of an expression N for a variable x in
M, written as M[N/x] is defined as:
1.
2.
If free variables of N have NO bound occurrences in M,
then M[N/x] is formed by replacing all free occurrences
of x in M by N.
Otherwise, assume that y is free in N and bound in M.
Consistently, replace the binding and corresponding bound
occurrences of y in M by a new variable u. Repeat this
renaming of bound variables in M until the condition in 1 is
satisfied. Then proceed in Step 1.
เปลี่ยนชื่อ y in M เป็ นตัวแปรใหม่ u ก่อน
9
Lambda Expression
Examples
เปลี่ยน x เป็ น y
เปลี่ยน y เป็ น x
-rename x ที่มีอยู่ (x เป็ น bound ให้ เปลี่ยนเป็ น u ก่อน)
-จากนั ้นเป็ น y ที่มีเป็ น x ซึง่ ไม่พบ y
10
Lambda Expression
Meaning of lambda expression:
Apply N to M
-แทนค่า x ด้ วย N
(ส่ง N เป็ น parameter แทน x)
Evaluation of lambda expression is a derivation
sequence
Example of evaluation
Or we can evaluate from inner most
((y.((x.xyz)a))b) ((y.ayz )b) (abz )
Referential transparency
11
Mathematical Functions
Def: A mathematical function is a mapping
of members of one set, called the domain set,
to another set, called the range set
12
Mathematical Functions
Lambda expressions describe nameless functions
Lambda expressions are applied to parameter(s) by
placing the parameter(s) after the expression
e.g. ((x) x * x * x)(3)
which evaluates to 27
Just like the application of function….
13
Mathematical Functions
Functional Forms
Def: A higher-order function, or functional form,
is one that either takes functions as parameters or
yields a function as its result, or both
14
Functional Forms
1. Function Composition
A functional form that takes two functions as
parameters and yields a function whose value is
the first actual parameter function applied to the
application of the second
Form: h f ° g
which means h (x) f ( g ( x))
For f (x) x * x * x and g (x) x + 3,
h f ° g yields (x + 3)* (x + 3)* (x + 3)
15
Functional Forms
2. Construction
A functional form that takes a list of functions as
parameters and yields a list of the results of
applying each of its parameter functions to a
given parameter
Apply each parameter to each function
Form: [f, g]
For f (x) x * x * x and g (x) x + 3,
[f, g] (4) yields (64, 7)
f(4)
g(4)
16
Functional Forms
3. Apply-to-all
A functional form that takes a single function as
a parameter and yields a list of values obtained
by applying the given function to each element
of a list of parameters
Form:
For h (x) x * x * x
( h, (3, 2, 4)) yields (27, 8, 64)
h(3) h(2) h(4)
17
Fundamentals of Functional
Programming Languages
The objective of the design of a FPL is to mimic
mathematical functions to the greatest extent
possible
The basic process of computation is fundamentally
different from that of an imperative language
In an imperative language, operations are done and the
results are stored in variables for later use
Management of variables is a constant concern and
source of complexity for imperative programming
In an FPL, variables are not necessary, as is the
case in mathematics
18
Fundamentals of Functional
Programming Languages
In an FPL, the evaluation of a function
always produces the same result given the
same parameters
This is called referential transparency
Right-to-left/Left to Right DOESN’T matter
since no concept of variable
19
LISP
Data object types: originally only atoms and
lists
List form: parenthesized collections of
sublists and/or atoms
e.g., (A B (C D) E)
Originally, LISP was a typeless language
LISP lists are stored internally as singlelinked lists
20
LISP
Lambda notation is used to specify functions and function
definitions. Function applications and data have the same
form.
e.g., the list --- (A B C) can mean
list containing of three atoms, A, B, and C
function application, meaning applying two parameters B,C to
function A
The first LISP interpreter appeared only as a demonstration
of the universality of the computational capabilities of the
notation
21
Introduction to Scheme
A mid-1970s dialect of LISP, designed to be
a cleaner, more modern, and simpler version
than the contemporary dialects of LISP
Uses only static scoping
Functions are first-class entities
They can be the values of expressions and
elements of lists
They can be assigned to variables and passed as
parameters
22
Introduction to Scheme
Primitive Functions
1. Arithmetic: +, -, *, /, ABS,
SQRT, REMAINDER, MIN, MAX
e.g., (+ 5 2) yields 7
23
Introduction to Scheme
2. QUOTE -takes one parameter; returns the
parameter without evaluation
Normally, scheme interpreter, EVAL,
evaluates parameters. QUOTE is used to
avoid parameter evaluation when it is not
appropriate
QUOTE can be abbreviated with the apostrophe
prefix operator
e.g., '(A B) is equivalent to (QUOTE (A B))
24
Introduction to Scheme
3. CAR takes a list parameter; returns the first
element of that list
e.g., (CAR '(A B C)) yields A
(CAR '((A B) C D)) yields (A B)
4. CDR takes a list parameter; returns the list
after removing its first element
e.g., (CDR '(A B C)) yields (B C)
(CDR '((A B) C D)) yields (C D)
25
Introduction to Scheme
5. CONS takes two parameters, the first of
which can be either an atom or a list and the
second of which is a list; returns a new list
that includes the first parameter as its first
element and the second parameter as the
remainder of its result
e.g., (CONS 'A '(B C)) returns (A B C)
26
Introduction to Scheme
6. LIST - takes any number of parameters;
returns a list with the parameters as elements
27
Introduction to Scheme
Lambda Expressions
Form is based on notation
e.g., (LAMBDA (L) (CAR (CAR L)))
L is called a bound variable
Lambda expressions can be applied
e.g.,
((LAMBDA (L) (CAR (CAR L))) '((A B)
C D))
28
Introduction to Scheme
A Function for Constructing Functions
DEFINE - Two forms:
1. To bind a symbol to an expression
e.g.,
(DEFINE pi 3.141593)
(DEFINE two_pi (* 2 pi))
29
Introduction to Scheme
2. To bind names to lambda expressions
e.g.,
(DEFINE (cube x) (* x x x))
Example use:
(cube 4)
30
Introduction to Scheme
Steps of evaluation process (for normal
functions):
1. Parameters are evaluated, in no particular order**
2. The values of the parameters are substituted into
the function body
3. The function body is evaluated
4. The value of the last expression in the body is the
value of the function
31
Introduction to Scheme
Examples:
(DEFINE (square x) (* x x))
(DEFINE (hypotenuse side1
side1)
(SQRT (+ (square side1)
(square side2)))
)
32
Introduction to Scheme
Predicate Functions: (#T is true and ()is false)
1. EQ? takes two symbolic parameters; it returns #T if
both parameters are atoms and the two are the same
e.g., (EQ? 'A 'A) yields #T
(EQ? 'A '(A B)) yields ()
Note that if EQ? is called with list parameters, the
result is not reliable
Also, EQ? does not work for numeric atoms
Find out: How many equal functions does it have?
33
Introduction to Scheme
Predicate Functions:
2. LIST? takes one parameter; it returns #T if
the parameter is a list; otherwise()
3. NULL? takes one parameter; it returns #T if
the parameter is the empty list; otherwise()
Note that NULL? returns #T if the parameter is()
4. Numeric Predicate Functions
=, <>, >, <, >=, <=, EVEN?,
ODD?, ZERO?, NEGATIVE?
34
Introduction to Scheme
Output Utility Functions:
(DISPLAY expression)
(NEWLINE)
35
Introduction to Scheme
Control Flow
1. Selection- the special form, IF
(IF predicate then_exp else_exp)
e.g.,
(IF (<> count 0)
(/ sum count)
0
)
36
Introduction to Scheme
Control Flow
2. Multiple Selection - the special form, COND
General form:
(COND
(predicate_1 expr {expr})
(predicate_1 expr {expr})
...
(predicate_1 expr {expr})
(ELSE expr {expr})
)
Returns the value of the last expr in the first
pair whose predicate evaluates to true
37
Example of COND
(DEFINE (compare x y)
(COND
((> x y) (DISPLAY “x is greater than y”))
((< x y) (DISPLAY “y is greater than x”))
(ELSE (DISPLAY “x and y are equal”))
)
)
38
Example Scheme Functions
1. member - takes an atom and a simple list; returns
#T if the atom is in the list; () otherwise
(DEFINE (member atm lis)
(COND
((NULL? lis) '())
((EQ? atm (CAR lis)) #T)
((ELSE (member atm (CDR lis)))
))
39
Example Scheme Functions
2. equalsimp - takes two simple lists as parameters; returns #T if
the two simple lists are equal; () otherwise
(DEFINE (equalsimp lis1 lis2)
(COND
((NULL? lis1) (NULL? lis2))
((NULL? lis2) '())
((EQ? (CAR lis1) (CAR lis2))
(equalsimp(CDR lis1)(CDR lis2)))
(ELSE '())
))
40
Example Scheme Functions
3. equal - takes two general lists as parameters; returns #T if the
two lists are equal; ()otherwise
(DEFINE (equal lis1 lis2)
(COND
((NOT (LIST? lis1))(EQ? lis1 lis2))
((NOT (LIST? lis2)) '())
((NULL? lis1) (NULL? lis2))
((NULL? lis2) '())
((equal (CAR lis1) (CAR lis2))
(equal (CDR lis1) (CDR lis2)))
(ELSE '())
))
41
Example Scheme Functions
4. append - takes two lists as parameters; returns the first
parameter list with the elements of the second parameter list
appended at the end
(DEFINE (append lis1 lis2)
(COND
((NULL? lis1) lis2)
(ELSE (CONS (CAR lis1)
(append (CDR lis1) lis2)))
))
42
Introduction to Scheme
The LET function
General form:
(LET (
(name_1 expression_1)
(name_2 expression_2)
...
(name_n expression_n))
body
)
Semantics: Evaluate all expressions, then bind the values to the names; evaluate
the body
43
Introduction to Scheme
(DEFINE (quadratic_roots a b c)
(LET (
(root_part_over_2a
(/ (SQRT (- (* b b) (* 4 a c)))
(* 2 a)))
(minus_b_over_2a (/ (- 0 b) (* 2 a)))
(DISPLAY (+ minus_b_over_2a
root_part_over_2a))
(NEWLINE)
(DISPLAY (- minus_b_over_2a
root_part_over_2a))
))
44
Introduction to Scheme
Functional Forms
1. Composition
- The previous examples have used it
2. Apply to All - one form in Scheme is mapcar
- Applies the given function to all elements of the given list;
result is a list of the results
(DEFINE (mapcar fun lis)
(COND
((NULL? lis) '())
(ELSE (CONS (fun (CAR lis))
(mapcar fun (CDR lis))))
))
45
Introduction to Scheme
It is possible in Scheme to define a function that builds
Scheme code and requests its interpretation
This is possible because the interpreter is a user-available
function, EVAL
e.g., suppose we have a list of numbers that must be added
together
(DEFINE (adder lis)
(COND
((NULL? lis) 0)
(ELSE (+ (CAR lis)
(adder(CDR lis ))))
))
46
Adding a List of Numbers
((DEFINE (adder lis)
(COND
((NULL? lis) 0)
(ELSE (EVAL (CONS '+ lis)))
))
The parameter is a list of numbers to be added; adder
inserts a + operator and interprets the resulting list
47
Introduction to Scheme
Scheme includes some imperative features:
1. SET! binds or rebinds a value to a name
2. SET-CAR! replaces the car of a list
3. SET-CDR! replaces the cdr part of a list
48
COMMON LISP
A combination of many of the features of the
popular dialects of LISP around in the early
1980s
A large and complex language--the opposite of
Scheme
49
COMMON LISP
Includes:
records
arrays
complex numbers
character strings
powerful I/O capabilities
packages with access control
imperative features like those of Scheme
iterative control statements
50
COMMON LISP
Example (iterative set membership, member)
(DEFUN iterative_member (atm lst)
(PROG ()
loop_1
(COND
((NULL lst) (RETURN NIL))
((EQUAL atm (CAR lst))(RETURN T))
)
(SETQ lst (CDR lst))
(GO loop_1)
))
51
ML
A static-scoped functional language with syntax
that is closer to Pascal than to LISP
Uses type declarations, but also does type
inferencing to determine the types of undeclared
variables (will see in Chapter 5)
It is strongly typed (whereas Scheme is essentially
typeless) and has no type coercions
Includes exception handling and a module facility
for implementing abstract data types
52
ML
Includes lists and list operations
The val statement binds a name to a value
(similar to DEFINE in Scheme)
Function declaration form:
fun function_name (formal_parameters) =
function_body_expression;
e.g.,
fun cube (x : int) = x * x * x; 53
Haskell
Similar to ML (syntax, static scoped, strongly
typed, type inferencing)
Different from ML (and most other functional
languages) in that it is purely functional (e.g., no
variables, no assignment statements, and no side
effects of any kind)
54
Haskell
Most Important Features
Uses lazy evaluation (evaluate no subexpression
until the value is needed)
Has list comprehensions, which allow it to deal
with infinite lists
55
Haskell Examples
1. Fibonacci numbers (illustrates function
definitions with different parameter forms)
fib 0 = 1
fib 1 = 1
fib (n + 2) = fib (n + 1)
+ fib n
56
Haskell Examples
2. Factorial (illustrates guards)
fact n
| n == 0 = 1
| n > 0 = n * fact (n - 1)
The special word otherwise can appear as
a guard
57
Haskell Examples
3. List operations
List notation: Put elements in brackets
e.g., directions = [“north”,
“south”, “east”, “west”]
Size of list
Length: #
e.g., #directions is 4
Arithmetic series with the .. operator
e.g., [2, 4..10] is [2, 4, 6, 8, 10]
58
Haskell Examples
3. List operations (cont)
Catenation is with ++
e.g., [1, 3] ++ [5, 7] results in
[1, 3, 5, 7]
CONS, CAR, CDR via the colon operator (as in
Prolog) CONS
e.g., 1:[3, 5, 7] results in
[1, 3, 5, 7]
59
Haskell Examples
product of empty list = 1
product [] = 1
product (a:x) = a * product x
Tail part of list
x is a list
product(a..x) = a * product(x)
fact n = product [1..n]
product of a*..*x
fact(n) = product (1..n)
60
Haskell Examples
4. List comprehensions: set notation
e.g., [n * n | n ← [1..20]]
computes the square of 1, the square of 2,…the
square of 20
factors n = [i | i ← [1..n div 2],
n mod i == 0] for i=1 to n/2
compute (return n mod i
This function computes all of the factors of its given
parameter
61
Haskell Examples
Quicksort:
Sort of empty list = empty
sort [] = []
sort (a:x) = sort [b | b ← x; b
<= a]
Sort of list [a..x] is
sort for all element b’s that is <= a
++ [a] ++
a is pivot
sort [b | b ← x; b > a]
sort for all element b’s that is > a
62
Haskell Examples
5. Lazy evaluation
e.g.,
Positive number starts from 0
positives = [0..] Squares is list of [02 12 22…]
squares = [n * n | n ← [0..]]
(only compute those that are necessary)
e.g., member squares 16
would return True
16 is a member of squares or not
63
Haskell Examples
The member function could be written as:
is not a member of empty list
member [] b = False breturn
false
member(a:x) b=(a == b)||member x b
B is member of (a..x) or not
-return
if a==b or
member x b --make recursive all
squares = [n * n | n ← [0..]]
(only compute those that are necessary)
e.g., member squares 16
would return True
64
Haskell Examples
squares = [n * n | n ← [0..]]
(only compute those that are necessary)
e.g., member squares 16
However, this would only work if the parameter to
squares was a perfect square; if not, it will keep
generating them forever (due to lazy evaluation).
The following version will always work:
member2 (m:x) n
If m < n
| m < n= member2 x n
| m == n
= True
If m equals to n, will return true.
| otherwise = False If m < n, will make a recursive ca
Otherwise will return false.
65
Applications of Functional
Languages
APL is used for throw-away programs
LISP is used for artificial intelligence
Knowledge representation
Machine learning
Natural language processing
Modeling of speech and vision
Scheme is used to teach introductory
programming at a significant number of
universities
66
Comparing Functional and
Imperative Languages
Imperative Languages:
Efficient execution
Complex semantics
Complex syntax
Concurrency is programmer designed
Functional Languages:
Simple semantics
Simple syntax
Inefficient execution
Programs can automatically be made concurrent
67
Chapter 16
Logic Programming Languages
Chapter 16 Topics
Introduction
A Brief Introduction to Predicate Calculus
Predicate Calculus and Proving Theorems
An Overview of Logic Programming
The Origins of Prolog
The Basic Elements of Prolog
Deficiencies of Prolog
Applications of Logic Programming
Introduction
Logic programming language or declarative
programming language
Express programs in a form of symbolic logic
Use a logical inferencing process to produce results
Declarative rather that procedural:
only specification of results are stated (not detailed
procedures for producing them)
Introduction to Predicate
Calculus
Proposition: a logical statement that may or
may not be true
Consists of objects and relationships of objects
to each other
Introduction to Predicate
Calculus
Symbolic logic can be used for the basic
needs of formal logic:
express propositions
express relationships between propositions
describe how new propositions can be
inferred from other propositions
Predicate calculus is a particular form of
symbolic logic used for logic
programming.
Propositions
Objects in propositions are represented by
simple terms: either constants or variables
Constant: a symbol that represents an object
Variable: a symbol that can represent different
objects at different times
different from variables in imperative languages
Propositions
Atomic propositions consist of compound
terms
Compound term: one element of a
mathematical relation, written like a
mathematical function
Mathematical function is a mapping
Can be written as a table
Propositions
Compound term composed of two parts
Functor: function symbol that names the relationship
Ordered list of parameters (tuple)
Examples:
Functor(order list of parameters)
student(jon)
like(seth, OSX)
like(nick, windows)
like(jim, linux)
Propositions
Propositions can be stated in two forms:
Fact: proposition is assumed to be true
Query: truth of proposition is to be determined
Compound proposition:
Have two or more atomic propositions
Propositions are connected by operators
Logical Operators
Name
Symbol
Example
Meaning
negation
a
not a
conjunction
ab
a and b
disjunction
ab
a or b
equivalence
ab
implication
ab
ab
a is equivalent to
b
a implies b
b implies a
Quantifiers
Name
Example
Meaning
universal
∀X.P
For all X, P is true
existential
∃X.P
There exists a value of X
such that P is true
Clausal Form
Too many ways to state the same thing
Use a standard form for propositions
Clausal form:
Anticedent
Consequence
B1 B2 … Bn A1 A2 … Am
means if all the As are true, then at least one B
is true
Antecedent: right side
Consequent: left side
Predicate Calculus and Proving
Theorems
A use of propositions is to discover new theorems
that can be inferred from known axioms and
theorems
Resolution: an inference principle that allows
inferred propositions to be computed from given
propositions
Resolution
หาคำตอบให้ ตวั แปรใน proposition
Unification: finding values for variables in
propositions that allows matching process to
succeed
กาหนดค่าให้ ตวั แปรใน proposition เพื่อทดสอบว่าใช่คาตอบหรื อไม่
Instantiation: assigning temporary values to
variables to allow unification to succeed
After instantiating a variable with a value, if
matching fails, may need to backtrack and
instantiate with a different value
Theorem Proving
Use proof by contradiction
Hypotheses: a set of pertinent propositions
Goal: negation of theorem stated as a
proposition
Theorem is proved by finding an
inconsistency
Theorem Proving
Basis for logic programming
When propositions used for resolution, only
restricted form can be used
Horn clause - can have only two forms Prolog
:single consequence
Headed: single atomic proposition on left side
Headless: empty left side (used to state facts)
Most propositions can be stated as Horn clauses
Overview of Logic
Programming
Declarative semantics
There is a simple way to determine the meaning of
each statement
Simpler than the semantics of imperative languages
Programming is nonprocedural
Programs do not state now a result is to be
computed, but rather the form of the result
Example: Sorting a List
Describe the characteristics of a sorted list,
not the process of rearranging a list
consequence
Antecedents
sort(old_list, new_list) permute (old_list, new_list)
sorted (new_list)
sorted (list) ∀j such that 1 j < n, list(j) list (j+1)
The Origins of Prolog
University of Aix-Marseille
Natural language processing
University of Edinburgh
Automated theorem proving
The Basic Elements of Prolog
Edinburgh Syntax
Term: a constant, variable, or structure
Constant: an atom or an integer
Atom: symbolic value of Prolog
Atom consists of either:
a string of letters, digits, and underscores beginning with a
lowercase letter
a string of printable ASCII characters delimited by
apostrophes
The Basic Elements of Prolog
Variable: any string of letters, digits, and
underscores beginning with an uppercase letter
Instantiation: binding of a variable to a value
Lasts only as long as it takes to satisfy one complete
goal
Structure: represents atomic proposition
functor(parameter list)
Fact Statements
Used for the hypotheses
Headless Horn clauses
student(jonathan).
sophomore(ben).
brother(tyler, cj).
มีแต่ consequence
Rule Statements
Used for the hypotheses
Headed Horn clause
Right side: antecedent (if part)
May be single term or conjunction
Left side: consequent (then part)
Must be single term
Conjunction: multiple terms separated by
logical AND operations (implied)
16-90
Rule Statements
parent(kim,kathy):- mother(kim,kathy).
Can use variables (universal objects) to
generalize meaning:
parent(X,Y):- mother(X,Y).
sibling(X,Y):- mother(M,X),
mother(M,Y),
father(F,X),
father(F,Y).
Goal Statements
For theorem proving, theorem is in form of
proposition that we want system to prove or
disprove – goal statement
Same format as headless Horn
student(james)
Conjunctive propositions and propositions with
variables also legal goals
father(X,joe)
สาหรับ query
Inferencing Process of Prolog
Queries are called goals
If a goal is a compound proposition, each of the facts is a
subgoal
To prove a goal is true, must find a chain of inference rules
and/or facts. For goal Q:
B :- A
C :- B
…
Q :- P
Eg. Forward chaining
Process of proving a subgoal called matching, satisfying, or
resolution
Inferencing Process
Bottom-up resolution, forward chaining
Begin with facts and rules of database and attempt to find sequence that
leads to goal
works well with a large set of possibly correct answers
Top-down resolution, backward chaining
begin with goal and attempt to find sequence that leads to set of facts in
database
works well with a small set of possibly correct answers
Prolog implementations use backward chaining
Inferencing Process
When goal has more than one subgoal, can use
either
Depth-first search: find a complete proof for the first
subgoal before working on others
Breadth-first search: work on all subgoals in parallel
Prolog uses depth-first search
Can be done with fewer computer resources
Inferencing Process
With a goal with multiple subgoals, if fail to
show truth of one of subgoals, reconsider
previous subgoal to find an alternative solution:
backtracking
Begin search where previous search left off
Can take lots of time and space because may
find all possible proofs to every subgoal
Simple Arithmetic
Prolog supports integer variables and integer
arithmetic
is operator: takes an arithmetic expression as
right operand and variable as left operand
A is B / 10 + C
Not the same as an assignment statement!
Example
speed(ford,100).
speed(chevy,105).
speed(dodge,95).
speed(volvo,80).
time(ford,20).
time(chevy,21).
time(dodge,24).
time(volvo,24).
distance(X,Y) :- speed(X,Speed),
time(X,Time),
Y is Speed * Time.
Trace
Built-in structure that displays instantiations at
each step
Tracing model of execution - four events:
Call (beginning of attempt to satisfy goal)
Exit (when a goal has been satisfied)
Redo (when backtrack occurs)
Fail (when goal fails)
Example
likes(jake,chocolate).
likes(jake,apricots).
likes(darcie,licorice).
likes(darcie,apricots).
trace.
likes(jake,X),
likes(darcie,X).
List Structures
Other basic data structure (besides atomic
propositions we have already seen): list
List is a sequence of any number of elements
Elements can be atoms, atomic propositions, or
other terms (including other lists)
[apple, prune, grape, kumquat]
[]
(empty list)
[X | Y]
(head X and tail Y)
Example
Definition of append function:
append([], List, List).
append([Head | List_1], List_2, [Head |
List_3]) :append (List_1, List_2, List_3).
Example
Definition of reverse function:
reverse([], []).
reverse([Head | Tail], List) :reverse (Tail, Result),
append (Result, [Head], List).
Deficiencies of Prolog
Resolution order control
The closed-world assumption
The negation problem
Intrinsic limitations
Applications of Logic
Programming
Relational database management systems
Expert systems
Natural language processing
Education
Conclusions
Advantages:
Prolog programs based on logic, so likely to be more
logically organized and written
Processing is naturally parallel, so Prolog interpreters
can take advantage of multi-processor machines
Programs are concise, so development time is
decreased – good for prototyping
Readings and Testing about Prolog
• http://www.doc.gold.ac.uk/~mas02g
w/prolog_tutorial/prologpages/
• http://www.gprolog.org/manual/gpr
olog.html
Intro to Logic Programming by Prolog
Prepared by
Manuel E. Bermúdez, Ph.D.
Associate Professor
University of Florida
Logic Programming
Fundamentals
Horn clauses:
General form:
H B1, B2, ... Bn
Meaning: if B1, B2, ... Bn are true,
then H is true.
Deductive reasoning:
C A,B
DC
D A,B
Resolution
Process of deriving new statements, combining
old ones, cancelling like terms, etc.
Variables may acquire values through
unification. More later.
Example:
fun(X) sunny(X)
sunny(Florida)
fun(Florida)
Prolog Fundamentals
All Prolog programs built from terms:
Programs
The data manipulated by programs
Three types of terms:
Constants: integers, real numbers, atoms.
Variables.
Compound terms.
Prolog Fundamentals (cont’d)
Constants: Integers, e.g. 123;
Reals, e.g.: 1.23
Atoms:
Lexically, a lowercase letter followed by any
number of additional letters, digits or
underscores, e.g. foobar, 'Hello'.
Atoms do look like variables in other languages,
but foobar is not a variable; it has no binding,
it is a unique value.
An atom can also be sequence of punctuation
characters: *, ., =, @#$
Prolog Fundamentals (cont’d)
Variables: begin with an upper-case letter,
e.g. X, My_var.
Can be instantiated (take on a value) at run
time.
Variables can start with an underscore, and
get special treatment.
Prolog Fundamentals (cont’d)
A compound term, or structure, consists of an
atom called a functor, and a list of arguments,
e.g. sunny(florida), weird(prolog),
related(jim, john).
No space allowed
A compound term may look like a function call,
but it isn’t. It is structured data, or logical facts.
Syntax for Terms
<term> ::= <constant>|<variable>|<compound-term>
<constant> ::= <integer> | <real number> | <atom>
<compound-term> ::= <atom> ( <termlist> )
<termlist> ::= <term> | <term> , <termlist>
Even an arithmetic expression, usually
written as 1+2, is just an abbreviation
for +(1,2).
The Prolog Database
A Prolog system maintains a collection of facts and
rules of inference, a database.
A Prolog program is just a “store” of facts for this
database.
The simplest item in the database is a fact: a term
followed by a period:
sunny(florida).
sunny(california).
father(jim, ann).
Simple Queries
?- sunny(florida).
Yes.
?- father(jim, ann).
Yes.
?- father(jim, tom).
No.
?- sunny(X).
Attempt to match X.
X = florida;
Type a semi-colon, and
X = california; the system tries again.
No.
This time it fails.
Lists
Similar to Lisp.
[a, b, c] is syntactic sugar.
Separate head from tail using ‘|’.
‘.’ similar to ‘cons’ in Lisp.
List notation
[]
[1]
[1,2,3]
[1,parent(X,Y)]
Term denoted
[]
.(1,[])
.(1,.(2,.(3,[])))
.(1,.(parent(X,Y),[]))
[1|X]
[1,2|X]
[1,2|[3,4]]
.(1,X)
.(1,.(2,X)))
[1,2,3,4]
Pattern Matching: Unification.
Examples:
[george, X] unifies with [george, tom]
[X, fred, [1, X]] unifies with
[jane, fred, [1, Y]] by Y = X = jane
[X, fred, [1, X]] does not unify with
[jane, fred, [1, ralph]], because X
cannot match both jane and ralph.
Unification
1. A constant unifies only with itself.
2. Two structures unify iff they have
•
•
•
The same functor.
The same number of arguments.
The arguments unify recursively.
3. A variable X unifies with anything. The
other thing could:
•
•
have a value. So, instantiate X.
be an uninstantiated variable. Link the two
variables, so that:
If either is instantiated later, they both share the value.
Example of Unification
Unify ([p, q, [c, X]], [Y, q, [X, c]]) =
Unify(p,Y) and Unify([q, [c, X]], [q, [X, c]]) =
(Y=p) and Unify(q,q)
and Unify( [[c, X]], [[X, c]]) =
(Y=p) and Unify( [c, X], [X, c])
and Unify(nil,nil) =
(Y=p) and Unify(c,X)
and Unify([X],[c]) =
(Y=p) and (X=c)
and Unify(X,c) and Unify(nil,nil) =
Example of Unification
(cont’d)
(Y=p)
and (X=c)
and Unify(valueof(X),c) =
(Y=p) and (X=c) and Unify(c,c) =
(Y=p) and (X=c).
Some Useful Predicates
The predicate append(X,Y,Z) is true iff
appending Y onto the end of X yields Z.
Z=[X Y]
Examples:
?- append([1,2],[3,4],X).
X = [1, 2, 3, 4]
Yes.
?- append(X,[3,4],[1,2,3,4]).
X = [1, 2]
Yes.
Some Useful Predicates
(cont’d)
append can be used with any pattern of
instantiation (that is, with variables in any
position). Example:
?- append(X,[3,4],[1,2,3,4]).
X = [1, 2]
Yes
Some Useful Predicates
(cont’d)
Example:
?- append(X,Y,[1,2,3]).
X = []
Y = [1, 2, 3] ;
X = [1]
Y = [2, 3] ;
X = [1, 2]
Y = [3] ;
X = [1, 2, 3]
Y = [] ;
No.
Other Predefined List
Predicates
Predicate
Description
member(X,Y)
Provable if list Y contains element X.
select(X,Y,Z)
Provable if list Y contains element X, and
removing X from Y yields Z.
Provable if Z is the Xth element of list Y,
counting from 0.
Provable if X is a list of length Y.
nth0(X,Y,Z)
length(X,Y)
Queries using these predicates can contain
variables anywhere.
Sample Use of select
Z= list [1 2 3] that is removed 2.
?- select(2,[1,2,3],Z).
=[1 3]
Z = [1, 3] ;
No.
?- select(2,Y,[1,3]).
Y = [2, 1, 3] ;
Y = [1, 2, 3] ;
Y = [1, 3, 2] ;
No.
Prolog Rules (or maybe not :-)
Rules are of the form
predicate :- conditions.
The predicate is true iff all conditions are
true.
Conditions appear as a list of terms,
separated by commas.
Prolog Rules (cont’d)
The simplest rules are facts:
FatherOf(john,ted). MotherOf(connie,ted).
FatherOf(fred,carol).
MotherOf(connie,carol).
FatherOf(ted,ken).
MotherOf(jane,ken).
FatherOf(ted,lloyd). MotherOf(alice,lloyd)
FatherOf(lloyd,jim). MotherOf(carol,jim).
FatherOf(lloyd,joan). MotherOf(carol,joan).
Note: male/female names are meaningless.
Prolog Rules (cont’d)
More complex rules:
ParentOf(X,Y) :- FatherOf(X,Y).
ParentOf(X,Y) :- MotherOf(X,Y).
Alternatives are attempted in the order
specified:
?- ParentOf(connie,ted).
First, match FatherOf(connie,ted). Fails.
Then, match MotherOf(connie,ted). Succeed.
Prolog Rules (cont’d)
Using variables, we can get answers:
?- ParentOf(ted,C)
C = ken;
C = lloyd;
No.
?- ParentOf(P,carol)
P = fred;
P = connie;
No.
Prolog Rules (cont’d)
Using more than one condition:
GrandParent(X,Y) :- ParentOf(X,Z),
ParentOf(Z,Y).
?- GranParent(G, jim)
Prolog performs a backtracking, depth-first,
left-to-right search for values to satisfy the
predicate(s) sought.
Search for GrandParent(G,jim)
?- GranParent(G, jim)
GP(G=X,Y=jim)
AND
PO(G=X,Z)
PO(Z,Y=jim)
OR
FO
(G=X=
Z=
MO
, (G=X=
)
Z=
OR
FO
, (Z=
) Y=jim)
G = fred, ted, connie, alice
,
MO
fff
(Z=
Y=jim)
,
Another example
Facts:
AuthorOf("Life on a Donkey","Swartz").
AuthorOf("Big and Little","Jones").
AuthorOf("Where are We","White").
AuthorOf("In a Pig’s Eye","Brown").
AuthorOf("High Flight","Smith").
SubjectOf("Life on a Donkey",travel).
SubjectOf("Big and Little",life).
SubjectOf("Where are We",life).
SubjectOf("In a Pig’s Eye",travel).
SubjectOf("High Flight",bio).
Another example (cont’d)
More facts:
AudienceOf("Life on a
Donkey",adult).
AudienceOf("Big and Little",child).
AudienceOf("Where are We",teen).
AudienceOf("In a Pig’s Eye",adult).
AudienceOf("High Flight",adult).
Selecting Reviewers
Would like an author who:
has written books on the same subject.
Reviewer(Book,Person) :SubjectOf(Book,Sub),
SubjectOf(AnotherBook,Sub),
AuthorOf(AnotherBook,Person),
not AuthorOf(Book,Person).
Selecting Reviewers (cont’d)
If someone who has written in the same subject is
not available, then find someone who has written
for the same audience.
Reviewer(Book,Person) :AudienceOf(Book,Aud),
AudienceOf(AnotherBook,Aud),
AuthorOf(AnotherBook,Person),
not AuthorOf(Book,Person).
Exercise: Find reviewers for “Life on a Donkey”.
Hint: There are 3. A reviewer can qualify twice.