是否可以计算两个函数是否在扩展上相等?


9

如果您有两个实现不同排序算法的函数,那么是否可以通过源代码推断它们都具有相同的外部属性?意味着它们都将具有可能的未排序序列作为输入并具有已排序序列作为输出?这些外部属性可以通过什么方式由源代码确定?您将如何描述这些外部属性?将使用什么表示法?

可以通过显式定义外部属性(例如在类型系统中)来使外部属性已知,但是我想知道是否可以隐式完成。还是在某种程度上理论上无法推断出这种语义?我对这是否适用于任意函数(不仅是排序算法)感兴趣,并假设函数之类的东西总是会停滞并且没有副作用。

我应该看看指称语义还是无关的?

我对这方面的研究以及用于描述可能有助于我的文献检索的主题的不同术语感兴趣。

Answers:


8

是。如果可以验证它们是否相同,那么计算机也可以。

以下是Coq中整数排序的快速说明:

Inductive natlist : Type :=
| nil : natlist
| cons : nat → natlist → natlist.

Fixpoint is_sorted (l : natlist ) : bool :=
    match l with
    |  nil => true
    |  (cons x nil) => true
    |  (cons x (cons y r)) => if x <= y then is_sorted (cons y r) else false
    end.

...

Theorem sort_spec : forall l, is_sorted (sort_list l).

可以使用从属类型将规范直接编码为排序声明。

对于这个特殊的问题,约翰·达林顿(John Darlington)在20世纪70年代证明,可以通过将分类规范机械地转换为实现方式来获得6种分类算法。我相信这取名为“基于语义的程序派生”。

在软件工程界,找到扩展上等效的功能称为“语义克隆检测”。

戴夫·克拉克(Dave Clarke)在CS StackExchange上也对这个问题给出了很好的答案:https ://cs.stackexchange.com/questions/2059/how-do-you-check-if-two-algorithms-return-the-same-result 对于任何输入

这一切都属于形式方法编程语言的范畴。指称语义是用于建模语义的一类技术,但是由于与操作语义相比难以使用,因此它们不受欢迎。


感谢您的回答!这正是我要寻找的。
Matthijs Steen

4
我强烈不同意指称语义“失宠”的说法。那很大程度上取决于你问谁。
Andrej Bauer 2012年

5

通常,图灵完整的编程语言中的扩展相等性是无法确定的,但这不会阻止您验证或伪造任何两个特定函数在扩展上相等。

验证可以多种形式进行,例如,您可以使用操作语义在ZFC集合理论中进行推理。但是,那将是痛苦的。如果存在指称语义,则也可以使用它们,但是只有少数几种语言才具有良好的指称语义。通常,人们使用程序逻辑(例如Hoare逻辑)来显示程序的扩展相等性。为了做到这一点,具有功能的语言的Hoare逻辑通常需要一个公理,指出f=gxα.f(x)=g(x), 假如说 fg 是类型的函数 αβ (公理变量的详细信息以及所选择的Hoare逻辑方法的细节)。


感谢您的回答。我将研究Hoare的逻辑。与Hoare逻辑相比,指称语义难于定义吗?还是不适合大多数语言?总体上由于停止问题而无法确定伸张平等吗?然后,如果像总功能语言一样总要停止运行功能,一般来说这不是可以决定的吗?还是还有其他无法确定的原因?
Matthijs Steen 2012年

@ Matthijs Steen:似乎很难获得具有有趣功能的编程语言的良好指称语义。相反,Hoare逻辑在过去十年中蓬勃发展,我们现在可以为几乎任何编程语言构建它们。扩展相等性是不确定的,因为(简化了一点)否则您可以检查任意程序P 在上下文上等同于 0,它总是终止程序,它是停止问题的一种变体。如果您在一种语言上施加足够的有限性条件,则最终最终会得到……(续)
Martin Berger 2012年

...具有确定的上下文平等。但要注意,R.装载机表明,即使是穷的PCF具有不可判定的上下文等价。
Martin Berger 2012年

-2

一个快速的答案(我承认我没有花太多时间...)赖斯定理说,对于任何非平凡的问题,无法确定程序所计算的函数是否具有该属性。因此,这里的问题是不确定的


1
它是否没有声明“ ...对于部分函数的任何非平凡属性...”,所以对于全部函数而言,它不可能确定吗?
Matthijs Steen
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.