Я определил следующую модель Alloy, которая использует один объект 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 (я думаю).
Поэтому я бы предпочел нерекурсивное решение, если это возможно.