[英]Alloy Analyzer: Quantifiers and Set Products
我在合金中遇到了以下問題。 考慮嘗試捕獲甚至標記實體的玩具代碼(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
}
有沒有辦法打印出集合元素,也就是可以打印出下面的集合嗎?
{state: State | evenV1[state]}
謝謝!
關於你的第一個問題:
已編輯(第一個答案是錯誤的)
運行斷言給出了 2 個反例。 一個是預期的,因為在 evenV2 謂詞中沒有考慮 none -> none。 但另一個(見下文)對我來說沒有意義。
我唯一合乎邏輯的解釋是,當在 evenV2 的參數中給出時, evenSetV2 的量化變量“狀態”被錯誤地解釋了,即使它看起來有點牽強......
我認為只要有可能,就應該避免量化,而更喜歡更直接的集合操作。 如下實現謂詞和斷言可以解決問題(您甚至不需要區分 singleton 和 set 方法):
pred evenV2 ( state: ProductStateSet){
DummySet.state in (s2+s4+s6)
}
assert a2V2 {
evenV2[ (b->s4)+ (b->s6)]
}
結束編輯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.