我们什么时候可以说两个程序不同?


15

Q1。我们什么时候可以说两个程序(用某些编程语言,如C ++编写)不同?

第一个极端是,如果两个程序相同,则它们是等效的。另一个极端是,如果两个程序计算相同的功能(或在相似的环境中显示相同的可观察行为),则它们是等效的。但这并不是很好:并非所有检查素数的程序都相同。我们可以添加一行代码,而不会影响结果,我们仍将其视为同一程序。

Q2。程序和算法是同一种对象吗?如果不是,算法的定义是什么?它与程序的定义有何不同?我们什么时候可以说两种算法是等效的?


程序同构问题?不能问“这个程序与总是停止的程序同构吗?” 并恢复暂停问题?如果我们将自己限制在有限停止程序问题上,这不仅是图同构吗?
user834 2011年

5
两种算法什么时候相同?arxiv.org/abs/0811.0811
sdcvvc 2011年

1
它不完全取决于上下文吗?这里有点哲理,但是螺栓固定的椅子和颠倒的螺栓固定的椅子在物理上是相同的东西,但就椅子的概念而言是不同的。
宫坂丽

稍微偏离主题,但由于证据是程序... gowers.wordpress.com/2007/10/04/...
拉杜·格里戈里

1
以下文章非常相关。我只是前些时候略读而已,但是Blass和Gurevic通常写得很好(我只是不记得读过Dershowitz的其他文章,并不是说它通常不太可读)。 research.microsoft.com/en-us/um/people/gurevich/Opera/192.pdf两种算法何时相同?安德烈亚斯·布莱斯,纳切姆·德维希茨和尤里·古维奇
kasterma 2013年

Answers:


18

问题1:有许多程序等效的概念(跟踪等效,上下文等效,观察等效,双相似性),它们可能会或可能不会考虑时间,资源使用,不确定性,终止等问题。在寻找可用的程序等效概念方面,已经做了很多工作。例如:Andy Pitts的基于操作的程序等效理论。但这勉强能刮伤表面。即使您对两个程序都不相同的情况感兴趣,这也将很有用。甚至可以对非暂停程序进行推理(使用双仿真和协导)。

问题2:对此问题的一部分可能的答案是,交互程序不是算法(假设人们认为一种算法可以一次获取所有输入,但是这种狭义的定义不包括在线算法)。程序可以是也与环境交互的交互过程的集合。这当然与图灵机/递归理论的算法概念不符。


通常,经典算法概念根本不涵盖IO和副作用。
拉斐尔

15

另一个极端是,如果两个程序计算相同的功能(或在相似的环境中显示相同的可观察行为),则它们是等效的。但这并不是很好:并非所有检查素数的程序都相同。我们可以添加一行代码,而不会影响结果,我们仍将其视为同一程序。

这不是极端的情况:程序等效性必须对于观察概念进行定义。

PL研究中最常见的定义是上下文对等。在上下文等效中,其思想是我们通过将程序用作大型程序(上下文)的组成部分来观察程序。因此,如果两个程序针对所有上下文计算出相同的最终值,则它们被认为是相等的。由于此定义量化了所有可能的程序上下文,因此很难直接使用。因此,PL中的典型研究程序是寻找暗示上下文对等的构图推理原理。

但是,这不是观察的唯一可能概念。例如,我们可以轻松地说出程序的内存,时间或电源行为是可以观察到的。在这种情况下,由于我们可以区分更多程序(例如,现在可以将mergesort与quicksort区别开),因此程序等价物更少。如果您想(说)设计不受时序通道攻击的语言,或者设计不受空间限制的编程语言,那么这就是您要做的事情。

同样,我们可以选择将计算的某些中间状态判断为可观察到的。对于并行语言,由于干扰的可能性,总是会发生这种情况。但是,即使对于顺序语言,您可能也要采取这种观点-例如,如果要确保没有任何计算将未加密的数据存储在主内存中,则必须将对主内存的写入视为可观察到的。

基本上,没有程序等效性的单一概念。它始终与您选择的观察概念有关,并且取决于您所考虑的应用程序。


1
值得指出的是,也没有上下文等效(或上下文一致性)的唯一概念,例如,如果所讨论的编程语言是交互式的(即不产生值)。
Martin Berger

α

1
αα

1
@ SamTobin-Hochstadt。好吧,让我们忘记“通常”。我的感觉是,您说的是Neel所说的那句话,在我看来这是深思熟虑的。您的想法(对我来说仍然很模糊)可以通过选择正确的观察结果和正确的程序上下文形式,在Neel的框架中形式化。
Uday Reddy'3

1
λλXXλÿÿ

2

问题2:我认为通常的理论定义并不能真正区分算法和程序,但是常用的“算法”更像是一类程序。对我来说,算法有点像一个程序,其中有些子例程尚未完全指定(即,定义了所需的行为,但未定义其实现)。例如,高斯消除算法并没有真正指定整数乘法的执行方式。

如果天真,对不起。我不做PL研究。


想法可能是这些子例程有多个实现,并且您不在乎选择哪个子例程,只要它根据您的规范执行即可。
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.