不平等证明的统一性

时间:2018-07-10 11:57:46

标签: coq

如果平等是可以决定的,那么所有平等证明都是“相同的”。即为nat

Require Logic.

Goal forall (n m:nat)  (H1 H2: n = m), H1 = H2.
  intros n m H1 H2.
  subst n.
  now rewrite Logic.Eqdep_dec.UIP_refl_nat.
Qed.

我可以证明类似的非平等陈述吗?

Goal forall (n m:nat)  (H1 H2: n <> m), H1 = H2.

编辑:我问的原因是因为我想将正数定义为与0不同的nat,并证明如果它们的参数nat相等,则它们相等。

Inductive Pos : Set := pos: forall n, n <> 0 -> Pos.

由于它们还包含证明项n <> 0,因此还必须表明证明项相等。但这显然是不可能的(不添加额外的公理),因为证明项是一个函数。 @Arthur在这里建议使用布尔谓词。

Inductive Pos : Set := pos: forall n, n =? 0 = false -> Pos.

这是完美的,因为现在证明项是等式约束(归纳类型),而不是不能证明相等的函数。因此,在H1H2下面都等于eq_refl

Definition p2n (p:Pos) := let (n, H) := p in n.

Goal forall p1 p2, p2n p1 = p2n p2 -> p1 = p2.

  destruct p1 as [[|n1] H1], p2 as [[|n2] H2];
    simpl in *; try congruence.
  rewrite (Logic.Eqdep_dec.UIP_refl_bool _ H1).
  rewrite (Logic.Eqdep_dec.UIP_refl_bool _ H2).
  now inversion 1.
Qed.

1 个答案:

答案 0 :(得分:2)

由于H1H2是函数,因此需要函数可扩展公理来证明两个这样的函数相等。

From Coq Require Import FunctionalExtensionality.

Goal forall (n m:nat) (H1 H2: n <> m), H1 = H2.
Proof.
  unfold not; intros n m H1 H2.
  apply functional_extensionality; intros H.
  contradiction (H1 H).
Qed.

足够有趣的是,在这种情况下不需要UIP_refl_nat

您可能想查看this related question,这表明选择表示法时应格外小心。