有没有办法在合金中使用袋子(多组)对系统进行建模?如果没有明确的袋子概念,是否有任何可能的解决方法?
谢谢。
E 的多重集 [aka bag] 可以用函数 E -> one Natural 或 E ->lone (Natural-Zero) 表示(取决于如何处理缺席的品味)。
open util/natural
sig E {}
sig A { m : E -> one Natural }
sig B { n : E -> lone (Natural-Zero) }
fun bagunion[m, n : univ -> lone Natural]: univ -> lone Natural
{ e : (m+n).univ, x : Natural | e in m.univ-n.univ implies x=e.m
else e in n.univ-m.univ implies x=e.n
else x=add[e.m, e.n] }
可能有更简洁的方法来进行袋子联合。
感谢您的所有帮助,但我最终按照以下方式进行了操作:
首先,我限制我的包只包含非零多重性的元素
module bags
open util/natural
open util/relation
sig Element{}
sig Bag{
elements: Element -> one Natural
}{
all e: Element.elements | e != Zero
}
并像这样编码联合/差异/交集:
fun BagUnion[b1, b2 : Element -> one Natural]: Element -> one Natural{
let e = (dom[b1] + dom[b2]) | e -> add[e.b1, e.b2]
}
fun BagDifference[b1, b2 : Element -> one Natural]: Element -> one Natural{
let e = dom[b1] | e -> max[Zero + sub[e.b1, e.b2]]
}
fun BagIntersection[b1, b2 : Element -> one Natural]: Element -> one Natural{
let e = (dom[b1] & dom[b2]) | e -> min[e.b1 + e.b2]
}