我很难理解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;右侧的乐趣感到困惑。
答案 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_nil
和all_cons
就像这种新类型的数据构造函数。