我有一个由三个构造函数构建的归纳集:
Inductive MF : Set :=
| D : MF
| cn : MF -> MF -> MF
| dn : Z -> MF -> MF.
我想以某种方式定义新的归纳集B,使得B是MF的子集,其仅包含从D和dn获得的元素。此外,如果需要,B中的所有内容都应解释为MF类型。
我尝试定义第一个B然后MF如下:
Inductive B : Set :=
| D : B
| dn : Z -> B -> B.
Inductive MF : Set :=
| m : B -> MF
| cn : MF -> MF -> MF
| Dn : Z -> MF -> MF.
Axiom m_inj : forall (a b : B), m a = m b -> a = b.
Coercion m : B >-> MF.
Axiom dnDn : forall (a : B)(i : Z), (m (dn i a)) = (Dn i (m a)).
这里的问题是我必须构造者(dn和Dn)应该可以互换B中的元素。这给了我很多进一步发展的问题,我不得不继续添加公理以获得预期的行为。
答案 0 :(得分:4)
请注意,您必须证明isB mf
在您的设置中享有不相关的证据,否则Coq不会知道投影mf
是单射的。通常,您希望MF
中的平等意味着您的子类型B
中的平等。
我建议以下变体:
Require Import Bool ZArith Eqdep_dec.
Inductive MF : Set :=
| D : MF
| cn : MF -> MF -> MF
| dn : Z -> MF -> MF.
Inductive isB : MF -> Prop :=
| DIsOK : isB D
| dnIsOK : forall z mf, isB mf -> isB (dn z mf).
Fixpoint isBb (mf : MF) : bool :=
match mf with
| D => true
| dn _ mf => isBb mf
| _ => false
end.
Lemma mfP mf : reflect (isB mf) (isBb mf).
Proof.
apply iff_reflect; split.
+ elim mf; auto; simpl; intros mf1 ihmf1 mf2 ihmf2.
- now intros hisB; inversion hisB.
- now inversion ihmf2; rewrite mf2.
+ now elim mf; simpl; try repeat (auto||constructor||congruence).
Qed.
Record B := mkB
{ mf : MF
; prf : isBb mf = true
}.
Coercion mf : B >-> MF.
(* From http://cstheory.stackexchange.com/questions/5158/prove-proof-irrelevance-in-coq *)
Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.
Proof.
intros; apply Eqdep_dec.eq_proofs_unicity; intros.
now destruct (Bool.bool_dec x y); tauto.
Qed.
Lemma valB b1 b2 : mf b1 = mf b2 -> b1 = b2.
Proof.
destruct b1, b2; simpl; intros ->.
now rewrite (bool_pirrel (isBb mf1) prf0 prf1).
Qed.
math-comp库对布尔谓词的子类型有很好的系统支持,如果你发现自己处理了许多子类型,你可能想要试一试。
答案 1 :(得分:1)
您可以将B
定义为打包MF
元素的记录以及仅使用D
和dn
构建的证明。为此,您需要首先定义谓词isB : MF -> Prop
,该谓词描述MF
的{{1}}元素。
B