假设我们有类似的东西:
假设x是实数。证明如果存在实数y使得(y + 1)/(y-2)= x,那么x<> 1" 。
如果以明显的方式制定它:forall x : R, (exists y, ((y + 1) * / (y - 2)) = x) -> x <> 1
,很快就会遇到问题。
我们假设y
存在((y + 1) * / (y - 2)) = x)
。我错误地认为这也意味着y <> 2
?有没有办法在Coq中恢复这些信息?
当然,如果存在这样的y
,那么它不是2.如何在Coq中恢复这些信息 - 我是否需要明确地假设它(也就是说,没有办法通过存在实例化来恢复它不知何故?)。
当然,destruct H as [y]
仅为((y + 1) * / (y - 2)) = x)
提供y : R
,但现在我们不知道y <> 2
。
答案 0 :(得分:4)
我错误地认为这也意味着
y <> 2
?
是。在Coq中,除法是一个完全无约束的函数:你可以将它应用于任何一对数,包括零除数。如果你想假设y <> 2
,你需要将它作为明确的假设添加到你的引理中。
你可能会发现这个可怕:我们怎么能被允许将零分割?答案是没关系,只要你不试图争论0 * (x / 0) = x
。 This question更详细地讨论了这个问题。
答案 1 :(得分:3)
Coq中的实数是公理化定义的,即它们只是与类型相关的名称,名称上没有定义。基本数字(R0
,R1
)和实数(Rplus
,Rmult
等)上的操作不会被执行,即操作不是函数。从某种意义上说,只需通过构造实数来构建实数,就像使用数据构造函数一样(但我们不能在实数上进行模式匹配)。
以上意味着,例如1/0
是有效的实数。它只是实数的公理的前提,禁止涉及这样的表达式的一些简化:我们不能将1/0 * 0
之类的表达式重写为1
(但是,我们可以将其重写为{ {1}})。
以下是我们如何证明我们无法从
这样的表达式派生0
的方法
y <> 2
因为我们被允许使用“奇怪的”实数:
(y + 1) / (y - 2) = x