我正在尝试定义一个提供身份和组合的类。除了其他有用的实例(带有 nil 和连接的列表;与身份和组合的关系 ;-) ),我想要一个函数实例。
给定
Class Cat (C0 : Type) (C1 : C0 -> C0 -> Type) :=
{ identity : forall a, C1 a a
; compose : forall {a b c : C0}, C1 b c -> C1 a b -> C1 a c
(* snip: some laws *)
}.
我希望能够定义类似的东西
Instance Cat (->) := { ... }.
但是 Coq 中的操作符不是这样工作的。首先我假设->
是一个符号,但Locate "_ -> _".
声称这是一个Unknown notation
. 使用fun a b => a -> b
有点工作,但之后的类型看起来很有趣。
> Check (identity nat).
identity nat
: (fun a b : Type => a -> b) nat nat
(同样适用Eval compute in
,似乎它并没有简化类型。)我更喜欢更具可读性的identity nat : nat -> nat
. (目前,对于我正在做的事情,这些类型变得不可读。)
有没有办法得到“原始”->
或至少说服 Coq 给我更好的类型?
旁注:我正在构建很多Inductive
表示评估语义的 s,我的目标是将“普通”编程语言的子集映射到 Coq 上并返回,转移安全约束并发挥作用。我被迫用不同的构造函数一遍又一遍地证明同样的事情,并希望这能让我一次又一次地证明东西。我相信类别是抽象这一点的正确方法。如果我错了,我会在此处包含此注释,也许有更好的方法可以回避整个->
问题。