【发布时间】:2021-03-24 20:31:20
【问题描述】:
我在 Alloy 中遇到了以下问题。考虑尝试捕获甚至标记实体的玩具代码(V1 用于 State,V2 用于 ProductStateSet):
enum State {s1, s2, s3, s4, s5, s6}
enum DummySet {b,c}
let ProductStateSet = DummySet->State
pred evenV1 (state: State){
(state = s2) or (state=s4) or (state=s6)
}
pred evensetV1 (stateset: State) {
all state: stateset | evenV1[state]
}
assert a2V1 {
evensetV1[(s2 + s4)]
}
pred evenV2 (state: ProductStateSet){
(state = b->s2) or (state=b->s4) or (state=b->s6)
}
assert a1V2 {
evenV2[b->s2]
}
pred evensetV2 (stateset: ProductStateSet) {
all state: stateset | evenV2[state]
}
assert a2V2 {
evensetV2[ (b->s2) + (b->s4) ]
}
断言 a2V1 为真,但 a2V2 为假,而我本以为它们是相同的。为什么会这样,在处理集合产品时使用量词的正确方法是什么?
如果我将“evenset”更改为“some”而不是“all”,则使用 evensetV1 没有问题,但对于 evensetV2,我得到:
pred evensetV2 (stateset: ProductStateSet) {
some state: stateset | evenV2[state]
}
assert a2V2 {
evensetV2[ (b->s2) + (b->s4) ]
}
Executing "Check a2V2"
Solver=sat4j Bitwidth=4 MaxSeq=4 SkolemDepth=1 Symmetry=20
Generating CNF...
.
Analysis cannot be performed since it requires higher-order
quantification that could not be skolemized.
这个例子的另一个关于集合理解的问题:我可以写一个断言,比如:
assert a3V1{
#{state: State | evenV1[state]} > 2
}
有没有办法打印出set元素,也就是可以打印出下面的set吗?
{state: State | evenV1[state]}
谢谢!
【问题讨论】:
标签: alloy