TLA+ 《Specifying Systems》翻译初稿——Section 6.2 Silly Expressions( 笨表达式)

大多数现代编程语言都会引入某种形式的类型检查,以防止您编写笨表达式,例如 3 / " a b c " 3/"abc" 。TLA+是基于数学家引入的没有类型的形式化语言,在无类型语言中,每个语法格式正确的表达式都有自己的含义,哪怕像 3 / " a b c " 3/"abc" 这样的笨表达式。 在数学上,表达式 3 / " a b c " 3/"abc" 不比表达式 3 / 0 3/0 更笨,并且数学家们一直隐式地写那些笨表达式。例如,考虑到公式 x R e a l : ( x 0 ) ( x 3 / x ) = 3 ) \forall x \in Real:(x\neq0) \Rightarrow(x*3/x)=3) ,这里 R e a l Real 是实数集,这个公式声明 ( x 0 ) ( x 3 / x ) = 3 ) (x\neq0) \Rightarrow(x*3/x)=3) 对任意实数 x x 都成立。将 x = 0 x=0 代入公式,将得到 ( 0 0 ) ( 0 3 / 0 ) = 3 ) (0\neq0) \Rightarrow(0*3/0)=3) ,这里包含笨表达式 3 / 0 3/0 。这个表达式为真,因为 0 0 0\neq 0 为假, F A L S E P FALSE \Rightarrow P 对任意表达式 P P 都成立(根据蕴含操作符 \Rightarrow 的定义)。

一个正确的公式可以包含笨表达式,例如, 3 / 0 = 3 / 0 3/0=3/0 是一个正确的公式,因为所有值都等于自身。不过,一个正确公式的真值不能取决于笨表达式的含义。如果一个表达式是笨的,那么它的值可能并不明确。标准模块 R e a l Real 中的 / 和 * 的定义不包含 0 ( 3 / 0 ) 0*(3/0) ,所以也没法知道它的值是否等于3。

你可以编写 3 / 0 3/0 , 也可以编写完全合理的表达式,没有任何合适的语法规则阻止你。 在普通数学中,不存在像编程语言那样的书写规则,既复杂又有局限性。 在设计良好的编程语言中,类型检查的成本会考虑与收益平衡:引入类型,允许编译器生成更有效的代码,而类型检查则可以捕获错误。 对于编程语言,收益似乎超过成本。 在编写TLA+规范时,我发现成本超过了收益。

如果您习惯了编程语言的束缚,那么可能要过一会儿才能开始享受数学赋予的自由。 首先,您不会想到像在第5.2节第50页上,定义运算符R那样定义任何东西,这种定义方式,在一个有类型的编程语言中不会出现。

发布了4 篇原创文章 · 获赞 1 · 访问量 5529

猜你喜欢

转载自blog.csdn.net/robinhzp/article/details/103541566