dr eleni mangina – course: logic programming (during a joint degree with fudan university in...

63
Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING (during a joint degree with Fudan University in Software Engineering) DEPT. OF COMPUTER SCIENCE UCD LOGIC PROGRAMMING (WEEK 3) Eleni E. Mangina Department of Computer Science University College Dublin General module information Books Introduction - Declarative programming The Prolog Language

Post on 21-Dec-2015

218 views

Category:

Documents


0 download

TRANSCRIPT

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

LOGIC PROGRAMMING(WEEK 3)

Eleni E. ManginaDepartment of Computer Science

University College Dublin

• General module information• Books• Introduction - Declarative programming• The Prolog Language

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Lecture 7

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Books

• The recommended book is:

Programming in Prolog

4th Edition

W. Clocksin & C.S. Mellish

• Another book:

The Art of Prolog

2nd edition

L. Sterling & E. Shapiro

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Introduction to Prolog• Programming languages are of two kinds:

- procedural (BASIC, ForTran, C++, Pascal)- declarative (Lisp, Prolog, ML)

• In procedural programming, we tell the computer how to solve a problem

• In declarative programming, we tell the computer what problem we want solved

• (However, in Prolog, we often forced to give clues as to the solution method)

• Other AI languages: LISP, C/C++, CLIPS

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Some facts about Prolog

(For those who know other languages)

• • No global variables.

• • No assignment statement.

• • No real iterative constructs.

• • No conditional (if/then) statement.

• • Recursion very central.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Basic elements of Prolog

• We give a database of facts and rules:

- some are always true

- some are dependent of others

• To run a program we ask questions about the facts

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

The central ideas of Prolog• SUCCESS/FAILURE: any computation can

“succeed” or “fail”, and this is also used as a “test” mechanism.

• MATCHING: any two data items can be compared for similarity, and values can be bound to variables in order to allow a match to succeed.

• SEARCHING: the whole activity of the Prolog system is to search through various options to find a combination that succeeds.

• BACKTRACKING: when the system fails during its search, it returns to previous choices to see if making a different choice would allow success.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Prolog in English• Example:John is the father of JimJane is the mother of JimJack is the father of John

Person 1 is a parent of Person 2 ifPerson 1 is the father of Person 2 orPerson 1 is the mother of Person 2.

Person 1 is a grandparent of Person 2 ifsome Person 3 is a parent of Person 2 andPerson 1 is a parent of Person 3.

Who is Jim’s father?Is Jane the mother of Fred?Is Jane the mother of Jim?Does Jack have a grandchild?

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Prolog in Prologfather(john,jim).mother(jane,jim).father(jack,john)

parent(Person1,Person2):-father(Person1,Person2).

parent(Person1, Person2):-mother(Person1, Person2)

grandparent (Person1, Person2):-parent(Person3, Person2),parent(Person1, Person3).

?- father( Who, jim).?- mother( jane, fred).?- mother( jane, jim).?- grandparent( jack, _).

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Using Prolog (1)

• First write your program• Then, type it into a Unix file, with a .pl extension• Then type

sicstus• Then, “consult” your file (omitting the .pl):

[yourfilename]• Then, you can ask your questions• Sometimes, you can get multiple answers, by typing ‘;’• If you edit your program file (eg. to correct something),

be sure to consult it again afterwards!

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Using Prolog (2)

• To exit from Prolog, type halt.

• or Control/D

• The Prolog comment characters:– Single line comments:

% This is a commentThis is not a comment, but an error

– Multiple line comments/* This is a multi-line comment which must be closed with a */

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Simple interaction with PrologOn a Unix workstation, type:

sicstus

this should give:

SICStus 3 #5: Fri Jul 4 12:29:00 BST 1997

| ?-

Then you can type a simple command:

write(’hello’).

which will give the response:

hello

yes

Or a sequence of commands, separated by COMMAS:

write(’hello’), nl, write(’friend’).

giving:

hello

friend

yes

To exit from Prolog, type

halt.

or

Control/D

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Definining and loading programs

Start up Sicstus Prolog.• ‘consult’ your file (omitting the .pl):consult(myprog).There is an abbreviated form, using square

brackets:[myprog].• If you edit your program file (e.g. to correct

something),be sure to “consult” it again afterwards!

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Defining a programA procedure (or predicate) consists of one or more clauses.Here is a simple clause:salute :-write(’Hi,’), tab(2), write(’pal!’).This defines a procedure whose head issaluteand whose body iswrite(’Hi,’), tab(2), write(’pal!’).If we put this in a file, then consult that file, then :?- salute.Hi, pal!yes

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

ChoicesDefinitions can have several clauses:greet(hamish):-write(’How are you doing, pal?’).greet(amelia):-write(’How awfully nice to see you!’).greet(mike):-write(’Hi there’).If this definition is consulted into Prolog, then:?- greet(amelia).How awfully nice to see you!yesThe goal is matched against the heads of the clauses, in order.The first matching clause is selected.The body of that clause is performed.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Failure?- greet(ebenezer).noIf no clauses match the goal, the goal fails.When the goal typed in at top-level fails, the

Prologuser-interface prints no.THIS IS DIFFERENT FROM AN ERROR.For example, trying to use an undefined

predicate is an error:?- say(’hello’).{EXISTENCE ERROR: say(hello):procedure user:say/1 does not exist}

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Variables in definitionsAn argument to a predicate can be variable:greet(Name):-write(’Hullo, ’), write(Name).With this defintion, we get:?- greet(alphonse).Hullo, alphonseyesThe matching of the goal with the head of the clause causesthe variable Name to be bound to the value alphonse.This “binding” is then used when the body of the clause isbeing performed.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Clauses in ordergreet(hamish):-write(’How are you doing, pal?’).greet(amelia):-write(’How awfully nice to see you!’).greet(Name):-write(’Hullo, ’), write(Name).Then:?- greet(hamish).How are you doing, pal?yes?- greet(daisy).Hullo, daisyyes?- greet(amelia).How awfully nice to see you!yesClauses are tried in order from the top. The one with the variable will match any argument.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Variables in goalsA goal can also have variable arguments.Suppose we have consulted a file with all the clauses ofgreet shown so far.?- greet(Person).How are you doing, pal?Person = hamish ?The (successful) matching of the goal with the head of thefirst clause causes the variable Person to be bound to thevalue hamish.The Prolog interface reports this “binding”.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Summary so far• A Prolog program may succeed or fail.• Prolog programs consist of predicate definitions• Predicate definitions consist of clauses• Clauses consist of a head and and (so far) a body• A clause head has a predicate name and sometimes some

arguments.• A goal is a predicate name and sometimes some• arguments.• A goal matches against clause heads in order.• If no clause matches, that goal fails.• Successful matching may cause variables to be bound to values.• If a variable in the top-level goal becomes bound, the user-

interface reports this.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Lecture 8

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Anatomy• Prolog programs consist of predicate definitions like

parent• Predicate definitions consist of clauses

parent(P1,P2) :- mother (P1, P2).

• Clauses consist of a heade.g. parent(P1,P2)And sometimes a bodye.g. mother(P1,P2)

• A clause head has a predicate name and sometimes arguments (P1, P2)

• The body is a collection of literals, which match clause heads

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

What makes a good Prolog program?

• In order of decreasing importance– Correctness and careful design– clarity and comments– speed

(at least for our purposes in this course)

Because we understand the logical meaning of logic programs we can reply on the computer to transform elegant but inefficient programs into ugly (but invisible) efficient ones

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

What makes a bad Prolog program?

• In no particular order:– Hacking undesigned code at the terminal– Using obscure or meaningless variable and

predicate names– Not commenting code– abusing the procedural aspects of Prolog

to produce logically meaningless code

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

• Recall that a Prolog program is made up of predicates

…. And a predicate is made up of clauses

• A clause has a head and maybe a body• The head of a clause always takes one of two

forms:prednamepredname( argument1, argument2, … )

• If the predicate is always true, there is no body, and we finish with a full-stop (period).

More about Prolog clause syntax (1)

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

• If the predicate is conditional, we connect it to a body of subgoals with the if operator, :-

• Each subgoal is a Prolog literal… which is either- like a head, as before; or- A negated head, written

\+ predname\+ predname (argument1, …)

• Note the space after the \+ operator• We will return to \+ later

More about Prolog clause syntax (2)

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

More about Prolog clause syntax (3)

• We can combine literals in Prolog clauses with the operators- , (comma) meaning “and” – conjuction- ; (semicolon) meaning “or” - disjunction

You should never nee dto use ; in a program because you can express disjunction via multiple clauses. It makes Prolog

compilation less effective

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

• There is also (minus, greater than) supposedly meaning “implies”

• We can complex expressions using brackets

( l1(a1,a2); l2(a3)), l3(a1)

l1(a1,a2); l2(a3)), l3(a1) l1(a1,a2); l2(a3), l3(a1))

More about Prolog clause syntax (4)

You should never need to use and it is best avoided because it does not mean the same as “logical implies”

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

More about Prolog goal syntax

• Prolog goal syntax is the same as the syntax of the clause body

• Literals are combined with “and”, “or”, “not” and “implies”

• We run a Prolog program by asking a question or more precisely, stating a goalp(x):-q(x)

|?- q(x)

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Proof strategy

• Prolog solves questions by attempting to prove them

• Suppose we have consulted the ancestor program and we ask the question:

ancestor(alan,dave).

• ancestor is defined as:

ancestor(A,B) :- parent (A,B).

ancestor(A,B) :- parent (A,C), ancestor (C,B)

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Proof strategy (2)• To prove this, prolog starts at the top of the

database and tried to find a predicate called ancestor

• Then it looks at each clause in turn, and tries to unify its head with the goal

• Once unification is complete, attempt to prove the literals in the body, in order of appearance

This is the prolog built-in proof strategy. However, it is possible to override it – we will cover this later

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Unification• Unification works by comparing the structure

of literals:– First compare the predicate name;– Then, for each argument;

• If the gioal argument is a variable, then make itthe same as the program argument, and unification succeeds;

• Otherwise, if the program argument is a variable, then make it the same as the goal argument, and unification succeeds;

• Otherwise, if both arguments are the same, unification succeeds;

• Otherwise, unification fails

We will cover unification in more detail later

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Proof Strategy (3)Prove: ancestor(alan,dave)Find: ancestor clause 1Unify: A = alan, B = daveProve: parent(alan, dave) FAILTry again:Find: ancestor clause 2Unify: A = alan, B = daveProve: parent(alan, C)Find: parent clause 1Unify: C = clive SUCCEEDNext goal:Prove: ancestor(clive, dave)Find: ancestor clause 1Unify: A = clive, B = daveProve: parent(clive, dave) SUCCEEDAnswer: yes.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Summary so far

• Using the Prolog system• Programming style• Prolog clause syntax

– Predicates– Clauses– Heads & bodies– Variables– Full-stops (periods)– Logical operators: , ; \+– Brackets

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

So far..• A Prolog program may succeed or fail.• Prolog programs consist of predicate definitions• Predicate definitions consist of clauses• Clauses consist of a head and and (so far) a body• A clause head has a predicate name and sometimes some

arguments.• A goal is a predicate name and sometimes some arguments.• A goal matches against clause heads in order.• If no clause matches, that goal fails.• Successful matching may cause variables to be bound to

values.• If a variable in the top-level goal becomes bound, the user-

interface reports this.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Tests“Success” can act as “true”, “failure” as “false”:| ?- 5 < 7.yes| ?- 7 < 5.noSo the comma acts like a (left-to-right) “AND” :| ?- 3 < 7, 2 < 4, 10 < 12.yes| ?- 3 < 7, 4 < 2, 10 < 12.no

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Tests in clausesThis allows more precise selection of a clause:

bigger(N, M):- N < M,

write(’Bigger number is ’), write(M).

bigger(N, M) :- M < N,

write(’Bigger number is ’), write(N).

bigger(N, M) :- write(’Numbers are the same’).

If a test fails, then the system backtracks, and tries to choose a later clause.

No need for an equality test in 3rd clause here – system tries this one only when other two have failed, and hence N and M must be equal.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Passing resultsDON’T return values by printing messages.Return values by causing suitable variables to become bound.larger(N, M, M):- N < M.larger(N, M, N) :- M < N.larger(N, M, M).e.g. :| ?- larger(8,3,Result).Result = 8yes| ?- larger(6,6,Value).Value = 6yes| ?- larger(2,5,Value).Value = 5yes

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Variable bindinglarger ( 8 , 3 , Result )

larger ( N, M, M ) :- N < M, .....

M bound to 3, and M bound to Result, so Result bound to 3.

Clause body fails. Bindings discarded. Next clause tried:

larger ( 8 , 3 , Result )

larger ( N, M, N ):- M < N, .....

Since N bound to 8, and N bound to Result, Result bound to 3.

Clause body succeeds. Result binding is retained and

displayed.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

More on variable matching

• a variable can be bound to another variable (sharing)

• a shared set can contain any number of variables• if variable A is bound to variable B, then variable

B is bound to variable A• shared variables cannot be bound to different

non-variable values• when one of a shared set of variables is bound to

a value, all the variables in that shared set are bound to the same value

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Lecture 9

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Unit clausesA clause may have an empty body –no goals, and omit the “:-” symbol.greet(nasty). % Clause in your programEverything works as before:| ?- greet(nasty).yes| ?- greet(Who).Who = nasty?yesThese are unit clauses.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Unit clauses as facts%% A simple set of clauses describing

%% some family relationships

man(paul).

man(david).

man(peter).

woman(louise).

woman(helen).

woman(mandy).

wifeof(paul, louise).

wifeof(peter, helen).

sonof(paul, peter).

daughterof(peter, mandy).

Use constant symbols to represent objects, and predicates for properties (e.g. woman) or relationships (e.g. sonof).

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Querying this “database”

| ?- man(peter).yes| ?- man(louise).no| ?- woman(Someone).Someone = louise;Someone = helen;Someone = mandy;no

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

| ?- wifeof(paul, Hiswife).Hiswife = louiseyes| ?- wifeof(Herhusband, louise).Herhusband = paulyes| ?- daughterof(Father, mandy).Father = peteryes| ?- sonof(Father, Son).Father = paulSon = peteryes

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Facts and Rules togetherAlongside facts (unit clauses) we can have full clauses:husbandof(Woman, Man):-wifeof(Man, Woman).“For a goal involving husbandof, try a goal usingwifeof, with the arguments in the other order.”| ?- husbandof(helen, peter).yesWe could also have:parentof(Person1, Person2):-daughterof(Person1, Person2).parentof(Person1, Person2):-sonof(Person1, Person2).

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

| ?- parentof(peter, Child).Child = mandyyes| ?- parentof(louise, peter).no| ?- parentof(Parent, peter).Parent = paulyes| ?- parentof(Parent, Child).Child = mandyParent = peteryes

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

More on backtracking

Suppose we add:

grandparent(OldPerson, YoungerPerson):-

parentof(OldPerson, Another),

parentof(Another, YoungerPerson).

and try the goal:

| ?- grandparent(Oldone, Youngone).

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Looks for a parentof relation.First clause says try daughterof.SUCCESS with daughterof(peter, mandy)So Another = mandy.Looks for parentof(mandy, YoungerPerson).First clause says try daughterof.None with mandy. FAILURE.Second clause suggests sonof.None with mandy. FAILURE.So second parentof goal FAILS.Try first parentof goal again.Second clause suggests sonof.SUCCESS with sonof(paul, peter)So OldPerson = paul, Another = peter.Looks for parent(peter, YoungerPerson).First clause says try daughterof.SUCCESS with daughterof(peter, mandy)So YoungerPerson) = mandyBoth parentof goals successful.So grandparent goal successful(with bindings Oldone = paul, Youngone = mandy).

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Tracing“spy” shows you what is going on inside your program.| ?- spy(larger).{The debugger will first leap -- showing spypoints {Spypoint placed on

user:larger/3}yes{debug}| ?- larger(8,9, Output).+ 1 1 Call: larger(8,9,_195) ?2 2 Call: 8<9 ?2 2 Exit: 8<9 ?+ 1 1 Exit: larger(8,9,9) ?Output = 9 ?yes{debug}

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

| ?- larger(9,8, Result).+ 1 1 Call: larger(9,8,_195) ?2 2 Call: 9<8 ?2 2 Fail: 9<8 ?2 2 Call: 8<9 ?2 2 Exit: 8<9 ?+ 1 1 Exit: larger(9,8,9) ?Result = 9 ?yes

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

?- spy(grandparent).

{The debugger will first leap -- showing spypoints {Spypoint placed on user:grandparent/2}

yes

{debug}

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

| ?- grandparent(Oldone, Youngone).+ 1 1 Call: grandparent(_193,_221) ?2 2 Call: parentof(_193,_485) ?3 3 Call: daughterof(_193,_485) ?3 3 Exit: daughterof(peter,mandy) ?2 2 Exit: parentof(peter,mandy) ?4 2 Call: parentof(mandy,_221) ?5 3 Call: daughterof(mandy,_221) ?5 3 Fail: daughterof(mandy,_221) ?5 3 Call: sonof(mandy,_221) ?5 3 Fail: sonof(mandy,_221) ?4 2 Fail: parentof(mandy,_221) ?2 2 Redo: parentof(peter,mandy) ?3 3 Redo: daughterof(peter,mandy) ?3 3 Fail: daughterof(_193,_485) ?3 3 Call: sonof(_193,_485) ?3 3 Exit: sonof(paul,peter) ?2 2 Exit: parentof(paul,peter) ?4 2 Call: parentof(peter,_221) ?5 3 Call: daughterof(peter,_221) ?5 3 Exit: daughterof(peter,mandy) ?4 2 Exit: parentof(peter,mandy) ?+ 1 1 Exit: grandparent(paul,mandy) ?Oldone = paul,Youngone = mandy ?yes

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Negation

• So far, everything we have said fits in with the idea of programming in logic

• So far, truth in terms of our intended interpretation has been exactly the same as provability in the Prolog database

• However, one aspect of Prolog does not fit well with logic, even though we need it often

• Negation is the option of reserving the truth or falsehood of a predicate

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Negation (2)• For example, given the database

p(a)

p(b)

the question

\+ p(a)

yields the answer

no.• Similarly, the question

\+ p(c)

yields the answer

yes.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Negation (3)

• Negation in Prolog works by– Trying to prove the negated goal;– If the goal succeeds, fail the current proof;– If it fails, then proceed to the next goal as

though it had succeeded

• We will consider how this is implemented later on

It is called Negation As Failure (NAF)

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Floundering• However, consider this goal:

X = 5, \+ (X = 2)

• Now consider this goal:\+ (X = 2), X = 5

• Logically, these two are the same – both should succeed, with X=5

However, they are not the same in Prolog, because the logical semantics (meaning) diverges from the procedural semantics

(the way of working things out) at this point

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Proof Strategy• Prolog proof strategy works as follows:

To prove a goal true:– Start at the top of the database; and scan down it

until you find a clause whose head can unify with the goal. If there is no such clause, go back to the last clause you chose and try to find an alternative to it further down the database

– If that clause has a body, take the body, with any values added by unification, and start again (recurse), with the first goal

– If that clause doesn’t have a body, proceed to the next unproved goal

– When there are no more proven goals, stop.

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Proof strategy (2)Given the database and query:

a(1).a(2).b(Y) :- a(Y), \+ c(Y).c(1).d(1).d(2).?- b(X), d(X).

What happens?– Select leftmost goal: b(x)– Start at top of database, and scan down for match

under unification, which fgives Y = X

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Proof strategy (3)a(1).a(2).b(Y) :- a(Y), \+ c(Y).c(1).d(1).d(2).

• Now we have these goals to consider:a(X), \+ c(X), d(X).

• Looking for a proof of a(X), we first unify with a(1) to give X = 1:

\+ c(1), d(1).

• But c(1) is provable, so \+ c(1) fails!

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Proof strategy (4)a(1).

a(2).

b(Y) :- a(Y), \+ c(Y).

c(1).

d(1).

d(2).• The last match we made was with a(1), so retry that

… and this time a(2) matches.• So now we have to prove

\+ c(2), d(2).• We cannot prove c(2), so \+ c(2) suceeds

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Proof Strategy (5)a(1).a(2).b(Y) :- a(Y), \+ c(Y).c(1).d(1).d(2).

• We now have to prove d(2) – which succeeds.

• We finish with the answerX = 2yes

Dr Eleni Mangina – COURSE: LOGIC PROGRAMMING(during a joint degree with Fudan University in Software Engineering)

DEPT. OF COMPUTER SCIENCEUCD

Summary

• So far:– Negation as Failure– Prolog standard proof (search) strategy

• Next:– Terms– Lists– Unification