我想了解Coq定理:
public interface IDbService<T> where T: IEntity { .... }
public class DbService<T> : IDbService<T> where T : IEntity { .... }
来自https://github.com/GU-CLASP/FraCoq/blob/master/Tutorial.org
箭头符号Theorem thm0 : UseCl Pos (PredVP (UsePN john_PN) walk_V) ->
UseCl Pos (PredVP (UsePN john_PN) walk_V).
intro H.
exact H.
Qed.
是什么意思?据我了解,Coq使用两个箭头https://softwarefoundations.cis.upenn.edu/lf-current/Basics.html:1)双箭头用于定义类型构造函数,2)单箭头->
用于definint新类型。但这个定理是陈述,而不是类型定义。为什么会出现这个箭头?如何将此陈述理解为Coq定理?
答案 0 :(得分:4)
在Coq中使用双箭头(=>
)来标记模式匹配分支。例如,我们可以像这样定义布尔否定:
Definition negb (b : bool) : bool :=
match b with
| true => false
| false => true
end.
单箭头(->
)用于表达两个看似无关的概念:
功能类型。例如,nat -> bool
是从自然数到布尔值的函数类型。
逻辑含义。这是您在定理陈述中看到的用法。声明A -> B
表示只要B
A
,A -> B
就会成立。
然而,实际上,这种区别只是肤浅的:在Coq中,暗示和功能的证明实际上是同一件事!对于Coq来说,蕴涵的证据A
在准确的意义上是一个函数,它接受证明B
真理的证明,并返回一个证明MachineFunctionPass
真相的证据。如果这听起来令人困惑,请不要担心:你可以假装大多数时候箭头的两次使用都指的是不同的东西,这不会伤害你。软件基础书有一个chapter,可以更详细地讨论这些问题。