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 ii <= i 的见证人。

请注意,->符号与 Check Nat.add.

等常用函数的含义相同
Nat.add
     : nat -> nat -> nat

至于证据。 a -> b 在这两种情况下都表示从类型 a 到类型 b 的函数。