我有这个合金模型
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并再次删除它,某些原因它不允许我这样做。
答案 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
中的任何内容,因此这两行一起不可满足。
如果要对命令式算法的三个步骤进行建模,则必须使用三个变量,例如x
,x'
和x''
。