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"}}
我定义了两种类型:
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"}}