簡體   English   中英

合金分析儀:量詞和集合產品

[英]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)]
}

結束編輯

對於第二個問題,Alloy 評估員是您的朋友。 在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM