VDM++ 中的集合理解

Set comprehension in VDM++

我定义了两种类型:

public string = seq1 of char;
public config = map string to bool;

我还定义了一个测试集dcl subFeatures : set of string := {"test1", "test2", "test3"}.

我正在尝试通过以下方式生成一组有效配置:

{ elem | elem : config & dom elem = subFeatures and {true} subset rng elem }

当配置至少有 一个 true 范围值 .

时,该配置被称为 "valid"

Overture 正在启动错误错误 4:无法获取类型配置的绑定值。经过调查,我发现默认情况下 Overture 无法处理无限类型的类型绑定,但事实并非如此,我正在限制 map 域。

谁有更多经验可以检查我做错了什么?

虽然您所写的是有效的 VDM++,但如果它是有限类型,解释器只能枚举类型绑定(即 "elem : config"),如您所说。但是,解释器也无法确定您是否已将无限类型缩减为有限数量的元素。所以这在运行时失败了。

要使解释器正常工作,您需要对子特征使用集合绑定并为每个子特征创建 "elem |-> true"。

编辑:

经过一些考虑和帮助,我认为我们可以得出结论,这要么无法通过 non-type-bind 理解,要么会非常复杂。下面的函数将实现你所需要的,我认为:

PossibleMappings: set of seq1 of char * map seq1 of char to bool -> set of map seq1 of char to bool
PossibleMappings(s,m) ==
    if s = dom m
    then {m}
    else let e in set s be st e not in set dom m in
        dunion {PossibleMappings(s, m munion {e |-> true}),
                PossibleMappings(s, m munion {e |-> false})};

ValidMappings: set of seq1 of char -> set of map seq1 of char to bool
ValidMappings(s) ==
    { m | m in set PossibleMappings(s, {|->}) & true in set rng m };

例如:

> p ValidMappings({"a", "b"})
= {
{"a" |-> false, "b" |-> true},
{"a" |-> true, "b" |-> false},
{"a" |-> true, "b" |-> true}
}
Executed in 0.027 secs. 

我的建议是你应该这样写:

{ elem |-> {b | b : bool} union {true} | elem in set {"test1", "test2", "test3"}}