Declarative Programming Prolog CS360 - Drexel University

40
Declarative Programming Prolog CS360

Transcript of Declarative Programming Prolog CS360 - Drexel University

Page 1: Declarative Programming Prolog CS360 - Drexel University

Declarative ProgrammingProlog

CS360

Page 2: Declarative Programming Prolog CS360 - Drexel University

Terms

v Numerical literalsv String literals

Ø By default, any string that starts is all lowercaseØ Use single quotes for anything else

v AtomsØ Essentially, stringsØ Also, name of functors

Page 3: Declarative Programming Prolog CS360 - Drexel University

Usage Details

v Use “.” to end a statementv Use “,” to separate clauses, args, etc.v ctrl-D to exit (or, finish input)v consult( file ) (or [file]) to read a

fileØ Put filename in single quotesØ consult( user ) (or [user]) to read

stdin

Page 4: Declarative Programming Prolog CS360 - Drexel University

Some Handy Predicates

v working_directory/1v change_directory/1v trace , notracev listing/1

Page 5: Declarative Programming Prolog CS360 - Drexel University

Compound Terms

v Look like function callsØ They’re notØ Just statements

v Called predicatesØOnly returns true or false

v Attempts to check the verity of a predicate using resolution

Page 6: Declarative Programming Prolog CS360 - Drexel University

Common Operatorsv Relational (on numbers):=:= =\= < =< > >=

v More general relational:== \== @< @=< @> @>=

v These are not predicates:

+ - * / ** //v Syntactic Sugar:

Ø +( a, b ) is the same as a + b

Page 7: Declarative Programming Prolog CS360 - Drexel University

As a Calculator

v Does not return the value of an expression:

| ?- 2 + 3.

uncaught exception: error(existence_error(procedure,(+)/2),top_level/0)

v Use the is predicateØ Only verifies a statement:| ?- is(5, 2+3).

yes

Page 8: Declarative Programming Prolog CS360 - Drexel University

Unification

v Binding variables to valuesv (Variables are any string that starts w/a

capital letter or “_”)

| ?- is( X, 5+12 ).

X = 17

yes

Page 9: Declarative Programming Prolog CS360 - Drexel University

A Better Example (parents.pl)

v Let’s define some facts:| ?- [user].

compiling user for byte code...

parent( kim, holly ).

parent( margaret, kim ).

parent( margaret, kent ).

parent( esther, margaret ).

parent( herbert, margaret ).

parent( herbert, jean ).

user compiled, 7 lines read - 743 bytes written, 14218 ms

Page 10: Declarative Programming Prolog CS360 - Drexel University

Simple Queriesv We enter a query, or goal:| ?- parent( esther, margaret ).

v Prolog looks through the DB, in order, to find a fact that matches the query. Found, so

yes

v If it fails to find one:| ?- parent( esther, snoopy ).

no

Page 11: Declarative Programming Prolog CS360 - Drexel University

Variables

v Prolog looks for bindings to prove a given query

v Find all of Margaret’s children:

| ?- parent( margaret, X ).X = kim ? ;X = kentyes

Page 12: Declarative Programming Prolog CS360 - Drexel University

More Prolog Details - ;

v Use the semicolon to see the next binding prolog finds to resolve the query

v Hit [enter] to stop looking:

| ?- parent( margaret, X ).

X = kim ?

yes

Page 13: Declarative Programming Prolog CS360 - Drexel University

Look for Parents

v Find all of Margaret’s parents:

| ?- parent( X, margaret ).

X = esther ? ;

X = herbert ? ;

no

Page 14: Declarative Programming Prolog CS360 - Drexel University

Conjunction of Terms

v Query can be a list of termsØ Treated as a logical conjunction of the terms

v Find all who have both Esther and Herbert as parents:

| ?- parent( esther, X ), parent( herbert, X ).

X = margaret ? ;

no

Ø Note, X is the same variable in both terms§ “_” is special; a wildcard. Each instance is bound

independently

Page 15: Declarative Programming Prolog CS360 - Drexel University

Horn Clauses

v Statements of the form:

B :- A1, A2, … , An.Ø B is called the headØ A1, A2, … , An is the body

v A clause w/out a body is always trueØ Axiom, or fact

v A clause w/out a head is a query or goal

Page 16: Declarative Programming Prolog CS360 - Drexel University

More Conjunctionv Find all of Kim’s grandparents:

| ?- parent( G, P ), parent( P, kim ).

G = esther

P = margaret ? ;

G = herbert

P = margaret ? ;

G = tom

P = dave

(15 ms) yes

Page 17: Declarative Programming Prolog CS360 - Drexel University

Rulesv We can create more interesting rules, to

prove more complex relations:

| ?- [user].

compiling user for byte code...

ancestor( A, D ) :- parent( A, X ), ancestor( X, D ).

ancestor( A, A ).

Page 18: Declarative Programming Prolog CS360 - Drexel University

GCD

gcd(U,0,U).

gcd(U,V,W) :- V=\=0, R is U mod V, gcd(V,R,W).

| ?- gcd( 15, 6, X ).

X = 3 ?

| ?- gcd( X, 6, 3 ).

uncaught exception: error(instantiation_error,(is)/2)

Page 19: Declarative Programming Prolog CS360 - Drexel University

Lists

v [] – empty listv [ 1, 2, 3 ] – finite listv [X | Y]

Ø X is the first elementØ Y is the rest

Page 20: Declarative Programming Prolog CS360 - Drexel University

Examples

v member.plv lookup.plv append.plv sort.pl

Page 21: Declarative Programming Prolog CS360 - Drexel University

Declarative ProgrammingProlog

CS360

Page 22: Declarative Programming Prolog CS360 - Drexel University

Terms

v Numerical literalsv String literals

Ø By default, any string that starts is all lowercaseØ Use single quotes for anything else

v AtomsØ Essentially, stringsØ Also, name of functors

Page 23: Declarative Programming Prolog CS360 - Drexel University

Usage Details

v Use “.” to end a statementv Use “,” to separate clauses, args, etc.v ctrl-D to exit (or, finish input)v consult( file ) (or [file]) to read a

fileØ Put filename in single quotesØ consult( user ) (or [user]) to read

stdin

Page 24: Declarative Programming Prolog CS360 - Drexel University

Some Handy Predicates

v working_directory/1v change_directory/1v trace , notracev listing/1

Page 25: Declarative Programming Prolog CS360 - Drexel University

Compound Terms

v Look like function callsØ They’re notØ Just statements

v Called predicatesØOnly returns true or false

v Attempts to check the verity of a predicate using resolution

Page 26: Declarative Programming Prolog CS360 - Drexel University

Common Operatorsv Relational (on numbers):=:= =\= < =< > >=

v More general relational:== \== @< @=< @> @>=

v These are not predicates:

+ - * / ** //v Syntactic Sugar:

Ø +( a, b ) is the same as a + b

Page 27: Declarative Programming Prolog CS360 - Drexel University

As a Calculator

v Does not return the value of an expression:

| ?- 2 + 3.

uncaught exception: error(existence_error(procedure,(+)/2),top_level/0)

v Use the is predicateØ Only verifies a statement:| ?- is(5, 2+3).

yes

Page 28: Declarative Programming Prolog CS360 - Drexel University

Unification

v Binding variables to valuesv (Variables are any string that starts w/a

capital letter or “_”)

| ?- is( X, 5+12 ).

X = 17

yes

Page 29: Declarative Programming Prolog CS360 - Drexel University

A Better Example (parents.pl)

v Let’s define some facts:| ?- [user].

compiling user for byte code...

parent( kim, holly ).

parent( margaret, kim ).

parent( margaret, kent ).

parent( esther, margaret ).

parent( herbert, margaret ).

parent( herbert, jean ).

user compiled, 7 lines read - 743 bytes written, 14218 ms

Page 30: Declarative Programming Prolog CS360 - Drexel University

Simple Queriesv We enter a query, or goal:| ?- parent( esther, margaret ).

v Prolog looks through the DB, in order, to find a fact that matches the query. Found, so

yes

v If it fails to find one:| ?- parent( esther, snoopy ).

no

Page 31: Declarative Programming Prolog CS360 - Drexel University

Variables

v Prolog looks for bindings to prove a given query

v Find all of Margaret’s children:

| ?- parent( margaret, X ).X = kim ? ;X = kentyes

Page 32: Declarative Programming Prolog CS360 - Drexel University

More Prolog Details - ;

v Use the semicolon to see the next binding prolog finds to resolve the query

v Hit [enter] to stop looking:

| ?- parent( margaret, X ).

X = kim ?

yes

Page 33: Declarative Programming Prolog CS360 - Drexel University

Look for Parents

v Find all of Margaret’s parents:

| ?- parent( X, margaret ).

X = esther ? ;

X = herbert ? ;

no

Page 34: Declarative Programming Prolog CS360 - Drexel University

Conjunction of Terms

v Query can be a list of termsØ Treated as a logical conjunction of the terms

v Find all who have both Esther and Herbert as parents:

| ?- parent( esther, X ), parent( herbert, X ).

X = margaret ? ;

no

Ø Note, X is the same variable in both terms§ “_” is special; a wildcard. Each instance is bound

independently

Page 35: Declarative Programming Prolog CS360 - Drexel University

Horn Clauses

v Statements of the form:

B :- A1, A2, … , An.Ø B is called the headØ A1, A2, … , An is the body

v A clause w/out a body is always trueØ Axiom, or fact

v A clause w/out a head is a query or goal

Page 36: Declarative Programming Prolog CS360 - Drexel University

More Conjunctionv Find all of Kim’s grandparents:

| ?- parent( G, P ), parent( P, kim ).

G = esther

P = margaret ? ;

G = herbert

P = margaret ? ;

G = tom

P = dave

(15 ms) yes

Page 37: Declarative Programming Prolog CS360 - Drexel University

Rulesv We can create more interesting rules, to

prove more complex relations:

| ?- [user].

compiling user for byte code...

ancestor( A, D ) :- parent( A, X ), ancestor( X, D ).

ancestor( A, A ).

Page 38: Declarative Programming Prolog CS360 - Drexel University

GCD

gcd(U,0,U).

gcd(U,V,W) :- V=\=0, R is U mod V, gcd(V,R,W).

| ?- gcd( 15, 6, X ).

X = 3 ?

| ?- gcd( X, 6, 3 ).

uncaught exception: error(instantiation_error,(is)/2)

Page 39: Declarative Programming Prolog CS360 - Drexel University

Lists

v [] – empty listv [ 1, 2, 3 ] – finite listv [X | Y]

Ø X is the first elementØ Y is the rest

Page 40: Declarative Programming Prolog CS360 - Drexel University

Examples

v member.plv lookup.plv append.plv sort.pl