我必须在Alloy上制作一个简单的奥林匹克模型,但我很难理解如何约束模型中的子类实例的数量。
sig Medal {}
sig GoldMedal extends Medal {}
sig SilverMedal extends Medal {}
sig BronzeMedal extends Medal {}
sig Event {
medals: set Medal
}
现在我想提出一个事实,在下列情况下约束每种类型奖牌的数量:
到目前为止,我知道如何执行我们每种类型只有一枚奖牌的情况,如下所示:
fact oneOfEachMedal{ all e:Event | one g:GoldMedal | one s:SilverMedal | one b:BronzeMedal | g in e.medals and s in e.medals and b in e.medals }
这给出了预期模型如下:
但是我不知道如何在e.medals
集中找到子类实例的数量。我想要以下内容:
fact caseOne {all e:Event | #(GoldMedal in e.medals) = 1 and #(SilverMedal in e.medals) = 1 and #(BronzeMedal in e.medals >=2 }
答案 0 :(得分:1)
您可以选择medals
和子类型的交集。即no (GoldMedal & medals)
。
sig Medal {}
sig GoldMedal extends Medal {}
sig SilverMedal extends Medal {}
sig BronzeMedal extends Medal {}
sig Event {
medals : set Medal,
case : Int
} {
case > 0
case <= 3
case=1 => {
// Gold medal, 1 Silver medal, >=1 Bronze medal
one (GoldMedal & medals )
one (SilverMedal & medals )
some (BronzeMedal & medals )
} else case =2 => {
// 1 Gold medal, >=2 Silver medal, no Bronze medal
one (GoldMedal & medals )
# (SilverMedal & medals ) >= 2
no (BronzeMedal & medals )
} else case = 3 => {
// >=3 Gold medal, no Silver, no Bronze
# (GoldMedal & medals ) >= 3
no (SilverMedal & medals )
no (BronzeMedal & medals )
}
}
run { Event.case = 1+2+3} for 10
┌──────────┬────────────┬────┐
│this/Event│medals │case│
├──────────┼────────────┼────┤
│Event⁰ │GoldMedal⁰ │3 │
│ ├────────────┼────┤
│ │GoldMedal¹ │ │
│ ├────────────┤ │
│ │GoldMedal² │ │
│ ├────────────┤ │
│ │Medal¹ │ │
├──────────┼────────────┼────┤
│Event¹ │GoldMedal¹ │2 │
│ ├────────────┼────┤
│ │SilverMedal⁰│ │
│ ├────────────┤ │
│ │SilverMedal¹│ │
├──────────┼────────────┼────┤
│Event² │BronzeMedal⁰│1 │
│ ├────────────┼────┤
│ │GoldMedal⁰ │ │
│ ├────────────┤ │
│ │SilverMedal¹│ │
└──────────┴────────────┴────┘