我正在尝试定义一个提供身份和构图的类。除了其他有用的实例(List with nil and concatenation; Relations with,well,identity and composition ;-)),我想有一个函数实例。
鉴于
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
,我的目标是将“普通”编程语言的子集映射到Coq并返回,传输安全约束并做魔术。我被迫用不同的构造函数一遍又一遍地证明同样的事情,希望这能让我一次只证明一次。我认为类别是抽象的正确方法。我在这里包含这个注释,以防我错了,也许有更好的方法来回避整个->
问题。
答案 0 :(得分:2)
我只能回答部分问题。 ->
不是+
和exists
以及{ ... | ... }
之类的符号,它内置于解析器中,如forall
。当a -> b
中的forall x:a, b
不可用时,语法x
等同于b
(我不知道它是否在所有情况下都是等效的,可能会使用x
1}}无法在b
中出现,您必须使用->
)。
原因是函数抽象和应用以及强制它们的类型是Coq的基础,它们不是来自更原始的概念。您无法直接查看fun
,应用,->
或forall
,因为它们不是第一类对象。
话虽这么说,类型类是一种专门用于应用程序的方法。我不熟悉它们,所以我不知道是否有办法做你想做的事。