【发布时间】:2014-01-30 23:04:44
【问题描述】:
我定义了以下合金模型
使用单个 State 对象指向 State.a 和 State.b 两棵树的根。
sig N {
children: set N
}
fact {
let p = ~children |
~p.p in iden
and no iden & ^p
}
one sig State {
a: one N,
b: one N
}
fun parent[n:N] : N {
n.~children
}
fact {
no State.a.parent
no State.b.parent
State.a != State.b
State.a.^children != State.b.^children
}
pred show {}
run show for 4
在我得到的解决方案中:
+-----+
+--+State|+-+
a| +-----+ |b
| |
v v
+--+ +--+
|N2| |N3|
++-+ +-++
| |
+v-+ +-v+
|N0| |N1|
+--+ +--+
所以我得到了两棵树 N2 -> N0 和 N3 -> N1
结构上相等。
我怎样才能进一步约束这个模型,使State.a 和State.b
在这个意义上不相等?
恐怕这只能通过递归谓词和 递归只能达到深度 3 的限制(我认为)。
因此,如果可能的话,我倾向于使用非递归解决方案。
【问题讨论】:
标签: tree equality alloy structural-equality