| false ⇒ he::(insert A le x l')
]
].
-(*
-theorem insert_ind:
- ∀A:Set. ∀le: A → A → bool. ∀x:A.
- ∀P: list A → Prop.
- ∀l:list A. P (insert A le x l).
- intros (A le x P H l).
- apply (
- let rec insert_ind (l: list A) ≝
- match l in list return λl.P (insert A le x l) with
- [ nil ⇒ (? : P [x])
- | (cons he l') ⇒
- match le x he return λb.P (match b with [ true ⇒ x::he::l' | false ⇒ he::(insert A le x l') ]) with
- [ true ⇒ (H2 : P (x::he::l'))
- | false ⇒ (? : P (he::(insert A le x l')))
- ]
- ]
- in
- insert_ind l).
-qed.
-*)
let rec insertionsort (A:Set) (le: A → A → bool) (l: list A) on l ≝
match l with
l = li → ordered ? le li = true →
ordered ? le (insert A le x li) = true
with
- [ nil ⇒ (? : l = [] → ordered ? le [] = true → ordered ? le [x] = true)
+ [ nil ⇒ ?
| (cons he l') ⇒
match le x he
return
[ true ⇒ x::he::l'
| false ⇒ he::(insert A le x l') ]) = true
with
- [ true ⇒
- (? :
- le x he = true →
- l = he::l' →
- ordered ? le (he::l') = true →
- ordered ? le (x::he::l') = true)
- | false ⇒
- let res ≝ insert_ind l' in
- (? :
- le x he = false → l = he::l' →
- ordered ? le (he::l') = true →
- ordered ? le (he::(insert ? le x l')) = true)
+ [ true ⇒ ?
+ | false ⇒ let res ≝ insert_ind l' in ?
]
(refl_eq ? (le x he))
] (refl_eq ? l) in insert_ind l);