是否可以通过算法测试可计算数是有理数还是整数?换句话说,将有可能为图书馆实现可计算数提供的功能isInteger
还是isRational
?
我猜测这是不可能的,并且这在某种程度上与以下事实有关:无法测试两个数字是否相等,但是我看不出如何证明这一点。
编辑:可计算的数字由函数给出,该函数可以返回精度为ϵ的的有理近似值:| x − f x(ϵ )| ≤ ε,对于任何ε > 0。鉴于这样的功能,就是可以测试,如果X ∈ Q或X ∈ ž?
是否可以通过算法测试可计算数是有理数还是整数?换句话说,将有可能为图书馆实现可计算数提供的功能isInteger
还是isRational
?
我猜测这是不可能的,并且这在某种程度上与以下事实有关:无法测试两个数字是否相等,但是我看不出如何证明这一点。
编辑:可计算的数字由函数给出,该函数可以返回精度为ϵ的的有理近似值:| x − f x(ϵ )| ≤ ε,对于任何ε > 0。鉴于这样的功能,就是可以测试,如果X ∈ Q或X ∈ ž?
Answers:
对于“代表”或“实现”实数的含义很容易感到困惑。实际上,我们在评论中目睹了一个讨论,该讨论存在争议。因此,让我首先解决这个问题。
解释如何在计算机中表示事物的理论是可实现的。其基本思路是,给定一组,我们选择一个数据类型τ和每一个X ∈ X一组类型的值τ其中实现它。我们写v ⊢ X ∈ X时,v是一个值了实现X。例如(我将使用哈斯克尔没有很好的理由),一个合理的实施ñ可能是数据类型,其中v ⊢ ķ ∈ ñ当vInteger
计算结果为数字(因此特别不表示自然数,并且同样没有发散程序)。但一些小丑可以通过行走,并建议我们使用与代表自然数牛逼[R ü è ⊢ 42 ∈ ñ和˚F 一升小号Ë ⊢ ñ ∈ ñ为ñ ≠ 42。为什么这不正确?我们需要一个标准。-42
Bool
在“小丑号码”的情况下,很容易观察到无法实现加法运算。假如我告诉你,我有两个数字,由双方代表。你能给一个实现者多少钱吗?好吧,这取决于总和是否为42,但是您无法确定。由于加法是“自然数是必不可少的部分”,因此这是不可接受的。换句话说,实现不是关于集合,而是关于结构,即,我们必须以这样的方式表示集合:也可以实现相关的结构。让我强调一下:
我们实现结构,而不是裸集。因此,我们必须能够实现整个结构以及操作和所有公理,以使实现正确。
如果您不遵守该原则,则必须提出另一种正确性的数学准则。我不知道一个。
对于自然数,相关结构由Peano公理描述,必须实现的关键公理是归纳法(也可以是,后继,+和×)。我们可以使用可实现性来计算归纳的实现。原来是一张地图(代表自然数的未知数据类型在哪里)nat
induction : 'a -> (nat -> 'a -> 'a) -> 'nat -> 'a
满意induction x f zero = x
和induction x f (succ n) = f n (induction x f n)
。所有这些都是出于可实现性。我们有一个标准:自然数的实现在允许实现Peano公理的情况下是正确的。如果我们使用的数字的表征作为算符初始代数类似的结果将获得。
让我们将注意力转向实际数字和眼前的问题。要问的第一个问题是“实数的相关结构是什么?” 答案是:阿基米德·柯西完成有序字段。这是“实数”的既定含义。您不必更改它,它已由其他人为您修复(在我们的案例中,替代的Dedekind实物与我们在考虑的Cauchy实物同构)。您无法删除其中的任何部分,您不得说“我不在乎执行加法”或“我不在乎订单”。如果这样做,则不能将其称为“实数”,而应称为“我们忘记线性顺序的实数”。
我将不涉及所有细节,但让我只解释一下结构的各个部分如何实现实际的各种操作:
lim : (nat -> real) -> real
,其需要(的表示)迅速柯西序列,并返回它的极限。(A序列是快速如果| X ñ - X 米| ≤ 2 分钟(对于所有米,Ñ。)我们没有得到的是相等性的测试函数。实在的公理中没有什么要求可判定的。(相反,Peano公理表示自然数是可确定的,您可以通过仅将它用作有趣的练习来证明这一点)。eq : nat -> nat -> Bool
induction
一个事实是,人类使用的通常的十进制实数表示形式不好,因为我们甚至不能实现加法。具有无限尾数的浮点也会失败(练习:为什么?)。但是有效的是带符号的数字表示,即在其中我们允许负数也可以是正数。或者我们可以使用满足快速柯西检验的理性序列,如上所述。
让我们考虑以下实数表示:实数由一对(q ,b )表示,其中(q n )n是收敛到x的快速柯西序列,而b是指示x是否为整数的布尔值。为了将其表示为实数,我们必须实现加法,但事实证明我们无法计算布尔标志。因此,这不是真实的表示。但它仍然代表某种东西,即实数的子集。实际上,根据可实现性解释的联合与指示工会我们是在哪部分的标志来实现。顺便提一句,是一个不等于 [R ,除非你相信排中,这无法实施,因此与该讨论完全无关。计算机迫使我们凭直觉做事。
最后,让我回答提出的问题。我们现在知道,可以通过快速的柯西序列理性来表示实数。(一个重要的定理指出,可接受的实数的任何两个表示实际上都是可计算的同构。)
定理:无法确定实数是否为整数。
证明。假设我们可以测试一个实数是否为整数(当然,该实数是通过快速柯西序列实现的)。这个想法可以让您证明一个更通用的定理,该想法是构造一个非整数的快速柯西序列,它收敛到一个整数。这很容易,只要取x n = 2 − n即可。接下来,按以下方法解决暂停问题。给定图灵机T,通过 y n = { x n 如果 T定义一个新序列(y n )n 也就是说,新序列的样子序列(Xñ)ñ只要牛逼运行,但随后被“卡住”在X米,如果Ť停止在步骤米。非常重要的是,新序列也是快速柯西序列(我们可以在不知道T是否停止的情况下证明这一点)。因此,我们可以计算其极限z=limnyn
练习:修改以上证明以表明我们无法测试有理数。然后对其进行调整,以表明我们无法测试任何非平凡的东西(这有点困难)。
有时人们会对所有这些测试业务感到困惑。他们认为我们已经证明,我们永远无法测试一个实数是否为整数。但是可以肯定的是42是实数,我们可以判断它是否是整数。事实上,任何特定的现实,我们想出了,,88 LN 89,É π √等,我们可以很好地判断它们是否为整数。确切地说,我们可以说是因为我们有更多信息:这些实数不是作为序列提供给我们的,而是作为可以用来计算Tsuyoshi位的符号表达式。一旦我们拥有关于实数的唯一信息,便是一个有理逼近序列收敛到该序列(我不是要描述该序列的符号表达式,而是一个在输入n上输出第n个项的黑盒),那么我们就像机器一样无助。
除非我们知道要对集合执行哪种操作,否则谈论集合的实现没有任何意义。
我倾向于认为这是不可确定的:
令为可计算的无理数。考虑一个TM 中号。您可以构造一个在ϵ上运行M的函数,并以越来越高的精度并行计算x。如果M暂停,它将停止计算x,否则它将继续。
决定此函数是否计算有理数等效于暂停问题。
Assuming a real is given as a sequence of rational approximations with the error bounded by some known computable function which tends to zero (all such approximations are equivalent, and correspond to the usual topology on the reals).
Computable functions are continuous. IsRational and IsInteger are not continuous and therefore not computable.
IsInteger is semi-computable: there is a procedure that will eventually output "false" if the input is not an integer, but will run forever if the input is an integer. This procedure simply looks at each approximation and checks whether there is an integer within the error bound. This function is continuous when we use the Sierpiński topology on {true, false} (i.e. {false} is an open set but {true} is not).
It is undecidable whether a given computable number is equal to zero.
(So your rational approximation oracle returns 0 for every ε you've tried? Maybe you just haven't given it a small enough ε.)
Thus, it's undecidable whether a given computable number between -½ and +½ is an integer.
A function being computable is a stronger than the function being continuous, i.e. any computable function needs to be continuous in the information topology.
You want to see if the function defined by
is computable.
Let's assume that similar to what you wrote, real numbers are given by black-boxes and a real number black-box can be used to obtain a rational number of the form such that for any natural number .
Then your function is not continuous and is therefore not computable.
Here is a more direct and intuitive adversary argument: Let be a machine. Assume that the number is . Assume that for the black-box returns . If doesn't halt we are done. If it halts, let the largest number that has asked an approximation for to be . Then information that has seen up to this point is consistent with the real number being any real number in the interval , i.e. doesn't have enough information to correctly solve the problem. If answers then the answer is incorrect. If it answers then we can consider running on any irrational number in the interval and will incorrectly answer since it will get exactly the same information from the black-box. Therefore cannot solve the problem correctly.
The proof that any computable function needs to be continuous is similar.