是否可以仅使用基本运算符(+
,-
,/
,*
)对控制流指令进行建模?如果不是,那么建模它的最小运算符集是什么?
什么是等效的实施:
def iff(a: Int, b: Int, c: Int): Int = if (a < 0) b else c
答案 0 :(得分:1)
从理论的角度来看Peano arithmetic是图灵完成的 然而,PA是一阶系统,而您提供的“基本运算符”甚至没有形式化,也不能被视为PA的一部分。
所以你可能不会询问PA和类似的系统。
如果您“允许”原始递归,则可以访问Primitive recursive functions。这些可以扩展到整数(而不仅仅是自然数) 虽然他们不是图灵完成的,但他们足够强大,可以计算你给出的功能(见下文),从而做出决定 但请注意,递归是通过structural induction对自然数进行的,基本情况(计算在“零”上的函数)本质上是一种特殊化形式(即 if )。
所以你也不可能询问PRF。
如果“基本运算符”表示表达式,在编程语言意义上,仅涉及操作侦听,则答案为否(除非b
= c
)。
这可以通过注意到基本运算符是继续的来证明,而iif
通常不是(在0中停止)。
但是,如果编程语言具有模式匹配,那么iif
的实现方式与PRF的完成方式类似。
如果整数具有有限的精度,则可以利用它们的合适编码(如two's complement)来提取“符号信息”并实现sgn(a)
函数,从而iif
(见下文) )。
随后的问题要求最小的运营商集合的问题很少,因为它缺乏背景:我们试图流动什么“控制”?换句话说,我们使用的计算模型是什么?
如果我们可以抽象,编码和操作计算,就像函数一样,例如使用指向函数的指针,一阶函数或延续(或自修改代码),而不是我们可以用一个< em> if 并使用iif
var branches = [() => console.log('a not equals b'), () => console.log('a equals b')];
var a = ...
var b = ...
branches[iif(a-b, 0, iif(b-a, 0, 1))]();
当您提出问题时,此计算模型可能会或可能不是您的想法
如果没有计算的抽象,但仍假设存在iif
,我们可以进行专门化但不进行(甚至是有界的)迭代(除非我们可以对程序计数器进行算术运算)。
因此,我们还需要一个运算符,它根据变量 x 应用一个表达式,每次固定的时间,递增 x 。
但这只是一个原始的原始递归,我们的模型变得非常类似于PRF。
最后,一般来说,你需要一个潜在的无限(无限)迭代,比如μ-minimisation。
但是我们已经证明,我们不能仅在具有算术表达式的抽象编程语言中实现iif
我猜想引入一个不连续的函数(如sgn
,符号函数)就足以实现iif
。
根据原始递归函数iif
编写sgn
。
这里我们通过使用算术运算符inline来滥用符号,并隐式使用它们在合适的编码下使用整数的扩展版本。
使用PRF iff
可以定义为(b + c - sgn'(a) * (b - c))/2
sgn'(a)
是一个函数,如果 a 为负数,则返回-1,否则返回1
它可以从sgn(a)
(标准符号函数)计算为sgn'(a) = (sgn(a) + 2) / 2 * 2 - 1
请注意,除法在整数之间,因此x / 2 * 2
不会取消
sgn(a)
可以按照here的规定进行计算。