考虑两个函数定义
test1 (x:nat) res:set of nat
== { m | m:nat & m in set {0,...,x} };
test2 (x:nat) res:set of nat
== { m | m in set {0,...,x} & true };
在Overture中运行test2(1000)给出了一组自然数,最多为1000.运行test1(1000)给出了一组最多255的自然数。我明白在显式函数定义中存在显式类型绑定时会出现复杂情况,但在这种情况下,它只是默默地给出了错误的答案。似乎当定义中出现自然数的类型绑定时,范围限制为0..255。至少,这似乎是从外面发生的事情。
语言手册的第8章陈述"请注意,类型绑定只能由VDM解释器执行,以防类型被推断为静态有限。"什么时候可以推断出类型是静态有限的?
答案 0 :(得分:1)
我不确定这里发生了什么。当我使用Overture 2.3.0(以及2.3.1快照和VDMJ)尝试此规范时,test1函数总是会立即失败:
Error 4: Cannot get bind values for type nat
您是否将此测试作为更大规格的一部分运行?手册是正确的。 Overture不能执行类型绑定,除非它可以确定类型是有限的,如“bool”,或完全由有限类型组成的东西,如“bool集”或“映射P到Q”,其中P和Q是有限的。
基本的有限类型是bool和所有引用类型。然后可以使用这些类型来构建具有类型构造函数的更复杂类型 - “set of”等。除了“seq of”之外,只要所有成员类型都是有限的,所有类型构造函数都将产生有限类型。请注意,这包括[可选]类型,产品类型(如A * B),类型联合(如A | B | C)和记录构造函数。
答案 1 :(得分:1)
我现在很确定这种行为是Overture的一个我不知道的特征。默认情况下,解释器无法处理无限类型的类型绑定,但在"调试器"中有一个选项。启动器选项卡允许数字类型绑定(int,nat,nat1和奇怪,真实)扩展到" minint"的整数值范围。 to" maxint"。你还必须勾选" numeric_type_bind_generation"框以启用该功能。
所以我很抱歉早先的困惑。我不认为此功能特别有用,而且我从来没有听说过有人使用它,但我很确定它能解释你所看到的内容。