0% found this document useful (0 votes)
234 views51 pages

Genealogy: C C++ Erlan G Haskell

Uploaded by

Rahul Jain
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
234 views51 pages

Genealogy: C C++ Erlan G Haskell

Uploaded by

Rahul Jain
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 51

Genealogy

Simula
Lisp objects Prolog
functional C syntax Smalltalk
programming pattern
matching
ML
C++
Erlan
Haskell Java g
Actors

Scala
1
Prolog

Programming in Logic

Dec 8, 2021
SWI-Prolog
 SWI-Prolog is a good, standard Prolog for Windows
and Linux
 It's licensed under GPL, therefore free
 Downloadable from: http://www.swi-prolog.org/
Syllogisms
 “Prolog” is all about programming in logic.
 Aristotle described syllogisms 2300 years ago
 Sample syllogism:
 Socrates is a man.
 All men are mortal.
 Therefore, Socrates is mortal.
 This is logic. Can Prolog do it?
Forward and backward reasoning
 A syllogism gives two premises, then asks, "What can
we conclude?"
 This is forward reasoning -- from premises to conclusions
 it's inefficient when you have lots of premises
 Instead, you ask Prolog specific questions
 Prolog uses backward reasoning -- from (potential)
conclusions to facts
Syllogisms in Prolog

Syllogism Prolog
Socrates is a man. man(socrates).
All men are mortal. mortal(X) :- man(X).
Is Socrates mortal? ?- mortal(socrates).
Facts, rules, and queries
 Fact: Socrates is a man.
 man(socrates).
 Rule: All men are mortal.
 mortal(X) :- man(X).
 Query: Is Socrates mortal?
 mortal(socrates).
 Queries have the same form as facts
Running Prolog I
 Create your "database" (program) in any editor
 Save it as text only, with a .pl extension
 Here's the complete program:

man(socrates).
mortal(X) :- man(X).
Running Prolog II
 Prolog is completely interactive. Begin by
 Double-clicking on your .pl file, or
 Double-clicking on the Prolog application and consulting your
file at the ?- prompt:
 ?- consult('C:\\My Programs\\adv.pl').
 Then, ask your question at the prompt:
 ?- mortal(socrates).
 Prolog responds:
 Yes
Prolog is a theorem prover
 Prolog's "Yes" means "I can prove it" --
Prolog's "No" means "I can't prove it"
 ?- mortal(plato).
No
 This is the closed world assumption: the Prolog
program knows everything it needs to know
 Prolog supplies values for variables when it can
 ?- mortal(X).
X = socrates
Syntax I: Structures
 A structure consists of a name and zero or more
arguments.
 Omit the parentheses if there are no arguments
 Example structures:
 sunshine
 man(socrates)
 path(garden, south, sundial)
Syntax II: Base Clauses
 A base clause is just a structure, terminated with a
period.
 A base clause represents a simple fact.
 Example base clauses:
 debug_on.
 loves(john, mary).
 loves(mary, bill).
Syntax III: Nonbase Clauses

A nonbase clause is a structure, a turnstile :-
(meaning “if”), and a list of structures.
 Example nonbase clauses:
 mortal(X) :- man(X).
 mortal(X) :- woman(X).
 happy(X) :- healthy(X), wealthy(X), wise(X).
 The comma between structures means “and”
Syntax IV: Predicates
 A predicate is a collection of clauses with the same
functor (name) and arity (number of arguments).
 loves(john, mary).
loves(mary, bill).
loves(chuck, X) :- female(X), rich(X).
Syntax V: Programs
 A program is a collection of predicates.
 Predicates can be in any order.
 Clauses within a predicate are used in the order in
which they occur.
Syntax VI: Variables and atoms
 Variables begin with a capital letter:
X, Socrates, _result
 Atoms do not begin with a capital letter:
x, socrates
 Atoms containing special characters, or beginning with
a capital letter, must be enclosed in single quotes:
 'C:\\My Documents\\examples.pl'
Syntax VII: Strings are atoms
 In a quoted atom, a single quote must be doubled or
backslashed:
 'Can''t, or won\'t?'
 Backslashes in file names must also be doubled:
 'C:\\My Documents\\examples.pl'
Common problems
 Capitalization is meaningful!
 No space is allowed between a functor and its
argument list:
man(socrates), not man (socrates).
 Double quotes indicate a list of ASCII character
values, not a string
 Don’t forget the period! (But you can put it on the next
line.)
Backtracking
 loves(chuck, X) :- female(X), rich(X).
 female(jane).
 female(mary).
 rich(mary).
 ---------- Suppose we ask: loves(chuck, X).
 female(X) = female(jane), X = jane.

 rich(jane) fails.

 female(X) = female(mary), X = mary.

 rich(mary) succeeds.
Backtracking and Beads
 Each Prolog call is like a “bead” in a string of beads:

call exit
fail redo

 Each structure has four ports: call, exit, redo, fail


 Exit ports connect to call ports;
fail ports connect to redo ports
Calls as nested beads

loves(chuck, X) :- female(X), rich(X).

loves(chuck, X)
call exit
female(X) rich(X)
fail redo
Additional answers
 female(jane).
female(mary).
female(susan). female(X)
 ?- female(X). female(jane)
 X = jane ;
 X = mary
female(mary)
 Yes

female(susan)
Readings
 loves(chuck, X) :- female(X), rich(X).
 Declarative reading: Chuck loves X if X is female and
rich.
 Approximate procedural reading: To find an X that
Chuck loves, first find a female X, then check that X is
rich.
 Declarative readings are almost always preferred.
Monotonic logic
 Standard logic is monotonic: once you prove something
is true, it is true forever
 Logic isn't a good fit to reality
 If the wallet is in the purse, and the purse in is the car,
we can conclude that the wallet is in the car
 But what if we take the purse out of the car?
Nonmonotonic logic
 Prolog uses nonmonotonic logic
 Facts and rules can be changed at any time
 such facts and rules are said to be dynamic
 assert(...) adds a fact or rule
 retract(...) removes a fact or rule
 assert and retract are said to be extralogical
predicates
Examples of assert and retract
 assert(man(plato)).
 assert((loves(chuck,X) :- female(X), rich(X))).
 retract(man(plato)).
 retract((loves(chuck,X) :- female(X), rich(X))).
 Notice that we use double parentheses for rules
 this is to avoid a minor syntax problem
 assert(foo :- bar, baz).
 How many arguments did we give to assert?
Limitations of backtracking
 In Prolog, backtracking over something generally
undoes it
 Output can't be undone by backtracking
 Neither can assert and retract be undone by
backtracking
 Perform any necessary testing before you use write, nl,
assert, or retract
Modeling “real life”
 Real life isn't monotonic; things change
 Prolog is superb for modeling change
 Games are often a model of real (or fantasy!) life
 Prolog is just about ideal for adventure games
Starting Prolog
 [Macintosh:~] dave% prolog
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 3,928 bytes
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.1)
Copyright (c) 1990-2010 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

 ?- consult('C:\\_Prolog\\dragon.pl').

 % C:\_Prolog\dragon.pl compiled 0.00 sec, 14,560 bytes


Yes
Instructions
 ?- start.
 Enter commands using standard Prolog syntax.
Available commands are:
start. -- to start the game.
n. s. e. w. -- to go in that direction.
take(Object). -- to pick up an object.
drop(Object). -- to put down an object.
use(Object). -- to use an object.
attack. -- to attack an enemy.
look. -- to look around you again.
instructions. -- to see this message again.
halt. -- to end the game and quit.
Starting out
 You are in a meadow. To the north is the dark
mouth of a cave; to the south is a small building.
Your assignment, should you decide to accept it,
is to recover the famed Bar-Abzad ruby and
return it to this meadow.

Yes
Going south
 ?- s.
 You are in a small building. The exit is to the
north. The room is devoid of furniture, and the
only feature seems to be a small door to the east.

There is a flashlight here.

Yes
Taking things, locked doors
 ?- take(flashlight).
 OK.

Yes
 ?- e.
 The door appears to be locked.
You can't go that way.

Yes
Some time later...
 ?- use(key).
 The closet is no longer locked.

Yes
 Later still...
 ?- look.
 You are in a big, dark cave. The air is fetid.

There is a chest here.


Essential facts
 Where I am at present:
 i_am_at(meadow).
 Where other things are at:
 at(flashlight, building).
 What I am holding:
 holding(key).
 Which facts may be changed:
 :- dynamic i_am_at/1, at/2, holding/1.
Input and output
 Input is unpleasant; we avoid it by giving commands
(as questions) directly to Prolog
 take(flashlight).
 write(...) outputs its one argument
 nl ends the line (writes a newline)
 describe(closet) :-
write('You are in an old storage closet.'),
nl.
The map
N
W E
S
cave_entrance cave

meadow

building closet
Implementing the map
 path(cave, w, cave_entrance).
path(cave_entrance, e, cave).

 path(meadow, s, building).
path(building, n, meadow).

 Could have done this instead:


 path(cave, w, cave_entrance).
path(X, e, Y) :- path(Y, w, X).
listing
 listing(predicate) is a good way to examine the
current state of the program
 ?- listing(at).
 at(key, cave_entrance).
at(flashlight, building).
at(sword, closet).

Yes
North, south, east, west
 The commands n, s, e, w all call go.
 n :- go(n).

s :- go(s).

e :- go(e).

w :- go(w).
go
 go(Direction) :-
i_am_at(Here),
path(Here, Direction, There),
retract(i_am_at(Here)),
assert(i_am_at(There)),
look.
 go(_) :-
write('You can''t go that way.').
take
 take(X) :-
i_am_at(Place),
at(X, Place),
retract(at(X, Place)),
assert(holding(X)),
write('OK.'),
nl.
You can't always take

take(A) :-
holding(A),
write('You\'re already holding it!'), nl.

take(A) :- (actually take something, as before).

take(A) :-
write('I don\'t see it here.'), nl.
Making things fail

 A predicate will fail if it doesn't succeed


 You can explicitly use fail
 fail works like this:

call
fail
fail
 This often isn't strong enough; it doesn't force the
entire predicate to fail
cut
 The "cut," written ! , is a commit point
 It commits to the clause in which it occurs, and
 everything before it in that clause
 Using cut says: Don't try any other clauses, and don't
backtrack past the cut

call exit
!
cut-fail
 The cut-fail combination: !, fail means really fail
 It commits to this clause, then fails
 This means no other clauses of this predicate will be
tried, so the predicate as a whole fails
A locked door

 path(building, e, closet) :-
locked(closet),
write('The door appears to be locked.'), nl,
!, fail.
path(building, e, closet).
 If the closet door isn't locked, the first clause fails
"normally," and the second clause is used
 If the closet door is locked, the cut prevents the
second clause from ever being reached
Dropping objects

drop(A) :-
holding(A),
i_am_at(B),
retract(holding(A)),
assert(at(A, B)),
write('OK.'), nl.
drop(A) :-
write('You aren\'t holding it!'), nl.
What else is Prolog good for?
 Prolog is primarily an AI (Artificial Intelligence)
language
 It's second only to LISP in popularity
 It's more popular in Britain than in the U.S.
 Prolog is also a very enjoyable language in which to
program (subjective opinion, obviously!)
Prolog vs. LISP
 Unlike LISP, Prolog provides:
 built-in theorem proving
 built in Definite Clause Grammars, good for parsing natural
language
 If you just want to use these tools, Prolog is arguably
better
 If you want to build your own theorem prover or parser,
LISP is clearly better
The End

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy