大多数现代编程语言都会引入某种形式的类型检查,以防止您编写笨表达式,例如 。TLA+是基于数学家引入的没有类型的形式化语言,在无类型语言中,每个语法格式正确的表达式都有自己的含义,哪怕像 这样的笨表达式。 在数学上,表达式 不比表达式 更笨,并且数学家们一直隐式地写那些笨表达式。例如,考虑到公式 ,这里 是实数集,这个公式声明 对任意实数 都成立。将 代入公式,将得到 ,这里包含笨表达式 。这个表达式为真,因为 为假, 对任意表达式 都成立(根据蕴含操作符 的定义)。
一个正确的公式可以包含笨表达式,例如, 是一个正确的公式,因为所有值都等于自身。不过,一个正确公式的真值不能取决于笨表达式的含义。如果一个表达式是笨的,那么它的值可能并不明确。标准模块 中的 / 和 * 的定义不包含 ,所以也没法知道它的值是否等于3。
你可以编写 , 也可以编写完全合理的表达式,没有任何合适的语法规则阻止你。 在普通数学中,不存在像编程语言那样的书写规则,既复杂又有局限性。 在设计良好的编程语言中,类型检查的成本会考虑与收益平衡:引入类型,允许编译器生成更有效的代码,而类型检查则可以捕获错误。 对于编程语言,收益似乎超过成本。 在编写TLA+规范时,我发现成本超过了收益。
如果您习惯了编程语言的束缚,那么可能要过一会儿才能开始享受数学赋予的自由。 首先,您不会想到像在第5.2节第50页上,定义运算符R那样定义任何东西,这种定义方式,在一个有类型的编程语言中不会出现。