Coq中是否有( - >)的显式类型构造函数?

时间:2012-08-22 19:10:02

标签: types coq partial-application

我正在尝试定义一个提供身份和构图的类。除了其他有用的实例(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并返回,传输安全约束并做魔术。我被迫用不同的构造函数一遍又一遍地证明同样的事情,希望这能让我一次只证明一次。我认为类别是抽象的正确方法。我在这里包含这个注释,以防我错了,也许有更好的方法来回避整个->问题。

1 个答案:

答案 0 :(得分:2)

我只能回答部分问题。 ->不是+exists以及{ ... | ... }之类的符号,它内置于解析器中,如forall。当a -> b中的forall x:a, b不可用时,语法x等同于b(我不知道它是否在所有情况下都是等效的,可能会使用x 1}}无法在b中出现,您必须使用->)。

原因是函数抽象和应用以及强制它们的类型是Coq的基础,它们不是来自更原始的概念。您无法直接查看fun,应用,->forall,因为它们不是第一类对象。

话虽这么说,类型类是一种专门用于应用程序的方法。我不熟悉它们,所以我不知道是否有办法做你想做的事。