Как иметь дело с предложением «ложь = истина» при доказательстве теорем в coq

#coq #proof #theorem

#coq #доказательство #теорема

Вопрос:

Я новичок в coq и пытаюсь доказать эту теорему

 Inductive expression : Type :=
  | Var (n : nat)
.
.

Theorem variable_equality : forall x : nat, forall n : nat,
  ((equals x n) = true) -> (Var x = Var n).
 

Это определение equals

 
Fixpoint equals (n1 : nat) (n2 : nat) :=
  match (n1, n2) with
    | (O, O)      => true
    | (O, S n)    => false
    | (S n, O)    => false
    | (S n, S n') => equals n n'
  end.

 

Пока это мое решение

 Proof.
intros x n. induction x as [| x' IH].
  - destruct n. 
      reflexivity.
      simpl. intro. 
 

и в итоге я получаю что-то вроде этого

 1 subgoal 
n : nat
H : false = true
-------------------------
Var 0 = Var (S n)
 

Я понимаю, что этот вывод означает, что предложение «Var 0 = Var (S n)» должно следовать из предложения «false = true», если теорема должна быть правильной, но я не знаю, что с этим делать, и продвигаюсь вперед с моим доказательством.

Ответ №1:

Другой вариант, discriminate который является специальной тактикой для такого рода целей: предполагается, что он решает именно такие проблемы (т. Е. Равенства различных конструкторов в ваших гипотезах) и не более.

 Goal false = true -> False.
discriminate.
Qed.
 

Кроме того, это терминатор, что означает, что он терпит неудачу, если цель не решена после его использования, inversion в отличие от и congruence который будет успешным в некоторых случаях, когда они не решают ожидаемую проблему и преуспевают «неожиданным» образом.

например

 Goal true = true -> True.
inversion 1.
Qed.
 

и

 Goal true = true -> S 1 = S 1.
congruence.
Qed.
 

Лично я использую by [] (который также является терминатором) из ssreflect для такого рода целей и для всех «тривиальных» целей подобного рода:

 Require Import ssreflect.

Goal false = true -> False.
by [].
Qed.
 

Ответ №2:

Другой вариант: вместо inversion , используйте congruence :

 Goal false=true -> False.
  congruence.
Qed.
 

Эта тактика предназначена для использования несвязности конструкторов.

Ответ №3:

Используйте inversion такую гипотезу, как в:

 Goal false=true -> False.
intros H.
inversion H.
Qed.