Je suis en train d'écrire une preuve de l'exactitude de quicksort.
Mon programme définit un type de partition, qui gère l'étape de partitionnement récursif de quicksort.
Inductive partition : Type :=
| empty
| join (left: partition) (pivot: nat) (right: partition).
Et une fonction qui vérifie si une partition est triée
Fixpoint p_sorted (p: partition) : bool :=
match p with
| empty => true
| join l pivot r => match l, r with
| empty, empty => true
| join _ lp _, empty => if lp <=? pivot then p_sorted l else false
| empty, join _ rp _ => if pivot <=? rp then p_sorted r else false
| join _ lp _, join _ rp _ => if (lp <=? pivot) && (pivot <=? rp) then
(p_sorted l) && (p_sorted r) else false
end
end.
J'ai écrit un lemme avec la structure suivante, qui stipule que les partitions gauche et droite d'une partition triée doivent également être triées. Ce lemme utilise la syntaxe "match with" pour décomposer une partition en ses sous-partitions gauche et droite :
Lemma foo : forall (p: partition), (match p with
| empty => True
| join left pivot right => (p_sorted p = true) -> (p_sorted left = true) /\ (p_sorted right = true)
end).
Proof. (* ... proof ... *) Qed.
Ce lemme est déjà prouvé.
Maintenant, je veux l'utiliser dans une nouvelle preuve, où l'hypothèse est de la forme p_sorted x = true
Comment appliquer mon précédent lemme, pour le transformer en p_sorted left = true /\ p_sorted right = true
?
apply foo
ne parvient pas à s'unifier à cause de la construction de la correspondance des motifs.