ssreflect是否假设被排除在中间?

时间:2015-12-29 23:49:33

标签: coq ssreflect

我正在阅读ssreflect教程,which reads

  

下面,我们通过翻译命题陈述来证明......   进入它的布尔对应物,很容易用粗暴的证明   力。这种证明技术称为反射。 Ssreflect的设计   允许和ssreflect的精神建议广泛使用这样的   技术

这(反射)是否意味着ssreflect假定排除中间(forall A:Prop, A \/ ~A)?

它看起来就是这种情况,因为所有布尔值都满足E.M.如果是这样,这将是遵循ssreflect样式的一个很大的假设。

另外,我不太了解" local"或者"小规模"其中的一部分如下:

  

因为它通常在本地使用来有效地处理小部分   证明(而不是在整体证明结构中使用),   这称为小规模反射,因此名称为ssreflect。

小零件是什么意思整体证明结构。这是否意味着我们有时可以在当地假设E.M.并且一般不使用E.M.或者这里的当地人是否意味着其他东西?

另外,我在Coq方面经验不足,并且不太清楚这个"暴力" "布尔对应物" (主要基于我到目前为止所读到的case分析)比香草Coq方式更有效。对我来说,蛮力不是很直观,在你看到结果之前不容易猜到。

用于说明效率的具体例子是什么?

2 个答案:

答案 0 :(得分:5)

Ssreflect不假设被排除在中间,但是库的很大一部分是建立在布尔命题上的,即类型bool,它确实保留了

forall b : bool, b = true \/ b = false

通常使用隐式is_true转换编写上述的等效版本,如:

forall b : bool, b \/ ~ b.

“反映”谓词是那些版本为bool的谓词;一个很好的例子就是自然数之间的“小于或等于”关系。

在标准Coq中,le被编码为归纳类型,而在ssreflect中,它是一个计算函数leq: nat -> nat -> bool

使用leq函数进行校样更加“有效”,原因如下:想象一下你想要证明102 < 203。使用标准Coq定义,您必须构建一个大的证明术语,您必须明确编码证明的每一步。

然而,凭借其计算对应物,证明只是术语erefl,见证算法返回true。除了IMO的许多其他优点外,这在大型样张中至关重要。

最后,我必须不同意“ssreflect只涉及可判定类型”的说法。虽然这些库的大部分都是基于可判定的(布尔)谓词,但还有许多其他的假设没有做出,或者在某些公理的存在下非常有用。

答案 1 :(得分:3)

Ssreflect一般不会假设被排除的中间人,你将无法证明

forall A: Prop, A \/ ~A

但是,ssreflect只关注 decidable 类型:可以决定相等性的类型,通常表示为

Definition decidable (T:Type) := forall x y:T, {x = y}+{x <> y}.

在Coq。这意味着对于T类型的任何两个元素,您可以得到一个建设性的(在Set中,而不是在Prop中,就像被排除的中间)证明它们是相同的或不同的。因此,大多数推理都可以在bool而不是Prop中完成,因此您有一些受限制的排除中间形式,仅用于布尔语句。