我正在阅读ssreflect教程,which reads:
下面,我们通过翻译命题陈述来证明...... 进入它的布尔对应物,很容易用粗暴的证明 力。这种证明技术称为反射。 Ssreflect的设计 允许和ssreflect的精神建议广泛使用这样的 技术
这(反射)是否意味着ssreflect假定排除中间(forall A:Prop, A \/ ~A
)?
它看起来就是这种情况,因为所有布尔值都满足E.M.如果是这样,这将是遵循ssreflect样式的一个很大的假设。
另外,我不太了解" local"或者"小规模"其中的一部分如下:
因为它通常在本地使用来有效地处理小部分 证明(而不是在整体证明结构中使用), 这称为小规模反射,因此名称为ssreflect。
小零件是什么意思整体证明结构。这是否意味着我们有时可以在当地假设E.M.并且一般不使用E.M.或者这里的当地人是否意味着其他东西?
另外,我在Coq方面经验不足,并且不太清楚这个"暴力" "布尔对应物" (主要基于我到目前为止所读到的case
分析)比香草Coq方式更有效。对我来说,蛮力不是很直观,在你看到结果之前不容易猜到。
用于说明效率的具体例子是什么?
答案 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
中完成,因此您有一些受限制的排除中间形式,仅用于布尔语句。