我是研究程序等效性方法的初学者。我已经阅读了几篇有关定义逻辑关系或模拟的论文,以证明两个程序是等效的。但是我对这两种技术很困惑。
我只知道逻辑关系是归纳定义的,而模拟是基于共归进行的。为什么用这种方式定义它们?他们的利弊分别是什么?在不同情况下应该选择哪一个?
我是研究程序等效性方法的初学者。我已经阅读了几篇有关定义逻辑关系或模拟的论文,以证明两个程序是等效的。但是我对这两种技术很困惑。
我只知道逻辑关系是归纳定义的,而模拟是基于共归进行的。为什么用这种方式定义它们?他们的利弊分别是什么?在不同情况下应该选择哪一个?
Answers:
我对这个问题的答案可能是新颖的。实际上,我在过去六个月左右的时间里仍在仔细考虑它,并且尚未在论文中进行介绍。
一般的论断是,诸如“逻辑关系”,“模拟”甚至“不变式”之类的关系推理原理是数据抽象或信息隐藏的体现。无论哪里藏有信息,这些原则都会浮现。
自动机理论家是最早发现它的人。自动机具有隐藏状态。因此,您需要关系推理来讨论它们的等效性。自动机理论家在同态性上苦苦挣扎了一段时间,放弃了,提出了一种称为“关系覆盖”的概念,这是一种模拟关系。
米尔纳(Milner)于1971年在一篇鲜为人知但非常基础的论文中提出了这一想法,该论文被称为“ 程序之间的模拟的代数概念 ”。的数据表示的正确性,证明在1972年”(但使用抽象功能而不是关系,因为他认为关系“更简单”)。后来,他撤回了简单性声明,并返回到在“ 数据精炼完善 ”中使用关系。雷诺兹在《编程技巧》中使用关系推理“,第5章(1981)。他认为关系比抽象函数更为自然和笼统。如果您回过头阅读本章,您会发现潜伏着关系参数化的思想,等待被发现。当然,两年后,雷诺(Reynolds)发表了“类型,抽象和参数多态性”(1983)。
看起来所有这些想法都与类型无关,但它们确实与类型有关。状态语言和模型具有内置的数据抽象。您无需定义“抽象数据类型”即可隐藏信息。您只需要声明一个局部变量并将其隐藏即可。我们可以在头几周内将其教给Java班的一年级学生。没汗
另一方面,功能语言和模型必须通过type隐藏信息。功能模型没有内置的数据抽象。我们必须添加它明确,使用或∃。因此,如果将有状态语言转换为功能语言,则会注意到所有本地状态都已转换为类型变量。要详细了解其工作原理,请参阅我的论文“类Algol语言中的对象和类 ”,但是这些思想确实来自Reynolds 1981(“ Algol的本质”)。现在,我们只是更好地理解了这些经典思想。
拿两个要证明相等的机器和M '。米尔纳(1971)说,定义M和M '状态之间的关系,并证明这两个机器保留了该关系。雷诺参量说,认为机器的状态属于X和X '类型。在它们之间定义一个关系R。如果机器的类型为F (X )和F (X '),并通过它们的状态类型进行参数化,则检查两个机器是否通过以下关系关联:。
因此,模拟和关系参数化本质上是相同的想法。这不仅是表面上的相似。前者是为内置数据抽象的有状态语言而设计的。后者适用于无状态语言,在无状态语言中,通过类型变量获取数据抽象。
那逻辑关系呢?从表面上看,逻辑关系似乎是一个更笼统的想法。参量讨论如何在同一模型中关联类型变量,而逻辑关系似乎在不同模型之间关联类型。(Dave Clarke早些时候对此进行了精彩的论述。)但是我的感觉是(并且仍然有待证明)这是某种尚未形成的高级参数化形式的实例。敬请期待在这方面取得更多进展。
[注意]逻辑关系和模拟之间的联系在我们最近的论文《逻辑关系和参数:类别理论和编程语言的雷诺程序》中进行了讨论。
functor
关键区别之一是使用逻辑关系作为一种技术来显示一类程序(例如,输入到编译器)对应于另一类程序(例如,编译器的输出),而使用仿真关系显示两个程序之间的对应关系。
这两个概念之间的相似之处在于它们都定义了一个关系,用于显示两个不同实体之间的对应关系。从某种意义上说,人们可以将逻辑关系看作是一种根据类型的语法归纳定义的模拟关系。但是存在各种不同的模拟关系。
逻辑关系可以用来显示ML之类的语言与其翻译成汇编语言之间的对应关系,如您所阅读的论文中所述。在类型结构上归纳定义逻辑关系。逻辑关系提供了一种组合手段,用于通过显示每个类型构造函数的正确翻译来显示例如正确的翻译。在函数类型中,正确性条件条件会说诸如此类,该函数的转换将转换良好的输入转换为转换良好的输出。
对于基于lambda演算的语言,逻辑关系是一种通用技术。逻辑关系的其他应用包括(从此处开始):表征lambda可定义性,关联指称语义定义,表征参数多态性,建模抽象解释,验证数据表示,定义完全抽象的语义以及建模高阶语言中的局部状态。
仿真关系通常用于显示两个程序的等效性。通常,此类程序会产生某种观察,例如在通道上发送消息。如果P可以执行Q可以做的所有事情,尽管可能更多,但一个程序P可以模拟另一个Q。
粗略地讲,双仿真是两个仿真关系放在一起。您将显示程序P和模拟程序Q,并且程序Q可以模拟程序P,并且您可以进行双模拟,尽管通常会出现其他条件。维基百科关于双仿真的条目是一个很好的(更精确的)起点。存在着数千种想法的变体,但它是一个基本的想法,它或多或少地以计算机科学,模态逻辑和模型理论的相同形式被重新发明。Sangiorgi的文章给出了这个想法的精彩历史。
建立两个概念之间关系的一篇论文是《安迪·皮茨的《语义学与语法之间的逻辑关系》注释》,它使用逻辑关系(最终是一个句法定义的语义概念)来证明关于应用双仿真的某种性质,这是一种纯粹的句法概念。
两种类型的关系似乎在不同的上下文中使用。处理过渡系统上解释的过程计算或模态逻辑时,针对类型化语言的逻辑模拟和模拟关系。戴夫·克拉克(Dave Clarke)提供了许多直观的解释,因此我只添加一些可能会有所帮助的指针。
已经进行了使用抽象解释来表征这两个概念的工作。可能不是您想要的,但是至少两个概念都在同一个数学框架中处理。
萨姆森·阿布拉姆斯基(Samson Abramsky)使用逻辑关系证明了惰性Lambda演算(抽象解释,逻辑关系和Kan扩展)的正确性和严格性分析的终止。他还表明,逻辑关系在Galois连接的抽象解释意义上定义了抽象功能。最近,Backhouse和Backhouse展示了如何从基本类型的Galois连接构造高阶类型的Galois连接,并且可以使用逻辑关系(逻辑关系和Galois连接)等效地描述这些构造。因此,在类型化功能语言的特定上下文中,这两个概念是等效的。
仿真关系描述了针对各种模态和时间逻辑的Kripke结构之间的属性保留。除了类型,我们在逻辑上有模态。模拟关系还定义了Galois连接,因此也定义了抽象。可以问这些抽象是否具有特殊的属性。答案是标准抽象是合理的,而基于仿真关系的抽象是完整的。完整性的概念是针对Galois连接的,这可能与直观的解释不一致。这项工作是由David Schmidt(程序抽象的结构保留二进制关系)以及Francesco Ranzato和Francesco Tapparo(抽象解释的广义强保存)开发的。