This section presents a few basic objects from list theory and array theory. We start with the idea of a discrete type, which is a type for which equality is decidable. Discreteness is required for the element comparisons that are needed, for example, in searching a list for a given element. Also, we need the idea that a proposition is decidable , i.e., that it is either true or false.
discrete(<T:type>) ==
all x,y:<T>. (x=y in <T>) | ~(x=y in <T>)
< P: T->prop > is decidable on <T:type> ==
all x:<T>. P(x) | ~P(x)
Figure The definition of the tail function is straightforward.
tl(<l:list>) == list_ind( <l>; nil; h,t,v. t )Given a function of the appropriate type, the first theorem (named `` generalize_to_list'') listed in figure
Figure: Defining the Sum of a List of Integers
The definition of the membership predicate for lists uses a recursive proposition .
<e:element> on <l:list> over <T:type> ==
list_ind( <l>; void; h,t,v. (<e>=h in <T>) | v )
>> all A:U1. all x:A. all l:A list.
(x on L over A) in U1
The above type of use of list_ind to define a proposition is
common and is worth a bit of explanation.
Suppose that ![]()
this type (proposition) is inhabited (true) exactly when one of the
is true.
The following is another example of a recursively defined proposition; it defines a predicate over lists of a certain type which is true of list l exactly when l has no repeated elements.
<l:list> is nonrepetitious over <T:type> ==
list_ind( <l>; one; h,t,v. ~(h on t over <T>) and v )
Given this definition, the following theorems are provable.
>> all A:U1. nil is nonrepetitious over A
>> all A:U1. all x:A. all l:A list.
~(x on l over A) & l is nonrepetitious over A
=> x.l is nonrepetitious over A
The next theorem defines a function which searches an array for the first occurrence of an element with a given property. (Arrays are taken to be functions on segments of the integers.)
search:
>> all A:U1. all n:int.
all f:{1,...,n}->A. all P:A->prop.
P is decidable on A
=> all k:int.
1<=k<=n
=> all x:{1,...,k}. ~P(f(x))
| some x:{1,...,k}. P(f(x))
& all y:{1,...,x-1}. ~P(f(y))