我已经完成了一个问题陈述,例如: 外科医生必须对三名患者进行手术,但只有两副手套。一定没有 交叉污染:外科医生不得与任何患者的血液接触,并且 没有患者必须接触另一名患者的血液。外科医生需要两只手才能工作。她是怎么做到的?在Alloy中表达此问题,并使用分析仪找到解决方案。
我已经发现了一些签名,但我坚持要求事实和谓词的声明。谁能帮我吗?我的代码是:
module Question1
sig Doc_Patient {
doc : one Surgeon,
patient: set Patient,
relation1: doc one->one Hand,
//relation2: hand one->set Gloves
//relation3:
}
sig Surgeon{
//hands: one Hand,
blood1: one Blood
}
sig Blood { }
one sig Hand {
material: set Gloves
}
sig Gloves { }
sig Patient {
blood2: one Blood
}
fact {
}
pred show( ){ }
run show for 1 Doc_Patient,1 Surgeon,1 Hand,4 Blood,3 Patient,2 Gloves
\ 提前谢谢
答案 0 :(得分:4)
我认为这个问题需要合金中的“event idiom”。您需要对可能发生的所有不同类型的事件进行建模(医生对患者进行手术,医生戴上手套,医生摘下手套,医生将手套翻过来),事件之间允许的转换以及每次转换指明所有被污染的东西。然后你要求合金分析仪找到一系列事件,以便最终医生对所有三名患者进行手术并且没有人受到污染。
这不是一项微不足道的任务,尤其是因为你必须模拟医生可以在给定时间戴上多个手套(这是解决这个问题所需的手套)这一事实,但在Alloy中非常可行。以下是您可以开始解决问题的方法
open util/ordering[Time] as T0
open util/boolean
sig Time{}
sig GloveSide {
// sides can get contaminated over time
contaminated: Bool -> Time
}
sig Glove {
// sides can change over time
inner: GloveSide -> Time,
outer: GloveSide -> Time
}
sig Patient{}
one sig Doctor {
// doctor can change gloves over time
leftHand: (seq Glove) -> Time,
rightHand: (seq Glove) -> Time
}
abstract sig Event {
// pre- and post-state times for this event
pre, post: one Time
}
sig Operate extends Event {
patient: one Patient
}{
// precondition: clean gloves
// ...
// postcondition: outer gloves not clean, everything else stays the same
// ...
}
sig TakeGlovesOff extends Event {
} {
// ...
}
sig PutGlovesOn extends Event {
} {
// ...
}
fact transitions {
all t: Time - T0/last |
let t' = t.next |
some e: Event {
e.pre = t
e.post = t'
}
}
run {
// all three patients operated
} for 7 but exactly 2 Glove, exactly 4 GloveSide, exactly 3 Patient, 5 Int