Fixpoint bubble_sort0 (n : nat) : list nat -> list nat :=
fun x : list nat =>
match n with
| O => x
| S n0 => bubble_sort0 n0 (bubble x)
end.
Definition bubble_sort (x : list nat) : list nat :=
bubble_sort0 (length nat x) x.
(* == Tri fusion *)
Fixpoint fusion (x : list nat) : list nat -> list nat :=
fun y : list nat =>
match x with
| Nil => y
| Cons n l0 =>
(fix fusion_r (y : list nat) : list nat :=
match y with
| Nil => x
| Cons n0 l2 =>
si (list nat) (inf_egal n n0)
(Cons nat n (fusion l0 (Cons nat n0 l2)))
(Cons nat n0 (fusion_r l2))
end) y
end.

Lemma fusion_eq1 : forall ms : list nat, fusion (Nil nat) ms = ms.