簡體   English   中英

為什么在Alloy中不出現簡單的整數反例?

[英]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.

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