coq - 在 Coq 中使用 Typeclasses 重用 Axiom
问题描述
我正在尝试使用类型类进行代码重用,但是在子类型类定理中应用父类型类公理时遇到了 setoid 错误。我用以下相等和加法运算做了一个 MRE:
Require Import Setoid.
(* Equality *)
Parameter CEq : forall A, A->A->Prop.
Arguments CEq [A] _ _.
Notation "x ¦ y" := (CEq x y) (at level 70, no associativity).
Axiom ceq_reflexivity: forall A, forall a:A, a¦a.
Axiom ceq_symmetry: forall A, forall a b:A, a¦b->b¦a.
Axiom ceq_transitivity: forall A, forall a b c:A, a¦b->b¦c->a¦c.
Add Parametric Relation A : (A) (@CEq A)
reflexivity proved by (@ceq_reflexivity A)
symmetry proved by (@ceq_symmetry A)
transitivity proved by (@ceq_transitivity A)
as ceq_rel.
(* Addition *)
Parameter CAdd: forall A, A->A->A.
Arguments CAdd [A] _ _.
Infix "±" := CAdd (at level 50, left associativity).
以下是父类和子类:
(* Parent Typeclass *)
Class CDiscT (CDisc: Set) := {
O: forall CDisc, CDisc;
cdisc_add_neutral:forall CDisc, forall x:CDisc, x±(O CDisc)¦x;
}.
(* Natural Set & Child Typeclass *)
Parameter CNat: Set.
Class CNatT `{CDiscT CNat} := {}.
这是失败的定理:
(* Axiom inheritance test *)
Example test `{CNatT}: (O CNat)¦(O CNat)±(O CNat).
Proof.
rewrite <- cdisc_add_neutral. (* Error *)
reflexivity.
Qed.
这是错误:
Error:
Tactic failure: setoid rewrite failed: Unable to satisfy the following constraints:
In environment:
H : CDiscT CNat
H0 : CNatT
?s : "subrelation (CEq (A:=Prop)) (Basics.flip Basics.impl)"
为了能够在 CNatT 定理中使用 CDiscT 公理,这里缺少什么?有一个更好的方法吗?
解决方案
这可能部分是因为您的示例过于简化,但是从右到左重写cdisc_add_neutral
是有问题的,因为右侧x
匹配任何内容并且可以具有任何类型。
你得到的错误是 Coq 试图用它重写整个目标,但这会使用逻辑暗示impl
,这反过来又要求你的关系CEq
是 的子关系impl
。
您可以通过稍微专门化引理来避免这种情况:
rewrite <- (cdisc_add_neutral CNat) at 1.
您需要 ,at 1
因为现在匹配的子项是O CNat
,但它在您的目标中出现了 3 次。rewrite
默认情况下会尝试重写所有这些,这需要Proper
此处缺少的实例。(您可以通过Parametric Morphism
手册中描述的机制获得这些)。
此外,您可以从左到右重写:
rewrite cdisc_add_neutral
推荐阅读
- javascript - 如何突破 React 映射以显示具有两个值的对象,一个带有数组,另一个带有字符串或数字(结果)
- python - 如何在csv文件中写入结果?
- python - AttributeError:'Str'对象在python中没有属性'Mean_validation_score'
- katex - 如何在动态更改 HTML 中使用 KaTeX 自动渲染器?
- recursion - 唯一地显示所有 Wikidata 后代
- javascript - 如何通过 Bjron Holines Store Locator 插件在系统现有的 ColdFusion 代码上使用 javascript + 为多个域设置 cookie
- r - read_html 没有从简单的 html 页面中检索所有数据,而是返回不完整的 html?
- javascript - 按特定顺序将多个对象数组合并为 1
- r - 按较长的字符序列对字符进行排序(按蛋白质序列对肽进行排序)
- javascript - 暂停时引导轮播的事件