在存在类型绑定的情况下执行

Execution in the presence of type bindings

考虑两个函数定义

  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 章指出"Notice that type binds can only be executed by the VDM interpreters in case the type can be deduced to be finite statically."对于何时可以静态地推断出类型是否有任何规则?

我不确定你这里发生了什么。当我用 Overture 2.3.0(以及 2.3.1 快照和 VDMJ)尝试这个规范时,test1 函数总是立即失败,说:

Error 4: Cannot get bind values for type nat

您运行是否将此测试作为更大规范的一部分?手册是正确的。 Overture 无法执行类型绑定,除非它可以确定类型是有限的,例如 "bool",或者完全由有限类型组成的东西,例如 "set of bool" 或 "map P to Q",其中 P 和 Q 是有限的。

基本的有限类型是 bool 和所有 quote 类型。然后,这些类型可用于通过类型构造函数构建更复杂的类型 - "set of" 等。除了 "seq of" 之外,所有类型构造函数都将产生有限类型,只要所有成员类型都是有限。请注意,这包括 [可选] 类型、产品类型(如 A*B)、类型联合(如 A|B|C)和记录构造函数。

现在我很确定这种行为是 Overture 的一个我不知道的功能。默认情况下,解释器无法处理无限类型的类型绑定,但 "Debugger" 启动器选项卡中有一个选项允许数字类型绑定(int、nat、nat1 和奇怪的是 real)扩展到整数范围从 "minint" 到 "maxint" 的值。您还必须勾选 "numeric_type_bind_generation" 框以启用该功能。

对于之前的困惑,我深表歉意。我不认为此功能特别有用,我从未听说过有人使用过它,但我很确定它可以解释您所看到的内容。