我创建了一个将数据块写入固定大小的内存的Alloy模型 . 见下文 . 合金分析器生成的实例都包含大小为1的块(即,具有一个数据的块)或更少 . 我希望Alloy Analyzer使用大小为2的块生成实例 . 所以,我把它添加到 writeBlock 谓词: #block = 2 . 这是更新的谓词:

pred writeBlock (m, m': Memory, block: set Data) {
    some addrs: set m.data.Data {
        #addrs = #block
        #block = 2   // I added this
        m'.data = m.data ++ (addrs -> block)
    }
}

但随后分析师说“没有找到实例” .

为什么?

为什么没有实例?

module fixedSizeMemory [Addr, Data]

sig Memory {
    data: Addr -> one Data
}

// Write a block of data to memory.
pred writeBlock (m, m': Memory, block: set Data) {
    some addrs: set m.data.Data {
        #addrs = #block
        m'.data = m.data ++ (addrs -> block)
    }
}

pred Show {}
run writeBlock

更新:我想出了添加 #block = 2 时没有实例的原因 . 问题出在 (addrs -> block) 上 . 这就是说:取所有 addrs 值和 block 值的排列 . 因此,如果有2个 addrs 值和2个 block 值,那么将有4个排列 . data 关系表示每个 Addr 值映射到一个 Data 值 . 但这四种排列将违反这一限制 . 唯一不违反关系的 blocks 是大小为1或0的 blocks .

Update#2 :我解决了这个问题 . 这是合金代码写一块内存:

// Write a block of data to memory. That is,
// overwrite the data at a set of addresses
// with values in block.
pred writeBlock (m, m': Memory, block: set Data) {
       // Non-deterministically select a subset 
       // of m's addresses to be overwritten.
       some addresses: set m.data.Data {
           // The chunk of memory overwritten
           // matches the size of the block.
           #addresses = #block
           // Create a temporary relation, mapping.
           // It defines a mapping from each address
           // selected above to a block value. The
           // relation is 1:1. That is, each address is
           // assigned a value from block, and each
           // value in block is associated to an address.
           some mapping: addresses one -> one block {
               // Overwrite the selected portion of memory
               // with mapping.
               m'.data = m.data ++ mapping
              // This is so cool!
         }
    }
}