programming language theory logic programming

25
Dec 18. 2003 Logic Programming 1 Programming Language Theory Logic Programming Leif Grönqvist •The national Graduate School of Language Technology (GSLT) •MSI

Upload: rhiannon-fischer

Post on 30-Dec-2015

122 views

Category:

Documents


3 download

DESCRIPTION

Programming Language Theory Logic Programming. Leif Grönqvist The national Graduate School of Language Technology (GSLT) MSI. Contents. Leif’s three parts of the course: Functional programming Logic programming Similar ways of thinking, but different from the imperative way - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 1

Programming Language TheoryLogic Programming

Leif Grönqvist•The national Graduate School of Language Technology (GSLT)

•MSI

Page 2: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 2

Contents

Leif’s three parts of the course:

• Functional programming

• Logic programming

Similar ways of thinking, but different from the imperative way

• Formal semantics

Page 3: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 3

Logic Programming

• Based on logic (surprise!)• First order predicate calculus

(predikatlogik)• Statements and rules are stored in the

prolog database, for example:– 0 is even– Växjö is bigger than Göteborg– if A is bigger than B then B is smaller than A– If n is even then n+1 is odd

Page 4: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 4

Predicate calculus

• The examples above can be written in first order predicate calculus:– even (0)– bigger (Växjö, Göteborg)– bigger (A, B) smaller (B, A) n: even (n) odd (n+1)

• The numbers and cities are constants, sometimes called atoms

• “even”, “odd”, “smaller”, and “bigger” are predicates• A, B and n are variables (may be free or bound)• “” is a connective (others are “and”, “or”, and “not”)• “” is a quantifier

Page 5: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 5

Prolog

• In prolog they may be written as:even (0).bigger (växjö, göteborg).smaller (A, B) :- bigger (B, A).odd (N) :- even (M), M is N+1.

• Atoms start with a lowercase and variables with an uppercase letter

• Atoms starting with an uppercase letter has to be written like ‘Eva’

• With the facts read into the prolog system we may ask queries

Page 6: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 6

Horn Clauses

• A statement in the form:a1 and a2 and … and an bIs a so called Horn Clause

• b is called the head• a1, a2, …, an is the body• A rule with an empty body is a fact (an axiom)• Axioms are statements that are assumed to be

true• Theorems are proved from axioms (and

theorems)

Page 7: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 7

An example

• Let’s look at the Euclidian algorithm to compute the greatest common divisorgcd u 0 = ugcd u v = gcd v (v `mod` u)

• Translating to first-order predicate calculus:u: gcd(u,0,u).u: v: w: not zero(v) and

gcd(v, u mod v, w) gcd(u, v, w).• And as Horn Clauses:

gcd(u, 0, u).not zero(v) and gcd(v, u mod v, w) gcd(u, v, w).

Page 8: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 8

A small prolog example

• Lets feed this into the prolog database:woman (anna).woman (mia).woman (eva).man (john). man (peter).man (erik).

• We now have six facts that are defined as true• The words anna, john, etc. are atoms (not strings,

“Anna” is a string)• An atom may be looked up extremely quickly

Page 9: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 9

The example in Sicstus Prolog• Read the file:SICStus 3.8.4 (x86-win32-nt-4): Tue Jun 13 11:31:44 2000Licensed to ling.gu.se| ?- {source_info}| ?- {consulting c:/documents and

settings/leifg/skrivbord/vups/ex1.pl...}{consulted c:/documents and settings/leifg/skrivbord/vups/ex1.pl

in module user, 40 msec 864 bytes}• We may ask if facts are true:

| ?- man(john).yes| ?- woman(olle).no

• Or another kind of query:| ?- woman(X).X = anna ? ;X = mia ? ;X = eva ? ;no

| ?- woman(X), man(X).

no

Answers come one by one, get the next with ;

Page 10: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 10

More facts

• Let’s add some more facts, and some rules

man(eva).happy(anna).happy(john).tall(erik).loves(john,mia).loves(peter,mia).loves(erik,eva).loves(erik,erik).loves(eva,erik).

• And some rulesJealous_at(X,Y) :-

loves(X,Z), loves(Y,Z),

X\==Y, \+ happy(X).

playsAirGuitar(jody).

playsAirGuitar(X) :-

listensToMusic(X),

happy(X).

listensToMusic(mia).

listensToMusic(X) :-

woman(X) ;

tall(X), man(X).

Page 11: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 11

The rules

• Most of the rules are Horn clauses– listensToMusic(X), true if

• Mia listens to music• Or X is a woman• Or X is a tall man

– playsAirGuitar(X), true if:• X is judy• Or if X is happy and listens to music

– Jealous_at(X,Y), true if:• There is a Z such that both X and Y loves Z• X and Y have to be different• X is not happy

• Important note: We define things, the system accepts what we say – even if we are lying in a “real world”!

Page 12: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 12

Try the rules

| ?- listensToMusic(A).A = mia ? ;A = anna ? ;A = mia ? ;A = eva ? ;A = erik ? ;no| ?-playsAirGuitar(X).X = jody ? ;X = anna ? ;no

| ?- jealous_at(X,Y).

X = peter,

Y = john ? ;

X = erik,

Y = eva ? ;

X = eva,

Y = erik ? ;

no

| ?- woman(X),man(X).

X = eva ? ;

no

Page 13: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 13

Lists and recursion

• Recursion is an important feature – just as in functional programming

• This example checks if two lists are equal:- use_module(library(charsio)).:- use_module(library(lists)).eq([],[]).eq([X|XS], [X|YS]) :-

eq(XS, YS).• So eq(A, B) is true if:

– If A and B are empty lists, or:– The first element in each list is the same and eq holds for the

rest of the lists

Page 14: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 14

Lists and recursion, cont.

• The append function (well, predicate)

app([], YS, YS).

app([X|XS],YS, [X|XYS]) :-

app(XS, YS, XYS).

• Append has three arguments! – It’s not really a function but a predicate– app(A, B, AB) is true if B appended to the end

of A result in AB

Page 15: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 15

Testing the predicates| ?- eq([a,b], [a,b]). yes| ?- eq([a,b], [a,b,c]). no| ?- eq([a,b], A). A = [a,b] ? ; no| ?- eq(A, B).A = [], B = [] ? ;A = [_A], B = [_A] ? ;A = [_A,_B], B = [_A,_B] ? ;A = [_A,_B,_C], B = [_A,_B,_C] ? ;A = [_A,_B,_C,_D], B = [_A,_B,_C,_D] ? A = [_A,_B,_C,_D,_E], B = [_A,_B,_C,_D,_E] ? ;A = [_A,_B,_C,_D,_E,_F], B = [_A,_B,_C,_D,_E,_F] ?yes

Page 16: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 16

Testing the predicates, cont.

| ?- app([1], [2], A). A = [1,2] ? ; no| ?- app(A,B,[1]). A = [], B = [1] ? ;

A = [1], B = [] ? ;no

| ?- app([1], A, [1,2,3]).A = [2,3] ? ; no• We may replace arguments with variables and use

predicates as functions in both directions!• Possible queries are for example:

– Give me pairs of lists A, B that appended together becomes [1]– Give me the list A that appended to [1] result in [1,2,3]– Give me triples of lists A, B, C such that B appended to A result

in C– Check if [3] appended to [1,2] result in [1,2,3]

Page 17: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 17

Evaluation order• Sicstus Prolog is evaluated in depth first order• The trace-functionality shows us how it works:| ?- trace.% The debugger will first creep -- showing everything (trace)yes% trace,source_info| ?- listensToMusic(A).

1 1 Call: listensToMusic(_430) ? ? 1 1 Exit: listensToMusic(mia) ? A = mia ? ;• One solution! Let’s try to find more solutions:

1 1 Redo: listensToMusic(mia) ? 2 2 Call: woman(_430) ? 2 2 Exit: woman(anna) ?

Page 18: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 18

Evaluation order, cont.? 1 1 Exit: listensToMusic(anna) ? A = anna ? ;

1 1 Redo: listensToMusic(anna) ? 2 2 Redo: woman(anna) ?

? 2 2 Exit: woman(mia) ? ? 1 1 Exit: listensToMusic(mia) ? A = mia ? ;

1 1 Redo: listensToMusic(mia) ? 2 2 Redo: woman(mia) ? 2 2 Exit: woman(eva) ?

? 1 1 Exit: listensToMusic(eva) ? A = eva ? ;

1 1 Redo: listensToMusic(eva) ? 3 2 Call: tall(_430) ?

• All female solutions found! Are there any more?

Page 19: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 19

Evaluation order, cont.

3 2 Call: tall(_430) ? 3 2 Exit: tall(erik) ? 4 2 Call: man(erik) ? 4 2 Exit: man(erik) ? 1 1 Exit: listensToMusic(erik) ?

A = erik ? ;no• No more solutions• Note that mia listensToMusic because

– She is mia– She is female

• So she’s listed twice

Page 20: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 20

Evaluation order, cont.

• We can see the depth first order and the backtracking

• Sicstus evaluates:– Top to bottom– Left to right

• Sometimes a breadth first search could give a result where depth first fails– Recall the properties of strict and lazy evaluation in a

functional programming language

Page 21: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 21

Unification and types

• There are no types in Prolog• But unification could give us similar help• Only objects with the same structure could be

unified• Unification tries to make pairs “the same”

– Could work if one of the elements is undecided, let’s ask the system to unify:

A=2. A = 2 ?| ?- [A,2,3]=[1|B]. A = 1, B = [2,3] ?1=2 no(A-A)=(B-C). B = A, C = A ?

Page 22: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 22

An example: permutation sort• We will now define a sort

predicate:• is the second list a

permutation of the first?perm([],[]).perm([X|Y],Z) :-

perm(Y,W),insert(X,W,Z).

• Y is inserted somewhere in XZ to form XYZ

insert(Y,XZ,XYZ) :-append(X,Z,XZ),append(X,[Y|Z],XYZ).

• Is the list sorted?sorted([]).sorted([_]).sorted([X,Y|Z]):-

X=<Y,sorted([Y|Z]).

• Y is a sorted permutation of X

permsort(X,Y):-perm(X,Y),sorted(Y).

• Will it work? Complexity?

Page 23: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 23

Problems with logic programming

• No real negation– P is False if it’s not provable– Works fine in many cases:

| ?- \+ man(anna). yes| ?- \+ man(john). no

– But! Shouldn’t this work?| ?- \+ X=0. no| ?- \+ man(X). no

– We would expect for example 1 and anna– What about this one?

| ?- \+ man(leif) ?

Page 24: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 24

More problems: cut• The cut (!) is used to cut branches in the search tree• If we pass a cut we may not backtrack• This makes prolog effective• BUT! The nice logic definitions are not as easy to understand any

more…• We can use cut to express:

D = if A then B else C• This is how to do i:

D :- A, !, B.D :- C.

• The more intuitive:D :- A, B.D :- \+A, B.

• Executes A twice

Page 25: Programming Language Theory Logic Programming

Dec 18. 2003 Logic Programming 25

Other problems in the book

• Some logical statements are not possible to express in Horn clauses:– p(a) and (x: not(p(x))

• Control of execution order– In some cases we know the best way to

calculate something, but in logic programming we are not able to specify the order things are done