使用基本算术运算符的模型控制流指令

时间:2016-09-21 22:33:02

标签: computer-science

是否可以仅使用基本运算符(+-/*)对控制流指令进行建模?如果不是,那么建模它的最小运算符集是什么?

什么是等效的实施:

def iff(a: Int, b: Int, c: Int): Int = if (a < 0) b else c

1 个答案:

答案 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的规定进行计算。