[英]Unexpected Instance found for Alloy specification
我嘗試了用Alloy進行建模的第一步,但遇到了一個無法解決的問題。 我有以下規格:
module tour/AddressBook1
sig Name, Addr{}
sig Book {
addr: Name->lone Addr
}
// operation: adds a (name, address) to the Book b, resulting in b'
pred add (b, b' : Book, n:Name, a:Addr) {
b'.addr = b.addr + n->a
}
run add for 3 but 2 Book
到目前為止,沒有什么特別的。 從字面上看,這就是丹尼爾·傑克遜(Daniel Jackson)寫的《軟件抽象》一書的示例。
它實質上是對具有(名稱,地址)對的書籍進行建模。 add謂詞應該獲取一個Book實例b,並通過向其添加(可能已經存在的)(名稱,地址)對來從中創建另一個Book實例b'。
找到的前幾個示例很簡單且令人信服,但單擊“下一步”按鈕,我得到以下示例(上方是完整視圖,下方是與書本的等效投影)
我看到兩本書,第一本書Book0有兩對(Name0,Addr2)和(Name1,Addr1)。 從這些注釋中,我們還可以看到add操作將添加新的二重奏(Name1,Addr2)。 當我現在看結果簿Book1時,我有{{Name0,Addr0),(Name1,Addr2)}而不是{{Name0,Addr2),(Name1,Addr1),(Name1,Addr2)}
為什么將其視為法律實例?
(合金分析儀4.2,建立日期2012-09-25 15:54 EDT)
這里有兩個令人困惑的事情:
Book0
不參與該操作。 而是Book1
具有b0
和b1
的角色。
向書中添加n->a
並不表示這是一個新地址。 在實例中, Book1
在add
之前和之后都有此地址。 這是因為操作
b'.addr = b.addr + n->a
使用set union 。 細分為一個簡單的示例:
{1, 2} = {1} + {2}
是真的。 但
{1, 2} = {1, 2} + {2}
也是如此。 因此,在原始示例中,沒有什么可以排除n->a
已經成為b.addr
的一部分。 合金分析儀僅生成與給定約束一致的所有實例。
您可以通過在add
添加一個斷言來改進此示例:
b.addr[n] != a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.