1、(a) 用通俗易懂的语言解释这个不变式的含义。(不变式在谓词inv中正式定义:pred inv (b: Book) { let addr = b.addr | all n: Name { n not in n.^addr some addr.n => some n.^addr & Addr } } )(b) 生成一些满足该不变式的地址簿示例,以及一些以不同方式违反该不变式的示例。(c) 通过添加并运行适当的谓词,再次生成一些操作执行的示例。(d) 找出反例,表明add和delete操作都不能保持该不变式。(e) 为这两个操作添加额外的前置条件(对前置状态的约束),以确保不变式得以保持,并重新运行保持性检查,以证明你已成功。增大作用域以增强信心,并简要说明你选择该作用域的理由。(f) 重新运行(c)中的模拟,以检查你是否无意中对操作施加了过多约束。
(a) 该不变式表示:
- 任何名称都不能直接或间接映射到自身;
- 并且如果一个名称被映射到,那么该名称必须直接或间接映射到至少一个地址。
(b) 需要添加谓词和命令来生成满足和违反不变式的地址簿示例。
(c) 通过添加并运行适当的谓词来生成操作执行的示例。
(d) 需要定义断言来调用操作和不变式,并使用命令检查,必要时缩小作用域以获得最小反例。
(e) 为 add 和 delete 操作添加额外前置条件,重新运行保持性检查,增大作用域并说明理由。
(f) 重新运行 (c) 中的模拟,检查是否过度约束操作。
2、通过在Alloy中对问题进行建模,并使用分析器来找到解决方案。(一位农民想把一只山羊、一棵卷心菜和一只狼运过河,但他的船一次只能载他和一样东西。如果他把山羊和卷心菜留在一起,山羊会吃掉卷心菜;如果他把山羊和狼留在一起,山羊会被狼吃掉。他该怎么做呢?
可通过在 Alloy 中对该问题建模,利用分析器寻找解决方案。Alloy 的标准发行版包含一个名为 util/ordering 的模块,它定义了一个全序,这在对农民的行动步骤进行排序时可能会有

最低0.47元/天 解锁文章

2万+

被折叠的 条评论
为什么被折叠?



