合金事实声明

时间:2013-04-30 06:24:53

标签: alloy

我已经完成了一个问题陈述,例如: 外科医生必须对三名患者进行手术,但只有两副手套。一定没有 交叉污染:外科医生不得与任何患者的血液接触,并且 没有患者必须接触另一名患者的血液。外科医生需要两只手才能工作。她是怎么做到的?在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 

\ 提前谢谢

1 个答案:

答案 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