[英]How to express structural equality between trees in Alloy?
我定義了以下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的限制(我認為)。
因此,如果可能的話,我傾向於非遞歸解決方案。
您說了關於遞歸的所有內容,即遞歸深度。 我只是嘗試了以下遞歸謂詞,該謂詞對於小樹確實很好用
pred noniso[n1, n2: N] {
#n1.children != #n2.children or
some nn1: n1.children, nn2: n2.children | noniso[nn1, nn2]
}
另一種不需要遞歸的方法是將noniso
關系建模為Alloy關系,然后為所有節點斷言該關系包含所有非同構對。 你可以這樣
one sig G {
noniso: N -> N
} {
all n1, n2: N {
(n1 -> n2 in noniso) iff
(#n1.children != #n2.children or
some nn1: n1.children, nn2: n2.children | nn1 -> nn2 in noniso)
}
}
為了對此進行測試,我創建了show_noniso
和show_iso
謂詞,它們創建了具有4個嵌套級別的樹。
// differ at level 4 only
pred show_noniso[n1, n2, n3, n4, n5, n6, n7: N] {
children = n1 -> n2 + n2 -> n3 + n3 -> n4 + n5 -> n6 + n6 -> n7
State.a = n1
State.b = n5
}
pred show_iso[n1, n2, n3, n4, n5, n6, n7, n8: N] {
children = n1 -> n2 + n2 -> n3 + n3 -> n4 + n5 -> n6 + n6 -> n7 + n7 -> n8
State.a = n1
State.b = n5
}
然后進行各種組合
// USING RECURSION_DEPTH SET TO 2
run noniso_recursion_fails {
some disj n1, n2, n3, n4, n5, n6, n7: N | show_noniso[n1, n2, n3, n4, n5, n6, n7]
noniso[State.a, State.b]
} for 8 expect 0
run noniso_relation_works {
some disj n1, n2, n3, n4, n5, n6, n7: N | show_noniso[n1, n2, n3, n4, n5, n6, n7]
State.a -> State.b in G.noniso
} for 8 expect 1
run iso_relation_works {
some disj n1, n2, n3, n4, n5, n6, n7, n8: N | show_iso[n1, n2, n3, n4, n5, n6, n7, n8]
State.a -> State.b in G.noniso
} for 8 expect 0
這些分析的結果符合預期
#1: no instance found. noniso_recursion_fails may be inconsistent, as expected.
#2: instance found. noniso_relation_works is consistent, as expected.
#3: no instance found. iso_relation_works may be inconsistent, as expected.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.