关于何时使用道具以及何时使用布尔的一般建议

时间:2017-06-19 19:45:18

标签: coq

我正在形成一个基本上超过布尔表达式的语法。在coq中,你可以在Prop中获得类似布尔的东西,或者在bool中更明确地获得。

例如,我可以写:

true && true

True /\ True

问题是在证据中(这是我真正关心的)我可以在域bool中进行案例分析,但在Prop中这是不可能的(因为所有成员都不是可枚举的,我想)。即使对于非常简单的证明,放弃这种策略和类似的重写策略似乎也是一个巨大的缺点。

一般情况下,选择Prop over bool进行正式化的情况是什么?我意识到这是一个广泛的问题,但我觉得Coq手册中没有充分解决这个问题。我对现实世界的经历很感兴趣。

1 个答案:

答案 0 :(得分:4)

对此有很多不同的意见。我个人认为,最好不要做出这样的选择:有两个版本的属性是合理的,一个在Prop,另一个在bool

你为什么要这样?正如您所指出的,布尔支持证据和函数中的案例分析,而一般命题则不然。但是,Prop在某些情况下使用起来会更方便。假设您的类型T具有有限的多个值。我们可以写一个程序

all : (T -> bool) -> bool

决定布尔属性P : T -> bool是否包含T的所有元素。想象一下,对于某些属性all P = true,我们知道P。我们可能希望使用这一事实来得出P x = true某些值x。要做到这一点,我们需要证明关于all的一个引理:

allP : forall P : T -> bool,
         all P = true <-> (forall x : T, P x = true)

这个引理连接了两个相同属性的不同公式:布尔值和命题值。在推理证据中all时,我们可以调用allP在两者之间自由转换。我们也可以有不同的转换引理:

allPn : forall P,
          all P = false <-> (exists x, P x = false)

事实上,我们可以自由选择任何 Coq命题与布尔计算相关(当然,因为我们可以证明这两者在逻辑上是等价的)。例如,如果我们想要一个与布尔属性相关联的自定义归纳原理,我们可以寻找一个等价的公式作为一个归纳定义的命题。

Mathematical Components库是遵循这种风格的开发的一个很好的例子。实际上,因为它在那里非常普遍,所以库提供了一种特殊的 view 机制,用于编写如上所述的转换引用并应用它们。在普通的Coq中,我们也可以使用rewrite策略更方便地应用逻辑等价。

当然,在许多情况下,拥有相同属性的两种配方是没有意义的。有时,您被迫使用Prop,因为您关心的财产是不可判定的。有时,您可能会觉得通过在Prop中编写属性而无法获得任何内容,并且可能仅将其保留为布尔值。

除了上面链接的Software Foundations章节之外,this answer还更深入地讨论了boolProp之间的区别。