Je suis actuellement au chapitre 5 de "Fondations logicielles" mais j'ai ressenti le besoin de revenir au chapitre un pour clarifier un certain nombre de choses. En particulier, il y a un exercice que je n'ai pas vraiment digéré, dans lequel on nous demande d'utiliser destruct deux fois pour prouver un résultat sur des booléens. Ici c'est avec les noms et autres détails changés.Proof on booleans, false = true
Inductive bool: Type :=
|true: bool
|false: bool.
Definition fb (b1:bool) (b2:bool) : bool :=
match b1, b2 with
| false, false => false
| _, _ => true
end.
Theorem th: forall a b: bool,
fb a b = false -> b = false.
Proof.
intros [] [] H.
- rewrite <- H. reflexivity.
- reflexivity.
- rewrite <- H. reflexivity.
- reflexivity.
Qed.
Quand la première tique, le contexte et l'objectif sont à la fois un non-sens:
H : fb true true = false
______________________________________(1/1)
true = false
deuxième cocher l'hypothèse est fausse. Troisième tick est le même genre de non-sens que le premier. Je ne comprends que par les règles de réécriture, toutes ces choses fonctionnent. Cependant j'ai l'impression que nous quittons l'étroit chemin de la vérité pour le désert de la fausseté. Plus précisément, et AFAIK, une fausse hypothèse peut être faite pour prouver TOUT énoncé, vrai ou faux. Ici, nous l'utilisons pour prouver que false = true, OK pourquoi pas, mais cela me rend un peu mal à l'aise. Je n'aurais pas prévu un assistant de preuve pour permettre cela.
Développant un peu
Dans une preuve typique par la contradiction, je choisirais une hypothèse au hasard, et d'en tirer le but jusqu'à ce que je trouve soit une tautologie ou une contradiction. Je conclurais alors si mon hypothèse était vraie ou fausse.
Qu'est-ce qui se passe ici, dans les cas 1 (même pour le cas 3), Coq commence à partir d'une hypothèse fausse:
H : fb true true = false
applique à un objectif qui est une contradiction:
true = false
et les combine pour trouver une tautologie.
Ce n'est pas un raisonnement dont je suis conscient. Cela rappelle les «blagues» des étudiants où, à partir de 0 = 1, tout résultat absurde sur les nombres naturels peut être prouvé.
Followup
Ce matin, pendant mon trajet, je pensais à ce que je venais d'écrire ci-dessus. Je crois maintenant que les cas 1 et 3 sont des preuves appropriées par contradiction. En effet H est faux et nous l'utilisons pour prouver un but qui est faux. Les hypothèses (valeurs de a et b) doivent être rejetées. Ce qui m'a peut-être troublé, c'est qu'en utilisant la réécriture, nous faisons une partie du chemin "en arrière", en partant du but.
Je suis un peu indécis pour le cas 2, qui se lit comme suit:
H : fb true false = false
______________________________________(1/1)
false = false
qui est essentiellement false -> true
, une tautologie sous le « principe d'explosion ». Je ne pense pas que cela pourrait être utilisé directement dans une preuve. Oh, je ne suis pas sûr d'avoir bien compris ce qu'il y a sous le capot, mais la confiance en Coq est intacte. Je dois continuer et revenir au chapitre 5. Merci à tous pour vos commentaires.
Les distinctions de cas peuvent avoir des cas impossibles, et elles peuvent être expédiées/exclues en dérivant le mensonge. C'est un raisonnement logique commun et valide. –
Je ne peux pas vraiment dire ce que vous trouvez déroutant à propos de cet exemple; Pourriez-vous élaborer? Est-ce que Coq produit des sous-objectifs qui ont des hypothèses contradictoires? –
Peut-être que la confusion s'est produite dans le "dans une preuve typique par contradiction" En effet, vous ne faites pas une preuve par contradiction ici mais vous utilisez le "principe d'explosion". https://en.wikipedia.org/wiki/Principle_of_explosion également connu sous le nom "Ex Falso, Quodlibet", "De fausseté tout est vrai", ce qui semble être un principe très à la mode ces jours-ci. – ejgallego