coq - 单例类中的隐式参数
问题描述
当我以通常的语法使用单个方法创建类型类时,我可以给它隐式参数:
Class Foo1 := { foo1 {n} : Int n }.
但是当我使用单例语法时,我不能给它隐式参数
Fail Class Foo2 := foo2 {n} : Int n.
错误:语法错误:'.' 预计在 [gallina] 之后(在 [vernac_aux] 中)。
我什至不能Arguments
用来使该参数隐含:
Class Foo3 := foo3 n : Int n.
Fail Arguments foo3 {n}.
该命令确实失败并显示消息:Flag "rename" expected to rename Foo3 into n。
它有理由这样工作吗?
解决方案
在你的第二次尝试
您的第二次尝试可以通过移动n
冒号的另一侧来工作:
Class Foo2 := foo2 : forall {n}, Int n.
第三次尝试
错误消息告诉您使用该rename
标志。这是因为foo3
实际上将Foo3
(它投射的类型类实例)作为第一个(隐式)参数,在整数之前。第一个参数恰好已经有一个名称 ( Foo3
),您可以通过运行看到About foo3.
About foo3.
(*
foo3 : Foo3 -> forall n : nat, Int n
Arguments foo3 {Foo3} _%nat_scope
*)
因此 Coq 认为您想将该参数重命名为n
. 如果这确实是您想要的,您可以rename
按照建议使用标志:
Arguments foo3 {n} : rename.
之后About foo3.
将产生:
foo3 : Foo3 -> forall n0 : nat, Int n0
Arguments foo3 {n} n%nat_scope
(where some original arguments have been renamed)
但是您真正想要的是通过使其隐含来影响第二个参数。在此过程中,您不想给它一个新名称(不需要,它已经命名n
),并且您不想更改第一个参数(即保持隐含并避免重命名它)。因此,您应该做的是:
Arguments foo3 {_ _}.
屈服
Arguments foo3 {Foo3} {n}%nat_scope
推荐阅读
- java - Webflux + Webclient + Netty,如何使用具有多个客户端证书的 SslContext?
- ms-access - 如何检测没有列的访问数据库表?
- javascript - React 组件不渲染
- java - StringUtils 问题。如何修复此字符串字母检查?
- regex - 如何在机器人框架中计算模式中的值
- c++ - C++ GTKMM,在文本缓冲区中得到一个奇怪的输出
- java - 如何使用 Mapstruct 和 Kotlin 在另一个映射器中使用映射器?
- vue.js - Vue:VueTools 中的计算属性更改,但 UI 未重新渲染
- typescript - 在 K 中使用 P 映射类型不会保留修饰符
- python - Math.tan 用于小角度。python是否使用小角度近似?