We prove in
-PRL that every non-empty list of integers has a
maximal element.
__{{}}\
l:list. (
(l=[]) 
i:int. (i
l 
j:int. (j
l
j
i)))
We give a
-PRL definition of the predicate __{{}}\
i
l:
__{{}}\
i
l 
k:int. (index(k,l)=i
0
k
k
length(l))
We prove the above statement
-PRL's refinement logic:
__{{}}\

l:list. (
(l=[]) 
i:int. (i
l 
j:int. (j
l
j
i)))
| by induction x::l
|
| 
([]=[]) 
i:int. (i
[] 
j:int. (j
[]
j
i))
| | by impR
| 1.
([]=[])
| 
i:int. (i
[] 
j:int. (j
[]
j
i))
| | by notL 1
|
|
[]=[]
| by equality
|
| 1. x:int
| 
([x]=[]) 
i:int. (i
[x] 
j:int. (j
[x]
j
i))
| | by impR
|
| 2.
([x]=[])
| 
i:int. (i
[x] 
j:int. (j
[x]
j
i))
| | by exR x
|
|
x
[x] 
j:int. (j
[x]
j
x)
| | by andR
| |
| |
| |
x
[x]
| | | by unfold
in 0
| |
| | 
k:int. (index(k,[x])=i
0
k
k
length([x]))
| | | by exR 0
| |
| |
index(0,[x])=x
0
0
0
length([x])
| | | by simplify in 0
| |
| |
x=x
0
0
0
1
| | by arith
|
|
| 
j:int. (j
[x]
j
x)
| | by allR
|
| 3. j:int
|
j
[x]
j
x
| | by impR
| |
|
| 4. j
[x]
|
j
x
| | by unfold
in 4
|
| 4.
k:int. (index(k,[x])=j
0
k
k
length([x]))
|
j
x
| | by exL 4
| |
|
| 4. k:int
| 5. index(k,[x])=j
0
k
k
length([x])
|
j
x
| | by simplify in 5
|
| 5. index(k,[x])=j
0
k
k
1
|
j
x
| | by andL 5
|
| 5. index(k,[x])=j
| 6. 0
k
| 7. k
1
|
j
x
| | by cut k=0
| |
| |
| |
k=0
| | by arith
|
|
| 8. k=0
|
j
x
| | by cut index(k,[x])=j
| |
| |
| |
index(k,[x])=j
| | by hyp 5
|
|
| 9. index(k,[x])=j
|
j
x
| | by subst 8 9
|
| 9. index(0,[x])=j
|
j
x
| | by simplify 9
|
| 9. x=j
|
j
x
| by arith
1. x:int
2. l:list
3.
(l=[]) 
i:int. (i
l 
j:int. (j
l
j
i))

(x::l=[]) 
i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by cut (l=[]) 
(l=[])
|
|
|
(l=[]) 
(l=[])
| by equality
4. (l=[]) 
(l=[])

(x::l=[]) 
i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by orL 4
|
|
| 4. l=[]
| 
(x::l=[]) 
i:int. (i
x::l 
j:int. (j
x::l
j
i))
| | by subst 4 0
|
| 
i:int. (i
x::[] 
j:int. (j
x::[]
j
i))
| | by simplify 0
| |
|
| 
i:int. (i
[x] 
j:int. (j
[x]
j
i))
| by proof of previous case
|
4.
(l=[])

(x::l=[]) 
i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by impR
5.
(x::l=[])

i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by impL 3
|
|
| 
(l=[])
| by hyp 4
3.
(l=[])
4.
(x::l=[])
5.
(l=[])
6.
i:int. (i
l 
j:int. (j
l
j
i))

i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by exL 6
6. i:int
7. i
l 
j:int. (j
l
j
i)

i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by andL 7
7. i
l
8.
j:int. (j
l
j
i)

i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by unfold
7
7.
k:int. (index(k,l)=i
0
k
k
length(x::l))
8.
j:int. (j
l
j
i)

i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by exL 7
7. k:int
8. index(k,l)=i
0
k
k
length(x::l)
9.
j:int. (j
l
j
i)

i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by andL 8
8. index(k,l)=i
9. 0
k
10. k
length(x::l)
11.
j:int. (j
l
j
i)

i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by simplify 10
8. index(k,l)=i
9. 0
k
10. k
length(l)+1
11.
j:int. (j
l
j
i)

i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by cut (x
i)
(x
i)
|
|
|
(x
i)
(x
i)
| by arith
|
12. (x
i)
(x
i)

i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by orL 12
|
|
| 12. x
i
| 
i:int. (i
x::l 
j:int. (j
x::l
j
i))
| | by exR i
|
|
i
x::l 
j:int. (j
x::l
j
i)
| | by andR
| |
| |
| |
i
x::l
| | | by unfold
in 0
| |
| | 
k:int. (index(k,x::l)=i
0
k
k
length(x::l))
| | | by exR k+1
| |
| |
index(k+1,x::l)=i
0
k+1
k+1
length(x::l)
| | | by def index(k+1,x::l) up
| | |
| | |
| | |
0
k+1
| | | by arith
| |
| |
| | 13. 0
k+1
| | 14. index(k+1,x::l) = index(k+1-1,tl(x::l))
| |
index(k+1,x::l)=i
0
k+1
k+1
length(x::l)
| | | by subst 14 0
| |
| |
index(k+1-1,tl(x::l))=i
0
k+1
k+1
length(x::l)
| | | by simplify 0
| |
| |
index(k,l)=i
0
k+1
k+1
length(l)+1
| | by arith
|
|
| 
j:int. (j
x::l
j
i)
| | by allR
|
| 13. j: int
|
j
x::l
j
i
| | by impR
|
| 14. j
x::l
|
j
i
| | by unfold
in 14
|
| 14.
k:int. (index(k,x::l)=j
0
k
k
length(x::l))
|
j
i
| | exL 14
|
| 14. k':int
| 15. index(k',x::l)=j
0
k'
k'
length(x::l))
|
j
i
| | andL 15
| |
|
| 15. index(k',x::l)=j
| 16. 0
k'
| 17. k'
length(x::l))
|
j
i
| | by simplify 17
|
| 17. k'
length(l)+1
|
j
i
| | cut k'=0
k'
0
| |
| |
| |
k'=0
k'
0
| | by arith
|
|
| 18. k'=0
k'
0
|
j
i
| | by orL 18
| |
| |
| | 18. k'=0
| |
j
i
| | | by cut index(k',x::l)=j
| | |
| | |
| | |
index(k',x::l)=j
| | | by hyp 15
| |
| |
| | 19. index(k',x::l)=j
| |
j
i
| | | by subst 18 19
| |
| | 19. index(0,x::l)=j
| |
j
i
| | | by simplify 19
| |
| | 19. x=j
| |
j
i
| | by arith
|
|
| 18. k'
0
|
j
i
| | by allL 11 j
|
| 19. j
l
j
i
|
j
i
| | by impL 19
| |
| |
| |
j
l
| | | by unfold
in 0
| |
| | 
k:int. (index(k,l)=j
0
k
k
length(l))
| | | by exR k'-1
| |
| |
index(k'-1,l)=j
0
k'-1
k'-1
length(l)
| | | by def index(k',x::l) up
| | |
| | |
| | |
0
k'
| | | by hyp 18
| | |
| |
| |
| | 20. 0
k'
| | 21. index(k',x::l) = index(k'-1,tl(x::l))
| |
index(k'-1,l)=j
0
k'-1
k'-1
length(l)
| | | by simplify 21
| |
| | 21. index(k',x::l) = index(k'-1,l)
| |
index(k'-1,l)=j
0
k'-1
k'-1
length(l)
| | by arith
|
| 19. j
l
| 20. j
i
|
j
i
| by hyp 20
12. x
i

i:int. (i
x::l 
j:int. (j
x::l
j
i))
| by exR x
x
x::l 
j:int. (j
x::l
j
x)
| by andR
|
|
|
x
x::l
| | by unfold
in 0
|
| 
k:int. (index(k,x::l)=x
0
k
k
length(x::l))
| | by exR 0
|
|
index(0,x::l)=x
0
0
0
length(x::l)
| | by simplify 0
|
|
x=x
0
0
0
length(l)+1
| by arith

j:int. (j
x::l
j
x)
| by allR
13. j:int
j
x::l
j
x
| by impR
14. j
x::l
j
x
| by unfold
in 14
14.
k:int. (index(k,x::l)=j
0
k
k
length(x::l))
j
x
| by exL 14
14. k':int
15. index(k',x::l)=j
0
k'
k'
length(x::l)
j
x
| by andL 15
15. index(k',x::l)=j
16. 0
k'
17. k'
length(x::l)
j
x
| by simplify 17
|
17. k'
length(l)+1
j
x
| by cut k'=0
k'
0
|
|
|
k'=0
k'
0
| by arith
18. k'=0
k'
0
j
x
| by orL 18
|
|
| 18. k'=0
|
j
x
| | by cut index(k',x::l)=j
| |
| |
| |
index(k',x::l)=j
| | by hyp 15
|
|
| 19. index(k',x::l)=j
|
j
x
| | by subst 18 19
|
| 19. index(0,x::l)=j
|
j
x
| | by simplify 19
|
| 19. x=j
|
j
x
| by arith
18. k'
0
j
x
| by allL 11 j
19. j
l
j
i
j
x
| by impL 19
|
|
|
j
l
| | by unfold
in 0
|
| 
k:int. (index(k,l)=j
0
k
k
length(l))
| | exR k'-1
|
|
index(k'-1,l)=j
0
k'-1
k'-1
length(l))
| | by def index(k',x::l) up
| |
| |
| |
0
k'
| | by hyp 18
|
|
| 20. 0
k'
| 21. index(k',x::l) = index(k'-1,tl(x::l))
|
index(k'-1,l)=j
0
k'-1
k'-1
length(l))
| | by simplify 21
| |
|
| 20. 0
k'
| 21. index(k',x::l) = index(k'-1,l)
|
index(k'-1,l)=j
0
k'-1
k'-1
length(l))
| by arith
19. j
l
20. j
i
j
x
by arith
We describe the extracted algorithm in
-PRL notation.
__{{}}\
listmax(l:list):int
0 => 0
1 => hd(l)
l => if tl(l)
[]
then hd(l)
else if hd(l)
listmax(tl(l))
then listmax(tl(l))
else hd(l)