Coq 如何通过反驳目标来证明?

Coq 如何通过反驳目标来证明?,coq,coq-tactic,Coq,Coq Tactic,这只是我编的一个例子,我的问题是,如果我想通过反驳目标来证明它,假设(~eq_nat a c)是真的,然后通过在上下文中找到矛盾来证明,我应该如何实现?无法找到一种方法来做到这一点,任何关于我应该使用什么策略的提示?这需要双重否定消除(非目标->目标)才能起作用。如果你把它作为一个公理(比如说axiom dne:forall P:Prop,~~P->P),那么可以使用策略apply dne 准确地说, 1 subgoal a, b, c : nat H0 : eq_nat a b H1 : eq

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

这需要双重否定消除(非目标->目标)才能起作用。如果你把它作为一个公理(比如说
axiom dne:forall P:Prop,~~P->P
),那么可以使用策略
apply dne

准确地说,

1 subgoal
a, b, c : nat
H0 : eq_nat a b
H1 : eq_nat b c
______________________________________(1/1)
eq_nat a c
1 subgoal
a, b, c : nat
H0 : eq_nat a b
H1 : eq_nat b c
______________________________________(1/1)
eq_nat a c
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.