2 つの関数定義を検討してください
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 インタープリターによってのみ実行できることに注意してください。」と記載されています。型が静的に有限であると推定できる場合の規則はありますか?