让 A 成为您的图灵完备语言,它应该是静态类型的,让 A' 成为您在删除类型检查时从 A 获得的语言(但不是类型注释,因为它们也用于其他目的)。A 接受的程序将是 A' 接受的程序的子集。所以特别是,A' 也将是图灵完备的。
给定您的翻译器 P 从 B 到 A(反之亦然)。它应该做什么?它可以做以下两件事之一:
首先,它可以将 B 的每个程序 y 转换为 A 的程序。在这种情况下,LPy 将始终返回 True,因为 A 的程序根据定义是正确类型的。
其次,P 可以将 B 的每个程序 y 转换为 A' 的程序。在这种情况下,如果 Py 恰好是 A 的程序,则 LPy 将返回 True,否则返回 False。
由于第一种情况没有产生任何有趣的东西,让我们坚持第二种情况,这可能就是您的意思。在 B 的程序上定义的函数 LP 是否告诉我们关于 B 的程序的任何有趣的事情?我说不,因为它在 P 的变化下不是不变的。由于 A 是图灵完备的,即使在第二种情况下,也可以选择 P 使其图像恰好位于 A 中。那么 LP 将始终为真。另一方面,可以选择 P,以便将一些程序映射到 A' 中的 A 的补码。在这种情况下,LP 会为 B 的一些(可能所有)程序吐出 False。正如你所看到的,你没有得到任何只取决于 y 的东西。
我也可以用以下方式更数学地说:有一类 C 编程语言,其对象是编程语言,其态射是从一种编程语言到另一种编程语言的翻译器。特别是如果存在态射 P: X -> Y,则 Y 至少与 X 一样具有表达能力。在每对图灵完备语言之间,存在两个方向的态射。对于 C 的每个对象 X(即,对于每种编程语言),我们都有一个关联的集合,比如说 {X}(我知道这是不好的表示法)可以由 X 的程序计算的那些部分定义的函数。每个态射 P:X - > Y 然后引发集合 {X} -> {Y} 的包含。让我们正式反转所有导致恒等式 {X} -> {Y} 的态射 P: X -> Y。我将调用结果类别(用数学术语来说,由 C' 对 C) 的本地化。现在包含 A -> A' 是 C' 中的态射。然而,它在 A' 的自同构下不被保留,即态射 A -> A' 不是 C' 中 A' 的不变量。换句话说:从这个抽象的角度来看,“静态类型”属性是不可定义的,可以任意附加到语言上。
为了更清楚地说明我的观点,您还可以将 C' 视为 3D 空间中的几何形状的类别,并将欧几里得运动视为态射。A' 和 B 是两个几何形状,P 和 Q 是将 B 带到 A' 的欧几里得运动,反之亦然。例如,A' 和 B 可以是两个球体。现在让我们在 A' 上固定一个点,它代表 A' 的子集 A。让我们称这一点为“静态类型”。我们想知道 B 的一个点是否是静态类型的。所以我们取这样一个点 y,通过 P 映射到 A' 并测试它是否是我们在 A' 上的标记点。很容易看出,这取决于选择的映射 P,或者换句话说:球体上的标记点不会被该球体的自同构(将球体映射到自身上的欧几里得运动)保留。