prolog - radford university | virginiamhtay/itec480/lecture_prolog/chapter_3_2010.pdf · in prolog,...

50
1/16/2010 1 Prolog Programming Chapter 3 Lists, Operators, Arithmetic

Upload: lamkien

Post on 19-Aug-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

1/16/2010

1

Prolog Programming

Chapter 3

Lists, Operators, Arithmetic

2

Chapter 3Lists, Operators, Arithmetic

Representation of lists

Some operations on lists

Operator notation

Arithmetic

3

3.1 Representation of lists

The list is a simple data structure widely used in non-

numeric programming

A list is a sequence of any number of items such as

ann, tennis, tom, skiing

In Prolog,

[ann, tennis, tom, skiing]

4

List as Object in Prolog

Two cases

Empty list

Non-empty list

List is written as a Prolog atom, [ ]

A non-empty list contains two things

head, the first item of the list

tail, the remaining part of the list

5

List looks like a tree

List can be written as

.(Head, Tail)

For example,

[ ann, tennis, tom, skiing ] can be written as

.( ann, .( tennis, .( tom, .( skiing, [ ] ) ) ) )

6

Tree representation of the list [ann,tennis,tom,skiing]

7

Examples

?- List1 = [a,b,c] ,

List2 = . ( a , . ( b , . (c , [ ] ) ) ) ).

List1 = [a,b,c]

List2 = [a,b,c]

?- Hobbies1 = . ( tennis, . ( music, [ ] ) ),

Hobbies2 = [ skiing, food ],

L = [ ann, Hobbies1, tom, Hobbies2 ]

Hobbies1 = [ tennis, music]

Hobbies2 = [ skiing, food ]

L = [ ann, [ tennis, music ], tom, [skiing, food] ]

8

More Examples

If L = [ a, b, c ]

Tail = [ b, c ] and L = . ( a, Tail )

Another notation,

L = [ a | Tail ]

[ a, b, c ] = [ a | [ b, c ] ] = [ a, b, [ c ] ] = [ a, b, c, | [ ] ]

In summary, lists can be written as

[ Item1, Item2, … ]

[ Head | Tail ]

[ Item1, Item2, … | Others ]

9

Chapter 3Lists, Operators, Arithmetic

Representation of lists

Some operations on lists

Operator notation

Arithmetic

10

3.2 Some Operations

Checking membership in a list

Concatenating two lists

Adding an item to a list and deleting an item from a list

11

Membership in a list

Define the membership as

member ( X , L )

where X is an object and L is a list

For example

member ( b, [ a, b, c ] ) true

member ( b, [ a, [ b, c ] ] ) not true

member ( [ b, c ], [ a, [ b, c ] ] ) true

12

Membership in a list continues ---

X is a member of L if either:

(1) X is the head of L, or

(2) X is a member of the tail of L

In Prolog,

member ( X, [ X | Tail ] ).

member ( X, [ Head | Tail ] ) :-

member ( X, Tail ).

13

Membership in a list continues ---

Questions to Prolog,

?- member ( b, [ a, b, c ] ) .

Yes

?- member ( X, [ a, b, c ] ) .

X=a

X=b

X=c

14

3.2 Some Operations

Checking membership in a list

Concatenating two lists

Adding an item to a list and deleting an item from a list

15

Concatenating two lists

Define the relation as follow:

conc(L1,L2,L3)

where L1 and L2 are two lists and L3 is their concatenation

In Prolog,

conc([ ], L1, L1).

conc([X|L1],L2,[X|L3] :-

conc(L1,L2,L3).

16

Concatenating two lists continues ---

Question to Prolog

?- conc ( [ a, b, c ] , [ d, e, f ], L ) .

L = [ a, b, c, d, e, f ]

Also concatenation relation can be used in the inverse

direction for decomposition a given list into two lists

17

Decomposition a given list into two lists using concatenation

?- conc(L1,L2,[a,b,c]).

L1=[ ]

L2=[a,b,c]

L1=[a]

L2=[b,c]

L1=[a,b]

L2=[c]

L1=[a,b,c]

L2=[ ]

18

Look for a certain pattern in a listusing concatenation

?- conc(Before,[may|After],

[jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec]).

Before=["jan","feb","mar","apr"]

After=["jun","jul","aug","sep","oct","nov","dec"

19

Delete from a list using concatenation

?- L1=[a,b,z,z,c,z,z,z,d,e],

conc(L2,[z,z,z|_],L1).

Delete everything that follows three successive

occurrences of z in list L1

L1=["a","b","z","z","c","z","z","z","d","e"],

L2=["a","b","z","z","c"]

20

Check membership using concatenation

member1 ( X , L ) :-

conc ( _ , [ X | _ ] , L ) .

?- member1(X,[a,b,c])

X=a

X=b

X=c

21

Adding an item

In Prolog,

add ( X, L, [ X | L ] ) .

where X is a new item and it is added to the list L

Question

?- add ( a, [ b, c ], L ) .

L=["a","b","c"]

22

Deleting an item

Deleting an item X from a list L

del ( X, L, L1 ).

where L1 is a new list after X is removed from the list L

There are two cases as follows:

(1) If X is the head of the list then the result after the

deletion is the tail of the list

(2) If X is in the tail then it is deleted from there

23

Deleting an item continue ---

In Prolog,

del ( X, [ X | Tail ], Tail ) . % case 1

del ( X, [ Y | Tail ], [ Y | Tail1 ] ) : - % case 2

del ( X, Tail,Tail1 ) .

Question

?- del ( a, [a, b, a, a ], L ).

L=["b","a","a"]

L=["a","b","a"]

L=["a","b","a"]

24

Add an item to a list by using delete

“del” can be used in the inverse direction, to add an item

to a list by inserting the new item anywhere in the list

What is L, such that after deleting 5 from L, obtain [2,3,4]?

Question

?- del ( 5, L, [ 2, 3, 4 ] ) .

L=[5,1,2,3]

L=[1,5,2,3]

L=[1,2,5,3]

L=[1,2,3,5]

25

Inserting an item to a list and checking membership using delete

We define “insert” relation as follows:

insert ( X, List, BiggerList ) :-

del ( X, BiggerList, List ) .

We can also define membership relation using del

member2 ( X, List ) :-

del ( X, List, _ ) .

26

Sublist

Sublist relation has two arguments, a list L and a list S

such that S occurs within L as its sublist

sublist ( S, L )

Examples,

sublist([c, d, e ] , [ a, b, c, d, e, f ] ) true

sublist([c, e ] , [ a, b, c, d, e, f ] ) not true

27

Sublist continues ---

S is a sublist of L if:

(1) L can be decomposed into two lists, L1 and L2 and

(2) L2 can be decomposed into two lists, S and some L3

In Prolog,

sublist ( S, L ) :-

conc ( L1, L2, L ) ,

conc ( S, L3, L2 ) .

28

Sublist continues ---

Question

?- sublist ( S, [ a, b, c ] ) .S=[]

S=["a"]

S=["a","b"]

S=["a","b","c"]

S=[]

S=["b"]

S=["b","c"]

S=[]

S=["c"]

S=[]

29

Permutations

Permutation relation is defined with two arguments such

as permutation(L,P) where P is a permutation of list L

There are two cases:

If the first list is empty then the second list must also be

empty

If the first list is not empty then it has the form [X|L] and

first permute L, obtaining L1 and then insert X at any

position into L1

30

Defining ‘permutation’ in Prolog

In Prolog,

permutation ( [ ], [ ] ) . %case 1

permutation ( [ X | L ], P ) : - %case 2

permutation ( L, L1 ) ,

insert ( X, L1, P) .

31

Alternative definition for permutation

In Prolog,

permutation2 ( [ ], [ ] ) . %case 1

permutation2 (L, [ X | P ] ) : - %case 2

del ( X, L, L1) ,

permutation2 ( L1, P ) .

32

Question to prolog

?- permutation2 ( [ a, b, c ], P ) .

P=["a","b","c"]

P=["a","c","b"]

P=["b","a","c"]

P=["b","c","a"]

P=["c","a","b"]

P=["c","b","a"]

33

Chapter 3Lists, Operators, Arithmetic

Representation of lists

Some operations on lists

Operator notation

Arithmetic

34

3.3 Operator notation

The operator with the highest precedence is the

principle functor of the term

A programmer can define his own operators.

Examples,

For the expression 2 * a + b * c can be written as

+ ( * ( 2 , a ) , ( b , c ) )

For the expression, peter has information is written as

has ( peter , information )

35

Operator definition

A programmer can define new operators by inserting into

the program special kinds of clauses, sometimes called

directives, which act as operator definitions.

:- op(600,xfx,has)

where „has‟ as an operator, whose precedence is 600,

and its type is xfx, which is a kind of infix operator.

36

Operator definition continues ---

operator names are atoms

precedence is in the range between 1 and 1200

three groups of operators are infix, prefix and postfix

37

Three groups of operator types

infix operators of three types:

x f x x f y y f x

prefix operators of two types:

f x f y

postfix operators of two types

x f y f

38

Some Predefined Operators

:-op(1200,sfs,[:-,-->]).

:-op(1200,fx, [:-,?-]).

:-op(1100,xfy,‟;‟).

:-op(1050,xfy,‟->‟).

:-op(1000,xfy,‟,‟).

:-op(900,fy,[not,‟\+‟]).

etc ...

39

Summary

Operators can be infix, prefix, or postfix

operators, as functors, only hold together components of

structures

A programmer can define his or her own operators. Each

operator is defined by its name, precedence and type.

The precedence is an integer within some range, usually

between 1 and 1200.

The type of an operator depends on two things:

the position of the operator with respect to the argument

the precedence of the arguments compared to the precedence of

the operator itself

40

3.4 Arithmetics

Some predefined operators:

+ addition

- subtraction

* multiplication

/ division

** power

// integer division

mod modulo, the remainder of integer division

41

Expression and questions

For the expression

X = 1 + 2

In Prolog,

?- X is 1 + 2.

X = 3

In Visual Prolog,

Goal

X = 1 + 2 .

Answer

X = 3

42

Comparing numerical values

Clause

born(george, 1955).

born(mary,1975).

born(joyce,1962).

Goal

born(Name,Year),

Year >= 1950,

Year <= 1960.

Answer

Name=george, Year=1955

43

Comparing operators

> greater than

< less than

>= greater than or equal

=< less than or equal ( in Visual Prolog <= )

=:= equal ( in Visual Prolog, = )

=\= not equal ( in Visual Prolog, just <> or >< )

44

Greatest Common Divisor Problem

For given integers X and Y, suppose that D is the

greatest common divisor of X and Y, there are three

cases :

(1) If X and Y are equal then D is equal to X

(2) If X < Y then D is equal to the greatest common

divisor of X and the difference Y - X

(3) If Y < X then do the same as in case 2 with X and Y

interchanged

45

In Prolog

gcd(X,X,X).

gcd(X,Y,D) :-

X < Y,

Y1 = Y - X ,

gcd(X, Y1, D).

gcd(X,Y,D) :-

Y < X ,

gcd(Y, X, D).

46

Length of a list

length ( [ ], 0 ) .

length( [ _ | Tail ], N ) :-

length ( Tail , N1 ),

N = N1 + 1.

Question to Prolog

?- length([b,c,d,e],N).

Answer

N=4

47

Think about some problems

Define the relation max ( X, Y, MAX ) where Max is the

greater of two numbers X and Y

Define the predicate sumlist ( List, Sum ) where Sum is

the sum of a given list of numbers List

Define the predicate ordered ( List ) which is true if List

is an ordered of numbers.

48

max

max ( X, Y, X ) :-

X >= Y.

max ( X, Y, Y ) :-

X < Y.

49

sumlist

sumlist([],0).

sumlist([First|Rest],Sum) :-

sumlist(Rest,SumRest),

Sum is First + SumRest.

50

ordered

ordered([X]).

ordered([X,Y|Rest]) :-

X <= Y,

ordered([Y|Rest]).