简单合金约束不能按预期工作

时间:2015-01-14 15:21:48

标签: alloy

当Books的数量限制为1时,以下模型生成具有正好2个地址关系的实例,但是,如果允许更多Books,则将创建具有0-3地址关系的实例。我对合金如何运作的误解?

sig Name{}
sig Addr{}
sig Book { addr: Name -> lone Addr }
pred show(b:Book) { #b.addr = 2 } 
// nr. of address relations in every Book should be 2
run show for 3 but 2 Book 
// works as expected with 1 Book

1 个答案:

答案 0 :(得分:2)

show的每个实例都应包含一本书,标记为b show,其中有两个地址对。但是show并没有说每个书必须有两个地址对,只有至少一个必须有两个地址对。

[后记]

当你要求Alloy向你显示一个谓词的实例时,例如命令run show,那么Alloy应该向你展示一个实例:那就是(引用软件抽象的第5.2.1节< / em>,你已经打开了)“为约束变量的值赋值,约束求值为true。”在任何给定的Universe中,对于约束求值为false的变量,可能存在许多其他可能的值赋值;在具有多个原子的任何宇宙中,这种可能的非合适分配的存在是不可避免的。

非正式地,我们可以将带有参数X,Y,Z的谓词P的run命令视为请求Alloy显示满足表达式的Universe

some X, Y, Z : univ | P[X, Y, Z]

run命令使 达到表达式

all X, Y, Z : univ | P[X, Y, Z]

如果您只想查看每个图书的addr关系中有两对的Universe,请说明:

pred all_books_have_2 { all b : Book | #b.addr = 2 }

我认为run有隐含的存在量化,而不是隐含的普遍量化。一种看待原因的方法是想象一个定义树的模型,例如:

sig Node { parent : lone Node }
fact parent_acyclic { no n : Node | n in n.^parent }

假设我们厌倦了看到每棵树都很简单且包含单个节点的宇宙。我希望能够通过编写

来定义一个保证至少一个深度大于1的树的谓词
pred nontrivial[n : Node]{ some n.parent }

考虑到树是非循环的约束,永远不会存在谓词nontrivial适用于所有节点的非空宇宙。因此,如果runpred具有您所假设的语义,我们就无法使用nontrivial来查找包含非平凡树的Universe。

我希望这会有所帮助。