我有一种印象,在Coq中这是不可能的。例如
Parameter Arg: Type.
Parameter F X XP: Arg.
Parameter S P I PLS PI: Arg -> Type.
Parameter tree car: P X.
Parameter mary john: PLS XP.
Parameter c: PLS XP -> P XP.
Coercion c: PLS XP >-> P XP. (*Syntax error: '>->' expected after [vernac:class_rawexpr] (in [vernac:gallina_ext]).*)
因此>->
旁边的表达式类型不仅必须是Set,Type还是Prop,表达式本身也必须在语法上是基本的(Gallina中的“rawexpressions”?)?如何绕过这个;我可以在复杂表达之间形成强制吗?是否有另一种在Coq中定义子类型的方法,一种可以用于复杂表达式的子类型?我能做得比
Let nui := PLS XP.
Let hui := P XP.
Parameter c: nui -> hui.
Coercion c: nui >-> hui.
Parameter st: P XP -> Type.
Check st (c mary). (*st mary : Type*)
Check st mary. (*Error: The term "mary" has type "PLS XP" while it is expected to have type "P XP".*)
答案 0 :(得分:1)
如果你真的想走这条路,请注意强制有非常特殊的规则;如果你想使用它们,你必须熟悉手册的chapter 18。特别是,我认为参数不能成为源类,所以你必须添加一些包装:
Parameter Arg: Type.
Parameter F X XP: Arg.
Parameter S P I PLS PI: Arg -> Type.
Parameter tree car: P X.
Parameter mary john: PLS XP.
Parameter c: PLS XP -> P XP.
Inductive p_wrap := p_wrap_C : PLS XP -> p_wrap.
Coercion u_cast x := match x with | p_wrap_C u => u end.
Coercion c_cast x := match x with | p_wrap_C u => c u end.
Parameter st: P XP -> Type.
Definition Mary := p_wrap_C mary.
Check st (c Mary).
Check st Mary.
YMMV。请注意,ssreflect doc中的常规subType
类可能会为如何制作通用强制框架提供一些帮助。
答案 1 :(得分:1)
在尝试了这个,那个以及诸如此类之后,解决方案非常简单。我的问题丢失了两个步骤:
dpr
工作总之:
Coercion c: PLS >-> P