我的Coq代码如下:
Inductive A (X: Type) :=
n1 : nat -> X -> (A X)
.
Arguments n1 {X} _ _.
Inductive B :=
m1 : (A nat) -> B |
m2 : B -> B -> B
.
Coercion m1 : A >-> B.
Check m2 (m1 (n1 1 2)) (m1 (n1 2 2)). (* 1st Check *)
Check m2 (n1 1 2) (n1 2 2). (* 2nd Check *)
我定义了类型A和B(A是多态类型)。当写下由运算符'm2'连接的B表达式(如'1st Check')时,我希望省略构造函数'm1'(如'2nd Check'),因此我定义了上面的强制。但是,只有“第一检查”有效,“第二检查”无效。
在这里使用强制的正确方法是什么?为什么我的定义是错误的?
我不认为有任何便捷的方法可以通过当前的强制引擎获得所需的东西。当您输入`m1
归纳A(X:类型):=n1:nat-> X->(A X)。
Arguments n1 {X} _ _.
定义Anat:=一个。身份胁迫Anat_of_A:Anat>-> A。
归纳B:=m1:阿纳特-> B |平方米:B-> B-> B。
强制M1:阿纳特>-> B。
检查m2(m1(n1 1 2))(m1(n1 2 2))。 (*第一张支票)检查m2(n1 1 2:Anat)(n1 2 2:Anat)。 (第二次检查*)