具有依赖类型coq的构造函数的等式
我有以下设置(抱歉,如果MCVE有点长),我试图证明最后一个定理,但我陷入了困境,因为它无法统一态射的类型,因为它们依赖于理论上不同的对象类型,即使对象类型相同 是否有一个通用的策略来分解具有依赖类型的构造函数<代码>注入和具有依赖类型coq的构造函数的等式,coq,dependent-type,coq-tactic,Coq,Dependent Type,Coq Tactic,我有以下设置(抱歉,如果MCVE有点长),我试图证明最后一个定理,但我陷入了困境,因为它无法统一态射的类型,因为它们依赖于理论上不同的对象类型,即使对象类型相同 是否有一个通用的策略来分解具有依赖类型的构造函数注入和反转产生了似乎无用的结果,与ob\u fn(我可以很容易地证明等价定理)有关,而不是morph\u fn Inductive Cat := cons_cat (O : Type) (M : O -> O -> Type). Definition ob (c : Cat)
反转
产生了似乎无用的结果,与ob\u fn
(我可以很容易地证明等价定理)有关,而不是morph\u fn
Inductive Cat := cons_cat (O : Type) (M : O -> O -> Type).
Definition ob (c : Cat) :=
match c with cons_cat o _ => o end.
Definition morph (c : Cat) : ob c -> ob c -> Type :=
match c with cons_cat _ m => m end.
Inductive Functor
(A B : Cat)
: Type :=
cons_functor
(ob_fn : ob A -> ob B)
(morph_fn : forall {c d : ob A}, morph A c d -> morph B (ob_fn c) (ob_fn d)).
Definition ob_fn {A B : Cat} (f : Functor A B) : ob A -> ob B :=
match f with cons_functor f' _ => f' end.
Definition morph_fn {A B : Cat} {c d : ob A} (f : Functor A B)
: morph A c d -> morph B (ob_fn f c) (ob_fn f d) :=
match f with cons_functor _ f' => f' c d end.
Theorem functor_decompose {A B : Cat} {o fm gm} : cons_functor A B o fm = cons_functor A B o gm -> fm = gm.
intros H.
assert (forall c d, @morph_fn A B c d (cons_functor A B o fm) = @morph_fn A B c d (cons_functor A B o gm)).
intros.
rewrite H.
标准模式是将记录转换为sigma类型,并讨论sigma类型的相等或字段的相等。参见,例如。您可能还对和相应的感兴趣。标准模式是将记录转换为sigma类型,并讨论sigma类型的相等或字段的相等。参见,例如。您可能还对和相应的感兴趣。您正面临依赖类型的典型问题,您的目标无法重写,因为当它在第一个参数上泛化时,它的类型将不好。如果你想引入公理,你可以使用
eq_-dec
或JM_-eq
来避免这个问题(或者你也可以让你的一些基类型是可判定的),否则,除了用复杂的模式匹配来证明内射性之外,你别无选择(我假设你在这个例子中的意思是O),有没有一条直接的解决方法?是的,有。参见James Wilcox的文章。摘自链接文章:“如果索引的类型具有可判定的相等性,你不需要JMeq
来获得相依案例分析”。或者,您可以要求导入Coq.Program.Equality.
并在构造函数Equality上执行依赖销毁
。本例中的结果证明将使用一些额外的公理。使用打印假设
。要获得它们,您面临的是依赖类型的典型问题,您的目标无法重写如果你想引入公理,你可以使用eq_-dec
或JM_-eq
来避免这个问题(或者你也可以让你的一些基本类型可以判定)如果不是,你除了用复杂的模式匹配来证明内射性之外别无选择。如果我假设我的基类型是可判定的(我假设你在本例中的意思是O),有没有一条直接的解决方法?是的,有。参见James Wilcox。摘自链接文章:“如果索引的类型具有可判定的相等性,则无需JMeq
即可获得相关案例分析“。或者,您可以要求导入Coq.Program.Equality.
并在构造函数Equality上执行依赖销毁
。本例中的结果证明将使用一些附加公理。使用打印假设
。以获取它们。