Coq中的连词与含义

时间:2012-11-29 00:53:59

标签: coq

我目前正在阅读Software Foundations一书。当定义定义时,我经常会看到一些含义链,我相信连词会更有意义。例如,在定义鸽笼原则时,作者写道:

Theorem pigeonhole_principle: ∀{X:Type} (l1 l2:list X),
  excluded_middle →
  (∀x, appears_in x l1 → appears_in x l2) →
  length l2 < length l1 →
  repeats l1.

如果它看起来更像是这个定义对我更有意义:

Theorem pigeonhole_principle: ∀{X:Type} (l1 l2:list X),
  (excluded_middle /\
  (∀x, appears_in x l1 → appears_in x l2) /\
  length l2 < length l1) →
  repeats l1.

为什么第一个版本正确?为什么连词不合适?

这只是一个例子。更一般地说,我问为什么连词似乎被避开以支持coq中的含义链。

1 个答案:

答案 0 :(得分:8)

这是function currying的定理证明版本。

总结一下,这两个表达式都是正确的(它们是等价的)。

有人说:给我一个“被排除在外的中间人”。现在给我假设2.现在给我假设3.好的,这是一个属性“重复l1”。

另一个说:给我一个“排除中间”,假设2和假设3.好的,这是一个属性“重复l1”。

Coq等证明助理的用户和实施者也是功能性程序员,而且curried版本对于他们来说就像未经证实的版本一样自然。