如何通过与目标相矛盾来证明?

How to prove by contradicting the goal?

Require Import Arith.

Goal forall a b c: nat, nat_eq a b -> nat_eq b c -> nat_eq a c.
Proof.
  intros a b c H0 H1.
1 subgoal
a, b, c : nat
H0 : eq_nat a b
H1 : eq_nat b c
______________________________________(1/1)
eq_nat a c

这只是我编造的一个例子,我的问题是,如果我想通过与目标相矛盾来证明它,假设 (~ eq_nat a c) 为真,然后通过在中找到矛盾来证明上下文,我应该如何实现?无法找到一种方法来做到这一点,关于我应该使用什么策略的任何提示?

这需要消除双重否定(不是非目标 -> 目标)才能起作用。如果您将其作为公理(例如 Axiom dne: forall P: Prop, ~~P -> P),则可以使用策略 apply dne

准确地说,

Require Import Arith.

Axiom dne: forall P: Prop, ~~P -> P.

Goal forall a b c: nat, nat_eq a b -> nat_eq b c -> nat_eq a c.
Proof.
  intros a b c H0 H1.
  apply dne; intro H2.
  (* now the context is
     1 subgoal
     a, b, c : nat
     H0 : eq_nat a b
     H1 : eq_nat b c
     H2 : ~ eq_nat a c
     ______________________________________(1/1)
     False
  *)
Abort.