Alloy中有多个集合吗?

时间:2014-05-10 10:31:37

标签: alloy formal-methods

有没有办法在合金中使用袋子(多层)建模系统?如果没有明确的行李概念,是否有可能的解决方法?

感谢。

2 个答案:

答案 0 :(得分:1)

E的multiset [aka bag]可用函数E表示 - >一个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]                  }

可能有更简洁的方法来组合袋子。

答案 1 :(得分:0)

感谢你的帮助,但我最终还是采取了以下方式:

首先,我限制我的行李只包含非零多重性的元素

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] 
}