10 | import Data.List.Lazy
11 | import Data.List.Quantifiers
12 | import Data.List.Lazy.Quantifiers
13 | import Decidable.Equality
15 | import public Search.CTL
21 | weaken : Dec _ -> Bool
22 | weaken (Yes _) = True
23 | weaken (No _) = False
25 | parameters (Sts : Type)
33 | data GCL : Type where
34 | IF : (gs : List GUARD) -> GCL
36 | DOT : GCL -> GCL -> GCL
38 | DO : (gs : List GUARD) -> GCL
40 | UPDATE : (u : Sts -> Sts) -> GCL
48 | Pred = (st : Sts) -> Bool
60 | Uninhabited (IF _ === SKIP) where
61 | uninhabited Refl
impossible
64 | Uninhabited (DOT _ _ === SKIP) where
65 | uninhabited Refl
impossible
68 | Uninhabited (DO _ === SKIP) where
69 | uninhabited Refl
impossible
72 | Uninhabited (UPDATE _ === SKIP) where
73 | uninhabited Refl
impossible
77 | isSkip : (l : GCL) -> Dec (l === SKIP)
78 | isSkip (IF xs) = No absurd
79 | isSkip (DOT y z) = No absurd
80 | isSkip (DO xs) = No absurd
81 | isSkip (UPDATE uf) = No absurd
82 | isSkip SKIP = Yes Refl
87 | ops' : GCL -> Sts -> List (GCL, Sts)
89 | ops' (UPDATE u) st = [(SKIP, u st)]
90 | ops' (DOT SKIP y) st = [(y, st)]
91 | ops' (DOT x y) st = mapFst (`DOT` y) <$> ops' x st
92 | ops' (IF gs) st = map (\ aGuard => (aGuard.x, st)) $
93 | filter (\ aGuard => aGuard.g st) gs
95 | ops' (DO gs) st with (map (\ aG => ((DOT aG.x (DO gs)), st)) $
96 | filter (\ aG => aG.g st) gs)
97 | _ | [] = [(SKIP, st)]
102 | ops : (GCL, Sts) -> List (GCL, Sts)
103 | ops (l, st) = ops' l st
108 | gclToDiag : GCL -> Diagram GCL Sts
109 | gclToDiag p = TD ops p
117 | while : Pred -> GCL -> GCL
118 | while g x = DO [MkGUARD g x]
122 | await : Pred -> GCL
123 | await g = IF [MkGUARD g SKIP]
128 | ifThenElse : (g : Pred) -> (x : GCL) -> (y : GCL) -> GCL
129 | ifThenElse g x y = IF [MkGUARD g x, MkGUARD (not . g) y]
137 | constructor MkState
139 | intent1, intent2 : Bool
142 | inCS1, inCS2 : Bool
149 | (UPDATE State (\st => { inCS1 := True } st))
152 | (UPDATE State (\st => { inCS1 := False } st))
160 | (UPDATE State (\st => { inCS2 := True } st))
163 | (UPDATE State (\st => { inCS2 := False } st))
168 | petersons1 : GCL State
171 | (UPDATE State (\st => { intent1 := True } st))
173 | (UPDATE State (\st => { turn := 1 } st))
175 | (await State (\st => (not st.intent2) || (weaken (decEq st.turn 0))))
178 | (UPDATE State (\st => { intent1 := False } st))
183 | petersons2 : GCL State
186 | (UPDATE State (\st => { intent2 := True } st))
188 | (UPDATE State (\st => { turn := 0 } st))
190 | (await State (\st => (not st.intent1) || (weaken (decEq st.turn 1))))
193 | (UPDATE State (\st => { intent2 := False } st))
199 | petersons : Diagram (GCL State, GCL State) State
200 | petersons = (gclToDiag State petersons1) `pComp` (gclToDiag State petersons2)
208 | IsTT : (b : Bool) -> Dec (So b)
210 | IsTT False = No absurd
215 | Mutex : Formula ? ?
217 | AlwaysGlobal (GCL State, GCL State) State
218 | (Guarded (GCL State, GCL State) State
219 | (\p,_ => So (not (p.inCS1 && p.inCS2))))
223 | checkMutex : MC (GCL State, GCL State) State Mutex
225 | agSearch (GCL State, GCL State) State
226 | (now (GCL State, GCL State) State
227 | (\p,_ => fromDec $
IsTT _))
234 | let guardCS1 = Guarded (GCL State, GCL State) State (\p,_ => So (p.inCS1))
235 | guardCS2 = Guarded (GCL State, GCL State) State (\p,_ => So (p.inCS2))
236 | in AND' (GCL State, GCL State) State
237 | (AlwaysFinally (GCL State, GCL State) State guardCS1)
238 | (AlwaysFinally (GCL State, GCL State) State guardCS2)
242 | checkSF : MC (GCL State, GCL State) State SF
244 | let mcAndFst = afSearch (GCL State, GCL State) State
245 | (now (GCL State, GCL State) State
246 | (\p,_ => fromDec $
IsTT _))
248 | mcAndSnd = afSearch (GCL State, GCL State) State
249 | (now (GCL State, GCL State) State
250 | (\p,_ => fromDec $
IsTT _))
252 | in mcAND' (GCL State, GCL State) State mcAndFst mcAndSnd
257 | Termination : Formula ? ?
259 | AlwaysFinally (GCL State, GCL State) State
260 | (Guarded (GCL State, GCL State) State
261 | (\_,l => allSkip l))
263 | allSkip : (l : (GCL State, GCL State)) -> Type
264 | allSkip l = (fst l === SKIP State, snd l === SKIP State)
268 | checkTermination : MC (GCL State, GCL State) State Termination
270 | afSearch (GCL State, GCL State) State
271 | (now (GCL State, GCL State) State
272 | (\_,l => MkHDec (isTerm l) (sound l)))
275 | isTerm : (l : (GCL State, GCL State)) -> Bool
277 | (weaken $
isSkip State a) && (weaken $
isSkip State b)
279 | sound : (l : (GCL State, GCL State))
281 | -> (fst l === SKIP State, snd l === SKIP State)
282 | sound (a, b) _ with (isSkip State a) | (isSkip State b)
283 | sound (a, b) _ | (Yes p) | (Yes q) = (p, q)
284 | sound (a, b) Oh
| (Yes p) | (No _) impossible
285 | sound (a, b) Oh
| (No _) | _ impossible
291 | init = MkState False False 0 False False
296 | tree : CT (GCL State, GCL State) State
297 | tree = model (GCL State, GCL State) State petersons init
309 | CSP = (arg : Nat **
310 | AND' (GCL State, GCL State) State
311 | (\depth, tree => Mutex depth tree)
313 | AND' (GCL State, GCL State) State
314 | (\depth, tree => SF depth tree)
315 | (\depth, tree => Termination depth tree)
325 | checkPetersons : Prop ?
CSP
326 | checkPetersons = exists $
327 | (mcAND' (GCL State, GCL State) State
329 | (mcAND' (GCL State, GCL State) State
369 | dekkers1 : GCL State
372 | (UPDATE _ (\st => { intent1 := True } st))
374 | (while _ (\st => st.intent2)
375 | (IF _ [ (MkGUARD _ (\st => weaken $
decEq st.turn 0) (SKIP _))
376 | , (MkGUARD _ (\st => weaken $
decEq st.turn 1)
378 | (UPDATE _ (\st => { intent1 := False } st))
380 | (await _ (\st => weaken $
decEq st.turn 0))
381 | (UPDATE _ (\st => { intent1 := True } st))
388 | (UPDATE _ (\st => { turn := 1 } st))
389 | (UPDATE _ (\st => { intent1 := False } st))
394 | dekkers2 : GCL State
397 | (UPDATE _ (\st => { intent2 := True } st))
399 | (while _ (\st => st.intent1)
400 | (IF _ [ (MkGUARD _ (\st => weaken $
decEq st.turn 1) (SKIP _))
401 | , (MkGUARD _ (\st => weaken $
decEq st.turn 0)
403 | (UPDATE _ (\st => { intent2 := False } st))
405 | (await _ (\st => weaken $
decEq st.turn 1))
406 | (UPDATE _ (\st => { intent2 := True } st))
413 | (UPDATE _ (\st => { turn := 0 } st))
414 | (UPDATE _ (\st => { intent2 := False } st))
419 | dekkers : Diagram (GCL State, GCL State) State
420 | dekkers = (gclToDiag _ dekkers1) `pComp` (gclToDiag _ dekkers2)
430 | checkDekkers : HDec ?
433 | (now _ _ (\p, _ => (fromDec $
IsTT (p.inCS1 && p.inCS2))))
434 | (model _ _ dekkers init) 100