如果平等是可以决定的,那么所有平等证明都是“相同的”。即为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.
这是完美的,因为现在证明项是等式约束(归纳类型),而不是不能证明相等的函数。因此,在H1
和H2
下面都等于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.
答案 0 :(得分:2)
由于H1
和H2
是函数,因此需要函数可扩展公理来证明两个这样的函数相等。
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,这表明选择表示法时应格外小心。