有趣的关键字在Coq中做了什么?

时间:2015-03-29 22:58:15

标签: lambda functional-programming coq dependent-type

我很难理解Coq中关键词'fun'的含义。

有所有类型和功能forallb:

Inductive all (X : Type) (P : X -> Prop) : list X -> Prop :=
  | all_nil : all X P []
  | all_cons : forall (x:X) (l: list X) , P x -> all X P l -> all X P (x::l).

Fixpoint forallb {X : Type} (test : X -> bool) (l : list X) : bool :=
 match l with
| [] => true
| x :: l' => andb (test x) (forallb test l')
end.

定理:

Theorem all_spec: forall (X:Type) (test : X -> bool) (l: list X),
    forallb test l = true <-> all X (fun x => test x = true) l.

我理解左侧部分,但对&lt; - &gt;右侧的乐趣感到困惑。

1 个答案:

答案 0 :(得分:8)

它不像 lambda 那样,就像这里fun x => ...简直就像Haskell中的\x -> ...一样?

您的代码中还有fun ...的另一个有趣的特性。代码中该函数的结果类型必须是命题Prop),而不是 boolean 。表达式test x = true必须是该类型,因此我们得出结论:coq中的=表示关于相等的命题,而不是布尔二进制操作(在Haskell中称为==;我们不&# 39;从你的例子中看到这一点,但也许coq的符号是相似的。)

所以,虽然这个fun ...的想法只是一个 lambda ,但从Haskell的观点来看,这有点不寻常,因为这里引入了一个函数类型级别(结果类型是Prop),而不是值级别(只有后者必须是可能的 - 或者至少是Haskell中\ x-> ...的常用用法)。 coq&#39; s Prop与Haskell中的*处于同一级别,不是吗?

此代码中的all X P类似于Haskell中的类型构造函数(嗯,类型构造函数的参数化系列),但是类型为[X] -> *的依赖类型(在Haskell&#39;中表示法) )。 all_nilall_cons就像这种新类型的数据构造函数。