我定义了以下合金模型,它使用单个 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 的限制(我认为)。
因此,如果可能的话,我倾向于使用非递归解决方案。