[英]Why doesn't simple integer counterexample occur in Alloy?
我正在嘗試對數值變量和布爾變量之間的關系進行建模,如果數值變量在某個范圍內,則布爾變量將改變值。 我是Alloy的新手,在理解如何充分限制范圍以產生明顯的反例方面遇到困難。 我的代碼如下:
open util/boolean
one sig Object {
discrete : one Bool,
integer : one Int
}
fact { all o : Object | o.integer > 0 and o.integer < 10 }
fact { all o : Object | o.integer > 5 iff o.discrete = False }
assert discreteCondition { all o : Object | o.discrete = True }
check discreteCondition for 1000
由於o.integer
是整數值,范圍是0到10,因此它只能是10個不同選擇之一。 我指定每個Object
只能有一個integer
和一個discrete
。 因此,在我看來,這里實際上只需要檢查10種情況:每個integer
值對應一種情況。 即使有1000例,
找不到反例。
如果我刪除integer
變量和相關事實,那么它將幾乎立即找到反例。 我也嘗試使用其他求解器並在“選項”中增加各種深度和內存值,但這沒有幫助,因此很明顯我的代碼有問題。
如何限制我的范圍以使Alloy找到反例(通過迭代可能的integer
)? 謝謝!
默認情況下,用於表示整數的位寬為4,因此在實例生成過程中僅考慮范圍為[-8,7]的整數,因此,由於整數溢出,您的第一個事實是無效的(因為10在該范圍之外)。
要解決此問題,請將使用的位寬增加到至少5:
check discreteCondition for 10 but 5 Int.
請注意,范圍為1000並不意味着您在分析中考慮了1000個情況。 范圍是在給定簽名后鍵入的,在生成的實例中存在的最大原子數。 在您的情況下,您只有一個簽名,並且有多個簽名。 因此,分析范圍為1或10000的模型不會改變任何內容。 生成的實例中仍然只有一個Object原子。 您可能要檢查此Q / A,以了解有關范圍的更多信息指定合金中信號的范圍
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.