Coq 中如何组合证明函数
How proof functions are combined in Coq
在下面的简单定理中,直接以证明函数的形式给出了证明。我想了解这两个用括号括起以反映我的概念的术语如何组合成 returns 预期类型的最终证明函数。
Lemma simple : forall i, i <= S i.
Proof
fun i => (le_S i i) (le_n i).
似乎 (le_S i i)
构造函数返回了一个函数,该函数接受 (le_n i)
作为参数。有人可以在这里解释一下证明函数组合是如何工作的吗?
(le_S i i)
是一个函数值。它期望另一个值作为参数,这里 (le_n i)
,类型 (i <= i)
,因为 le_n
的类型是 forall n : nat, (n <= n)
。应用于此参数的 (le_S i i)
的值是 (i <= S i)
类型,正如您可以从 le_S
的类型中看到的那样。引理中的 forall
解释了用于定义 simple
.
的最终值中的 fun
您可能想阅读 (https://en.wikipedia.org/wiki/Curry–Howard_correspondence)。
基本上,在 Coq 中,证明是将某些命题的证据(以证人的形式)作为论证并为新的派生命题提供证据(证人)的函数。
如果你这样做 Check le_S.
你会得到
le_S
: forall n m : nat, n <= m -> n <= S m
所以 le_S
是一个函数,它接受两个 nat 和一个 n <= m
的见证,并为 n <= S m
.
生成一个见证
在你的例子中 le_n i
是 i <= i
的见证人。
请注意,->
符号与 Check Nat.add.
等常用函数的含义相同
Nat.add
: nat -> nat -> nat
至于证据。 a -> b
在这两种情况下都表示从类型 a
到类型 b
的函数。
在下面的简单定理中,直接以证明函数的形式给出了证明。我想了解这两个用括号括起以反映我的概念的术语如何组合成 returns 预期类型的最终证明函数。
Lemma simple : forall i, i <= S i.
Proof
fun i => (le_S i i) (le_n i).
似乎 (le_S i i)
构造函数返回了一个函数,该函数接受 (le_n i)
作为参数。有人可以在这里解释一下证明函数组合是如何工作的吗?
(le_S i i)
是一个函数值。它期望另一个值作为参数,这里 (le_n i)
,类型 (i <= i)
,因为 le_n
的类型是 forall n : nat, (n <= n)
。应用于此参数的 (le_S i i)
的值是 (i <= S i)
类型,正如您可以从 le_S
的类型中看到的那样。引理中的 forall
解释了用于定义 simple
.
fun
您可能想阅读 (https://en.wikipedia.org/wiki/Curry–Howard_correspondence)。
基本上,在 Coq 中,证明是将某些命题的证据(以证人的形式)作为论证并为新的派生命题提供证据(证人)的函数。
如果你这样做 Check le_S.
你会得到
le_S
: forall n m : nat, n <= m -> n <= S m
所以 le_S
是一个函数,它接受两个 nat 和一个 n <= m
的见证,并为 n <= S m
.
在你的例子中 le_n i
是 i <= i
的见证人。
请注意,->
符号与 Check Nat.add.
Nat.add
: nat -> nat -> nat
至于证据。 a -> b
在这两种情况下都表示从类型 a
到类型 b
的函数。