【问题标题】:Alloy Analyzer: Quantifiers and Set Products合金分析仪:量词和集合产品
【发布时间】: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


    【解决方案1】:

    关于你的第一个问题:

    已编辑(第一个答案是错误的)

    运行断言给出了 2 个反例。 一个是预期的,因为在 evenV2 谓词中没有考虑 none -> none。但另一个(见下文)对我来说没有意义。

    我唯一合乎逻辑的解释是 evenSetV2 的量化变量“状态”在 evenV2 的参数中给出时被错误解释,即使它似乎有点牵强...

    我认为,只要有可能,就应该避免量化,而更喜欢更直接的集合操作。如下实现谓词和断言可以解决问题(您甚至不再需要区分单例和集合方法):

    pred evenV2 ( state:  ProductStateSet){
    DummySet.state in (s2+s4+s6)
    }
    
    assert a2V2 {
    evenV2[ (b->s4)+ (b->s6)]
    }
    

    结束编辑

    对于第二个问题,Alloy 评估员是您的朋友。

    【讨论】:

    • 谢谢!在我试图解决的特定问题(不是玩具示例)中,我需要能够量化元组。根据您的解释,在我的 evensetV2 谓词中,当我说 all state: stateset 时,Alloy 似乎没有将其视为“对于集合状态集中的每个元素状态”。我如何在合金中强制这种解释?
      有趣的是,对于 evensetV1 谓词,Alloy 正在做我想做的事情
    • 再举一个例子,假设我写了以下谓词:pred evenV4 (state: ProductStateSet){ state in (b->s2 + b->s4 + b->s6) } pred evensetV4 (stateset: ProductStateSet) { some state: stateset | evenV4[state] } 这给出了一个高阶量化 skolemization 错误。我猜这是因为我的谓词中的 state: stateset 没有被视为 stateset 的一个元素
    • 抱歉,再次阅读问题时,我意识到,在我的仓促中,我在答案中考虑了错误的谓词(evenV2 而不是 evenSetV2)。我似乎无法解释为什么您的示例不起作用。可能是与使用高阶量化变量有关的错误。通过按照建议重写谓词 evenV2 来替换量化可以解决问题。你不能对你的真实模型做同样的事情吗?
    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多