添加状态之间的删除关系

时间:2013-05-13 00:09:37

标签: alloy

我有这个合金模型

module Test
sig B {}

sig A {
c: some B,
delta: c lone -> lone c
}


pred operationA[disj x, x': A,  
c1, c2: B]{
x'.delta = x.delta + (c1->c2)
x'.delta = x'.delta - (c1->c2)
x'.c = x.c
} 

run operationA for 10 but 2 A

这不会生成任何实例。我在x'状态下添加关系c1-> c2并再次删除它,某些原因它不允许我这样做。

1 个答案:

答案 0 :(得分:1)

Alloy语言是声明性的,这意味着您最终编写了 必须发生的规范,而不是 如何实现(这是必要的方法) )。因此,operationA谓词的正文被解释为你在那里写的三行的连词,而不是要执行的一系列操作。

更具体地说,行x'.delta = x'.delta - (c1->c2)表示x'.delta关系的内容同时等于x'.delta - c1->c2。就此而言,只有当x'.delta不包含元组c1->c2时,该行才是可以满足的(因为-运算符是集合差异,并且如果您尝试从集合中删除某些内容那里还没有,结果是相同的一组)。但是,上一行x'.delta = x.delta + (c1->c2)表示x'.delta的内容必须包含c1->c2(加上x.delta中的任何内容,因此这两行一起不可满足。

如果要对命令式算法的三个步骤进行建模,则必须使用三个变量,例如xx'x''