当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
答案 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
适用于所有节点的非空宇宙。因此,如果run
和pred
具有您所假设的语义,我们就无法使用nontrivial
来查找包含非平凡树的Universe。
我希望这会有所帮助。