【发布时间】:2018-10-10 20:42:00
【问题描述】:
假设我们有一种编程语言ℤ,它的语法如下:
ℤ := 0 | 1 | (+ ℤ ℤ) | (* ℤ ℤ) | (- ℤ ℤ) | (max ℤ ℤ)
为方便起见,我们可以在我们的语言中定义新的绑定形式如下:
(not x) = (- 1 x)(abs x) = (- (max 0 (+ x x)) x)(min x y) = (- 0 (max (- 0 x) (- 0 y)))(nil x) = (not (min 1 (abs x)))
这种语言足够强大,可以表达分支和比较运算符:
(if x y z) = (+ (* x y) (* (not x) z))(eq x y) = (nil (- x y))(ne x y) = (not (eq x y))(le x y) = (nil (max 0 (- x y)))(gt x y) = (not (le x y))(ge x y) = (le y x)(lt x y) = (not (ge x y))
现在,问题是我们是否可以定义整数除法是这种语言:
(div x y) = ?(rem x y) = (- x (* y (div x y)))
我认为不可能定义(div x y),因为ℤ 没有循环。但是,我不知道如何证明这一点。请注意,如果可能,那么(div x 0) 的结果无关紧要。因此,要么定义(div x y),要么证明不可能这样做。
【问题讨论】:
-
是否 ℤ 允许递归?
-
不,它不允许递归。绑定表格只是一种方便。不允许使用递归绑定表单。
-
这显然是不可能的,但我看不到证据。我想你最好在 cs.stackexchange 上尝试一下。
-
更简单的问题:你能用这种语言定义
(odd x)吗?如果没有,那么(div x y)就没有希望了。 (我会问(even x),但似乎有一个隐含的要求,所有函数名称都是三个字母长......) -
我相信您应该能够证明(例如,通过结构归纳法)单个变量
x的任何函数f可以用这种语言表达最终一个多项式:也就是说,有一些整数x0和多项式p使得f(x)等于p(x)对于所有x超过x0。这应该证明(odd x)是不可能的(因此(rem x y)和(div x y)是不可能构造的)。
标签: algorithm math integer logic lambda-calculus