程序翻译的完全完整性与完全抽象


15

编译器验证工作通常归结为证明编译器完全抽象:它保留并反映(上下文)对等。

代替提供完全抽象样张,由长谷川[一些最近(分类基于)编译器核查工作12 ]和艾格等。等 [ 3 ]证明了各种CPS翻译的完全完整性。

问题: 完全完整性和完全抽象之间有什么区别?

在我看来,完整性就像翻译的对等反映,而完整性似乎是对等保存的结果。

注意:Curien [ 7 ]和Abramsky [ 8 ]都探讨了可定义性,完全抽象以及某种程度上完全完整性之间的关系。我怀疑这些资源可能可以回答我的问题,但经过表面阅读后,我尚未确认。

某些背景:Abramsky和Jagadeesan [ 4 ] 提出了“完全完整性”一词,用以描述乘法线性逻辑的博弈语义模型的正确性。

Blute [ 5 ]提供以下定义:

F为自由类别。我们说一个明确的模型 M全面完成 F或者说我们有 充分完整性F相对于M,如果,相对于发电机的一些解释,独特的无仿函数[[]]:FM已满。

据我所知,[ 6 ]中的长谷川是第一个采用完全完整性来描述程序翻译而不是分类语义模型的人。在这种情况下,吉拉德从简单类型的Lambda演算转换为线性Lambda演算。后来,在[ 1 ],他定义了CPS翻译的全完整性()为:

Γ;N:(σo)oΓM:σΓ;M=N:(σo)o

(其中是线性lambda演算(目标语言)中的基本类型,但不是计算lambda演算(源语言)中的基本类型。)o

在我看来,长谷川的定义似乎是完整的,应该真正地将其与完整性结合起来以获得完整。

Egger等。等 [ 3 ]将CPS转换完全完整性定义为(1)完整性和(2)完整性的组合:()v

(1):如果和然后Θ v | - 中号v = β η ñ vτ v Θ 中号= λ Ç Ñ τΘM,N:τΘv|Mv=βηNv:!τvΘM=λcN:τ

(2):如果然后存在一个术语 这样 Θ 中号τ Θ v | - 中号v = β η牛逼τ vΘv|t:!τvΘM:τΘv|Mv=βηt:!τv

(其中是的计算方程理论)=λc


[1]“ 线性使用的效果:单子和CPS转换为线性Lambda演算 ”,长谷川2002

[2] 长谷川2004年的“ 线性连续传递名中的语义

[3]“ 丰富效果演算中的线性使用CPS翻译 ”,Egger等。等 2012年

[4]“ 乘积线性逻辑的博弈和完全完备性 ”,Abramsky和Jagadeesan,1992年

[5]“ 线性逻辑学家的分类理论 ”,Blute,2003年

[6]“ 吉拉德翻译和逻辑谓词 ”,长谷川2000

[7]“ 可定义性和完整抽象 ”,居里安,2007年

[8]“ 可定义性和完全完整性公理 ”,阿布拉姆斯基,1999年

Answers:


12

不幸的是,这里发生了太多的事情。因此,很容易混淆。在“完全完整性”和“完全抽象”中使用“完全”是指完全不同的完整性概念。但是,它们之间也存在一些模糊的联系。因此,这将是一个复杂的答案。

完全完整性:“健全和完整”是您希望传统逻辑就其语义而言具有的属性。健全性意味着您可以在逻辑上证明的一切在语义模型中都是正确的。完整性意味着在逻辑模型中可以证明语义模型中的任何事实。我们说,对于特定的语义模型,逻辑是合理且完整的。当我们谈到建构逻辑时,例如Martin-Lof类型理论或线性逻辑,我们不仅关心公式是否可证明,而且也关心它们的证明是什么。一个可证明的公式可能有许多证明,而建设性的逻辑则想让它们分开。因此,构造逻辑的语义不仅包括规定一个公式是否正确,还包括为它的真实性指定一些抽象的语义概念“证明”(“证据”)。Abramsky及其同事创造了“完全完整性”一词,以表示逻辑中的证明可以表达模型中的所有语义证明。因此,“完整”是指此处的证明。 一个“完整”的逻辑可以证明它所需要的一切。“完全完整”的逻辑具有它需要的所有证明。 因此,“完全完整性”是指“建设性完整性”或“证明完整性”。这与完全抽象无关。

完全抽象:“充分和完全抽象”是您想要的编程语言语义模型的属性。(请注意第一个区别:我们现在正在处理语义模型的属性,而不是语言的属性!)适当性是指,每两个术语在语义模型中具有相同的含义时,它们在编程语言中(就某种执行概念而言)在观察上是等效的。完全抽象意味着,如果两个术语在观察上是等效的,则它们在语义模型中的含义相同。这些想法可能与健全性和完整性有关,但以某种人为的方式。如果我们将编程语言的语义模型视为谈论观察等效性的“逻辑”或“证明方法”,则充分性意味着这种证明方法是正确的;完全抽象意味着该证明方法是完整的。没有“完全完整性”的概念证明方法。(但是,从理论上讲,这样的事情是可能的,而在如今的某一天有人可能会这样做。

就您而言,您对翻译感兴趣,而不是语义模型。适当性和完全抽象的属性可以扩展为如下处理翻译。您将目标语言视为您的“语义模型”,即您完全以某种方式理解的形式主义。如果是这样,您对此有一些等效的概念。然后,如果两个源程序的翻译在目标语言中等效时,只要它们在源语言中在观察上等效,则我们认为该转换就足够了。我们说,如果两个源程序在源语言上在观察上是等效的,而它们的翻译在目标语言中是等效的,则它是完全抽象的

实际上,我不了解我们真正完全“理解”的任何目标语言。我们所知道的是目标语言的观察等效性的其他概念。在那种情况下,如果目标语言中翻译的观察等效性暗示源语言中的观察等效性,那么翻译就足够了。 翻译是完全抽象如果源语言的术语的观察等价意味着在目标语言翻译的观察等价。 中号Ñ τ 中号

τ(M)τ(N)MN
有些作者采取“完全抽象翻译”是指这两种性质的组合: 中号Ñ
MNτ(M)τ(N)
MNτ(M)τ(N)

Egger等人似乎正在将完全完整性的概念扩展到翻译。在他们的设置中,公式是类型,证明是术语。他们的翻译会翻译类型和术语。如果类型A的翻译仅具有通过翻译类型A的原始术语获得的术语,则他们称其翻译完全完成Ñ τ AA

N:τ(A).M:A.τ(M)=N

现在,对于完全完整性和完全抽象之间的模糊联系。证明语义模型或​​翻译是完全抽象的,通常涉及一些可定义性。这是因为我们的语言通常是较高阶的。因此,如果语义模型或​​目标语言具有太多的“上下文”,那么它将能够以不希望的方式戳我们的术语或语义含义并破坏它们的等效性。“不良方式”是指编程语言本身无法戳破它们。因此,要获得完整的抽象,我们需要确保语义模型或​​目标语言中可用的“上下文”确实以某种形式来自源语言中的“上下文”。请注意,这与完整完整性属性有关。

我们为什么要这样的属性?它有什么与编译器有关!我们需要这些属性,以便声明源语言嵌入到目标语言中。如果我们对特定的目标语言感到满意(因为它是干净,可理解,某种程度上是基础的或上帝赐予的),那么,如果源语言嵌入其中,那么我们可以声称源语言没有什么新意。它只是我们了解和喜爱的目标语言的一部分。它只是语法糖。因此,人们给出了完全抽象的翻译,以证明特定的目标语言很棒。有时也会由语言丰富或复杂的人提供。因此,他们没有直接为其定义语义,而是将其翻译为某种核心语言,然后将语义赋予该核心语言。例如,Haskell报告执行此操作。但是,由于源语言既庞大又复杂,因此很少能对这些翻译进行完全抽象。人们相信翻译是好的。

再一次,这与编译器无关。编译器很少是适当的或完全抽象的。而且,他们不必是!编译器所需要做的就是保留完整程序的执行行为。编译器的目标语言通常很庞大,这意味着它具有很多可以混淆等效性的上下文。因此,源语言中的等效程序在编译时几乎从上下文上就不会等效。


您说没有一种我们真正完全理解的语言是什么意思?
Martin Berger

您说什么还没有人产生代表构造性证明方法的语义模型是什么意思?
2013年

1
抱歉,但是与您之前的文字相比,“翻译”的含义对我来说似乎是错误的方向。例如,PCF的完全抽象要求M≅N⟹τ(M)≅τ(N)(其中τ是指称语义,而忽略了更改符号的必要性):正如您所说的,“完全抽象意味着,如果两个术语在观察上是等效的,它们在语义模型中具有相同的含义”。但是您的含义却相反(即,您写τ(M)≅τ(N)⟹M≅N)!还是翻译的作用与指称语义不同?
Blaisorblade 2014年

1
@Blaisorblade:你绝对正确!我对回答的内容进行了更正。
Uday Reddy 2014年

1
完全抽象对于语言级安全性以及跨语言集成也很重要。也就是说,了解目标语言中的任何内容都不会违反源语言的抽象是很有用的。
2014年

5

简介:完全完整性意味着解释功能不仅是完整的,而且在程序上也很过时。完全抽象不需要排斥。

[[.]]

  • A[[A]]

  • Γ[[Γ]]

  • ΓP:α[[Γ]][[P]]:[[α]]

[[.]]

PSQ     iff     [[P]]T[[Q]]

P,QST

PΓ,αSQ     iff     [[P]][[Γ]],[[α]]T[[Q]]
Γ,α,P,Q[[.]]

[[.]]

[[.]][[Γ]]Q:[[α]]ΓP:αQ=[[P]][[.]]

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.