假设我们有一种编程语言ℤ,它具有以下语法:
ℤ := 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)
,要么证明不可能这样做。
答案 0 :(得分:5)
这是不可能的。
如果存在具有整数系数和阈值f : Z -> Z
的多项式p
,则调用函数t
最终多项式,对于每x > t
我们有f(x) = p(x)
。让d(x) = [x/2]
为二等分。 d
最终不是多项式的,因为d
的差分序列具有无穷多个零(f(2y) = y = f(2y+1)
对于所有y
),而每个非常数多项式的差分序列具有有限性许多。它足以证明所有可实现的函数最终都是多项式的。
通过结构归纳进行证明。 0
和1
是多项式。直接表明最终多项式函数的和,乘积和差异最终是多项式:使用两个阈值的最大值以及在这些操作下闭合多项式集合的事实。剩下的就是max
下的封闭。
让f
最终通过多项式p
进行多项式,g
最终通过多项式q
进行多项式。如果p = q
,则显然x |-> max(f(x), g(x))
最终通过相同的多项式进行多项式。否则,请注意p - q
有很多真正的根。将阈值设置为根的上限,我们观察到最大函数最终通过p
或q
进行多项式,因为max的另一种情况从不在此触发。
答案 1 :(得分:0)
递归和分支的组合将为您提供循环。
(div x y) = (iff gte(x y) (+ 1 (div((- x y) y))) 0)
在更多功能方面,我们正在重复减法。如果x> = y,则向商中添加一个,从x中减去y,然后重复。否则,返回0。
if x >=y
return 1 + div(x-y y)
else
return 0