簡體   English   中英

發現合金規格意外的實例

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

這里有兩個令人困惑的事情:

  1. Book0不參與該操作。 而是Book1具有b0b1的角色。

  2. 向書中添加n->a並不表示這是一個新地址。 在實例中, Book1add之前和之后都有此地址。 這是因為操作

     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.

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