Programming in Logic: Prolog: Lists and List Operations Readings: Sections 3.1 & 3.2
Programming in Logic: Prolog: Lists and List Operations Readings: Sections 3.1 & 3.2
Review
Declarative
semantics of pure Prolog program defines when a goal is true and for what instantiation of variables. Commas between goals mean and, semicolons mean or. Procedural semantics are determined by clause and goal ordering. Goal failure causes backtracking and unbinding of affected variables.
CS360 Lecture 4
Programming Patterns
Today We
You
CS360 Lecture 4
Prolog Lists
The
elements of a list can be anything including other lists. that atoms could be made from a sequence of special characters, the empty list is the special atom [ ].
Remember
CS360 Lecture 4
Lists
A
non-empty list always contains two things, a head and the tail. It is a structured data object. The functor name is . and its arity is 2. list consisting of the item 3 is: .(3,[ ])
The
CS360 Lecture 4
Lists contd
The
list consisting of the two items 3 and x is: .(3, .(x,[ ])) Lists are one of the most pervasive data structures in Prolog, so there is a special notation for them: [3, x]
CS360 Lecture 4
Lists contd
Often
want to describe beginning of list without specifying the rest of it. For example, .(3, .(x, T)) describes a list whose first two items are 3 and x, and whose remaining items could be anything (including empty). Prolog provides a special notation for doing this, |, e.g., [3,x |T]
CS360 Lecture 4
Lists
[3,
x | T] matches :
with
T=
Definition of List
List
definition:
CS360 Lecture 4
List Operations
Since
lists are an inductively defined data structure, expect operations to be inductively defined. common list operation is checking whether something is a member of the list.
One
member(Item, List)
CS360 Lecture 4
10
List Membership
If defining list membership inductively, need to figure out base case for list variable. Base case for defn of list is [ ], but not appropriate for base case of membership. Why? Need to look elsewhere. Whats the simplest case for deciding membership?
CS360 Lecture 4
11
List Membership
Its
the first item in the list. Maybe this can be our base case.
member(Item, List) :- List = [Item | _ ].
Prolog
is pattern-directed, i.e., does pattern matching, can use this to simplify base case:
member( I, [ I | _ ]).
CS360 Lecture 4
12
List Membership
What
if item is not the first one in list, then what? Then need to check if its in the tail.
member(I, [ _ | T ]) :- member(I, T).
Dont
No, because if we hit the empty list, then I is not in the list, so we should fail.
CS360 Lecture 4
13
List Membership
KB:
1. member(I, [ I | _ ]).
2. member(I, [_| T] :- member(I, T).
Query: member(x, [ ]).
Response: no
Execution Trace:
[member(x,[ ])]
CS360 Lecture 4
14
List Membership
KB:
1. member(I, [ I | _ ]).
2. member(I, [_| T] :- member(I, T).
Query: member(x, [ w, x]).
Response:
continue trace
Partial Execution Trace:
[member(x,[ w, x ])]
2. I=x, T=[x]
[member(x, [x])]
CS360 Lecture 4
15
List Membership
KB:
1. member(I, [ I | _ ]).
2. member(I, [_| T] :- member(I, T).
Query: member(X, [ w, x]).
Response:
X=w ? ;
Partial Execution Trace:
[member(X,[ w, x ])]
1. X=I, I=w
[]
continue trace
CS360 Lecture 4
16
List Concatenation
Define
relation conc(L1, L2, L3) where L3 is the result of concatenating L1 onto front of L2. is the base case?
What Go
CS360 Lecture 4
17
List Concatenation
List
defn base case is [ ], should this be our base case for defining concatenation? ], ?, ?) - what is the result of concatenating [ ] onto anything? Are there special cases? ], L2, L2).
CS360 Lecture 4 18
conc([
conc([
MB: 5 March 2001
List Concatenation
What
should the inductive step be? What was the inductive step for list defn? What should the head look like? conc([ I | L1], L2, [ I | L3]) Whats the relation between L1, L2, and L3? conc(L1, L2, L3)
CS360 Lecture 4
19
List Concatenation
Full
definition:
Try
What
have seen that one nice feature of logic programming is its absence of control. This means we can define one central relation and use it in a number of different ways. What it means depends upon which arguments are variables, partially variablized and/or constants. conc/3 is an example of such a central relation.
CS360 Lecture 4
21
L) :- conc(_, [ I | _ ], L).
sublist(SubList,
Clarity
We
dont really need to write defns for member /2 and last/2, could just use conc/3. have we gained by writing those definitions? write their definitions because we want it to be obvious what were trying to do!
CS360 Lecture 4 23
What
We
List Operations
Adds
Given
the following code: add(1,[ ],L1), add(2, L1,L2), add(3,L2,L3). What would be the binding for L3?
CS360 Lecture 4
24
List Operations
Deletes
del(Item, [Item| Tail], Tail). del(Item, [Y | Tail], [Y | Tail1]) :del(Item, Tail, Tail1).
del/2
is non-deterministic, what would del(1,[1,2,1,3,1],L). What would be the bindings for L if we repeatedly asked for new alternatives?
CS360 Lecture 4 25
Insert
insert/3
also non-deterministic, what would insert(x, [1,2,3], L) bind to L if repeatedly ask for alternatives?
CS360 Lecture 4
26
Permutation of a List
Lets
perm(List, Permutation).
Are
Look at examples.
What
CS360 Lecture 4
27
What
CS360 Lecture 4
28
should be our inductive case? should the head look like? the relationship between the different
Whats
parts?
CS360 Lecture 4
29
Permutation Defined
permutation([
],[ ]). permutation([X | L1], Perm) :permutation(L1, L2), insert(X, L2, Perm).
CS360 Lecture 4
30
Homework Quiz
Write
CS360 Lecture 4
31
Summary
If
data structure defined inductively then usually operations are defined inductively. However, sometimes the data structure base case does not make sense for the operation, then need to find new base case. First part of coming up with inductive case is finding what the head should be, often part of head is data structure inductive case.
MB: 5 March 2001 CS360 Lecture 4 32
Summary contd
Defining
relations in pure Prolog allows definitions to be used in many ways. However, when some uses have common name (e.g., last) then should define new relation from old using the common name.
CS360 Lecture 4
33