Q1。我们什么时候可以说两个程序(用某些编程语言,如C ++编写)不同?
第一个极端是,如果两个程序相同,则它们是等效的。另一个极端是,如果两个程序计算相同的功能(或在相似的环境中显示相同的可观察行为),则它们是等效的。但这并不是很好:并非所有检查素数的程序都相同。我们可以添加一行代码,而不会影响结果,我们仍将其视为同一程序。
Q2。程序和算法是同一种对象吗?如果不是,算法的定义是什么?它与程序的定义有何不同?我们什么时候可以说两种算法是等效的?
Q1。我们什么时候可以说两个程序(用某些编程语言,如C ++编写)不同?
第一个极端是,如果两个程序相同,则它们是等效的。另一个极端是,如果两个程序计算相同的功能(或在相似的环境中显示相同的可观察行为),则它们是等效的。但这并不是很好:并非所有检查素数的程序都相同。我们可以添加一行代码,而不会影响结果,我们仍将其视为同一程序。
Q2。程序和算法是同一种对象吗?如果不是,算法的定义是什么?它与程序的定义有何不同?我们什么时候可以说两种算法是等效的?
Answers:
问题1:有许多程序等效的概念(跟踪等效,上下文等效,观察等效,双相似性),它们可能会或可能不会考虑时间,资源使用,不确定性,终止等问题。在寻找可用的程序等效概念方面,已经做了很多工作。例如:Andy Pitts的基于操作的程序等效理论。但这勉强能刮伤表面。即使您对两个程序都不相同的情况感兴趣,这也将很有用。甚至可以对非暂停程序进行推理(使用双仿真和协导)。
问题2:对此问题的一部分可能的答案是,交互程序不是算法(假设人们认为一种算法可以一次获取所有输入,但是这种狭义的定义不包括在线算法)。程序可以是也与环境交互的交互过程的集合。这当然与图灵机/递归理论的算法概念不符。
另一个极端是,如果两个程序计算相同的功能(或在相似的环境中显示相同的可观察行为),则它们是等效的。但这并不是很好:并非所有检查素数的程序都相同。我们可以添加一行代码,而不会影响结果,我们仍将其视为同一程序。
这不是极端的情况:程序等效性必须相对于观察概念进行定义。
PL研究中最常见的定义是上下文对等。在上下文等效中,其思想是我们通过将程序用作大型程序(上下文)的组成部分来观察程序。因此,如果两个程序针对所有上下文计算出相同的最终值,则它们被认为是相等的。由于此定义量化了所有可能的程序上下文,因此很难直接使用。因此,PL中的典型研究程序是寻找暗示上下文对等的构图推理原理。
但是,这不是观察的唯一可能概念。例如,我们可以轻松地说出程序的内存,时间或电源行为是可以观察到的。在这种情况下,由于我们可以区分更多程序(例如,现在可以将mergesort与quicksort区别开),因此程序等价物更少。如果您想(说)设计不受时序通道攻击的语言,或者设计不受空间限制的编程语言,那么这就是您要做的事情。
同样,我们可以选择将计算的某些中间状态判断为可观察到的。对于并行语言,由于干扰的可能性,总是会发生这种情况。但是,即使对于顺序语言,您可能也要采取这种观点-例如,如果要确保没有任何计算将未加密的数据存储在主内存中,则必须将对主内存的写入视为可观察到的。
基本上,没有程序等效性的单一概念。它始终与您选择的观察概念有关,并且取决于您所考虑的应用程序。
问题2:我认为通常的理论定义并不能真正区分算法和程序,但是常用的“算法”更像是一类程序。对我来说,算法有点像一个程序,其中有些子例程尚未完全指定(即,定义了所需的行为,但未定义其实现)。例如,高斯消除算法并没有真正指定整数乘法的执行方式。
如果天真,对不起。我不做PL研究。