We prove in -PRL that every non-empty list of integers has a
maximal element.
__{{}}\
l:list. ((l=[]) i:int. (il j:int. (jl ji)))
We give a -PRL definition of the predicate __{{}}\
il:
__{{}}\
il k:int. (index(k,l)=i 0k klength(l))
We prove the above statement -PRL's refinement logic:
__{{}}\
l:list. ((l=[]) i:int. (il j:int. (jl ji)))
| by induction x::l
|
| ([]=[]) i:int. (i[] j:int. (j[] ji))
| | by impR
| 1. ([]=[])
| i:int. (i[] j:int. (j[] ji))
| | by notL 1
|
| []=[]
| by equality
|
| 1. x:int
| ([x]=[]) i:int. (i[x] j:int. (j[x] ji))
| | by impR
|
| 2. ([x]=[])
| i:int. (i[x] j:int. (j[x] ji))
| | by exR x
|
| x[x] j:int. (j[x] jx)
| | by andR
| |
| |
| | x[x]
| | | by unfold in 0
| |
| | k:int. (index(k,[x])=i 0k klength([x]))
| | | by exR 0
| |
| | index(0,[x])=x 00 0length([x])
| | | by simplify in 0
| |
| | x=x 00 01
| | by arith
|
|
| j:int. (j[x] jx)
| | by allR
|
| 3. j:int
| j[x] jx
| | by impR
| |
|
| 4. j[x]
| jx
| | by unfold in 4
|
| 4. k:int. (index(k,[x])=j 0k klength([x]))
| jx
| | by exL 4
| |
|
| 4. k:int
| 5. index(k,[x])=j 0k klength([x])
| jx
| | by simplify in 5
|
| 5. index(k,[x])=j 0k k1
| jx
| | by andL 5
|
| 5. index(k,[x])=j
| 6. 0k
| 7. k1
| jx
| | by cut k=0
| |
| |
| | k=0
| | by arith
|
|
| 8. k=0
| jx
| | by cut index(k,[x])=j
| |
| |
| | index(k,[x])=j
| | by hyp 5
|
|
| 9. index(k,[x])=j
| jx
| | by subst 8 9
|
| 9. index(0,[x])=j
| jx
| | by simplify 9
|
| 9. x=j
| jx
| by arith
1. x:int
2. l:list
3. (l=[]) i:int. (il j:int. (jl ji))
(x::l=[]) i:int. (ix::l j:int. (jx::l ji))
| by cut (l=[]) (l=[])
|
|
| (l=[]) (l=[])
| by equality
4. (l=[]) (l=[])
(x::l=[]) i:int. (ix::l j:int. (jx::l ji))
| by orL 4
|
|
| 4. l=[]
| (x::l=[]) i:int. (ix::l j:int. (jx::l ji))
| | by subst 4 0
|
| i:int. (ix::[] j:int. (jx::[] ji))
| | by simplify 0
| |
|
| i:int. (i[x] j:int. (j[x] ji))
| by proof of previous case
|
4. (l=[])
(x::l=[]) i:int. (ix::l j:int. (jx::l ji))
| by impR
5. (x::l=[])
i:int. (ix::l j:int. (jx::l ji))
| by impL 3
|
|
| (l=[])
| by hyp 4
3. (l=[])
4. (x::l=[])
5. (l=[])
6. i:int. (il j:int. (jl ji))
i:int. (ix::l j:int. (jx::l ji))
| by exL 6
6. i:int
7. il j:int. (jl ji)
i:int. (ix::l j:int. (jx::l ji))
| by andL 7
7. il
8. j:int. (jl ji)
i:int. (ix::l j:int. (jx::l ji))
| by unfold 7
7. k:int. (index(k,l)=i 0k klength(x::l))
8. j:int. (jl ji)
i:int. (ix::l j:int. (jx::l ji))
| by exL 7
7. k:int
8. index(k,l)=i 0k klength(x::l)
9. j:int. (jl ji)
i:int. (ix::l j:int. (jx::l ji))
| by andL 8
8. index(k,l)=i
9. 0k
10. klength(x::l)
11. j:int. (jl ji)
i:int. (ix::l j:int. (jx::l ji))
| by simplify 10
8. index(k,l)=i
9. 0k
10. klength(l)+1
11. j:int. (jl ji)
i:int. (ix::l j:int. (jx::l ji))
| by cut (x i) (x i)
|
|
| (x i) (x i)
| by arith
|
12. (x i) (x i)
i:int. (ix::l j:int. (jx::l ji))
| by orL 12
|
|
| 12. x i
| i:int. (ix::l j:int. (jx::l ji))
| | by exR i
|
| ix::l j:int. (jx::l ji)
| | by andR
| |
| |
| | ix::l
| | | by unfold in 0
| |
| | k:int. (index(k,x::l)=i 0k klength(x::l))
| | | by exR k+1
| |
| | index(k+1,x::l)=i 0k+1 k+1length(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 0k+1 k+1length(x::l)
| | | by subst 14 0
| |
| | index(k+1-1,tl(x::l))=i 0k+1 k+1length(x::l)
| | | by simplify 0
| |
| | index(k,l)=i 0k+1 k+1length(l)+1
| | by arith
|
|
| j:int. (jx::l ji)
| | by allR
|
| 13. j: int
| jx::l ji
| | by impR
|
| 14. jx::l
| ji
| | by unfold in 14
|
| 14. k:int. (index(k,x::l)=j 0k klength(x::l))
| ji
| | exL 14
|
| 14. k':int
| 15. index(k',x::l)=j 0k' k'length(x::l))
| ji
| | andL 15
| |
|
| 15. index(k',x::l)=j
| 16. 0k'
| 17. k'length(x::l))
| ji
| | by simplify 17
|
| 17. k'length(l)+1
| ji
| | cut k'=0 k'0
| |
| |
| | k'=0 k'0
| | by arith
|
|
| 18. k'=0 k'0
| ji
| | by orL 18
| |
| |
| | 18. k'=0
| | ji
| | | by cut index(k',x::l)=j
| | |
| | |
| | | index(k',x::l)=j
| | | by hyp 15
| |
| |
| | 19. index(k',x::l)=j
| | ji
| | | by subst 18 19
| |
| | 19. index(0,x::l)=j
| | ji
| | | by simplify 19
| |
| | 19. x=j
| | ji
| | by arith
|
|
| 18. k'0
| ji
| | by allL 11 j
|
| 19. jl ji
| ji
| | by impL 19
| |
| |
| | jl
| | | by unfold in 0
| |
| | k:int. (index(k,l)=j 0k klength(l))
| | | by exR k'-1
| |
| | index(k'-1,l)=j 0k'-1 k'-1length(l)
| | | by def index(k',x::l) up
| | |
| | |
| | | 0k'
| | | by hyp 18
| | |
| |
| |
| | 20. 0k'
| | 21. index(k',x::l) = index(k'-1,tl(x::l))
| | index(k'-1,l)=j 0k'-1 k'-1length(l)
| | | by simplify 21
| |
| | 21. index(k',x::l) = index(k'-1,l)
| | index(k'-1,l)=j 0k'-1 k'-1length(l)
| | by arith
|
| 19. jl
| 20. ji
| ji
| by hyp 20
12. xi
i:int. (ix::l j:int. (jx::l ji))
| by exR x
xx::l j:int. (jx::l jx)
| by andR
|
|
| xx::l
| | by unfold in 0
|
| k:int. (index(k,x::l)=x 0k klength(x::l))
| | by exR 0
|
| index(0,x::l)=x 00 0length(x::l)
| | by simplify 0
|
| x=x 00 0length(l)+1
| by arith
j:int. (jx::l jx)
| by allR
13. j:int
jx::l jx
| by impR
14. jx::l
jx
| by unfold in 14
14. k:int. (index(k,x::l)=j 0k klength(x::l))
jx
| by exL 14
14. k':int
15. index(k',x::l)=j 0k' k'length(x::l)
jx
| by andL 15
15. index(k',x::l)=j
16. 0k'
17. k'length(x::l)
jx
| by simplify 17
|
17. k'length(l)+1
jx
| by cut k'=0 k'0
|
|
| k'=0 k'0
| by arith
18. k'=0 k'0
jx
| by orL 18
|
|
| 18. k'=0
| jx
| | by cut index(k',x::l)=j
| |
| |
| | index(k',x::l)=j
| | by hyp 15
|
|
| 19. index(k',x::l)=j
| jx
| | by subst 18 19
|
| 19. index(0,x::l)=j
| jx
| | by simplify 19
|
| 19. x=j
| jx
| by arith
18. k'0
jx
| by allL 11 j
19. jl ji
jx
| by impL 19
|
|
| jl
| | by unfold in 0
|
| k:int. (index(k,l)=j 0k klength(l))
| | exR k'-1
|
| index(k'-1,l)=j 0k'-1 k'-1length(l))
| | by def index(k',x::l) up
| |
| |
| | 0k'
| | by hyp 18
|
|
| 20. 0k'
| 21. index(k',x::l) = index(k'-1,tl(x::l))
| index(k'-1,l)=j 0k'-1 k'-1length(l))
| | by simplify 21
| |
|
| 20. 0k'
| 21. index(k',x::l) = index(k'-1,l)
| index(k'-1,l)=j 0k'-1 k'-1length(l))
| by arith
19. jl
20. ji
jx
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)