(* ------------------------------------------------------------------------- *)
(* Bug puzzle. *)
(* ------------------------------------------------------------------------- *)
prioritize_real();;
let move = new_definition
`move ((ax,ay),(bx,by),(cx,cy)) ((ax',ay'),(bx',by'),(cx',cy')) <=>
(?a. ax' = ax + a * (cx - bx) /\ ay' = ay + a * (cy - by) /\
bx' = bx /\ by' = by /\ cx' = cx /\ cy' = cy) \/
(?b. bx' = bx + b * (ax - cx) /\ by' = by + b * (ay - cy) /\
ax' = ax /\ ay' = ay /\ cx' = cx /\ cy' = cy) \/
(?c. ax' = ax /\ ay' = ay /\ bx' = bx /\ by' = by /\
cx' = cx + c * (bx - ax) /\ cy' = cy + c * (by - ay))`;;
let reachable_RULES,reachable_INDUCT,reachable_CASES =
new_inductive_definition
`(!p. reachable p p) /\
(!p q r. move p q /\ reachable q r ==> reachable p r)`;;
let IMPOSSIBILITY_B = prove
(`~(
reachable ((&0,&0),(&3,&0),(&0,&3)) ((&1,&2),(&2,&5),(-- &2,&3)) \/
reachable ((&0,&0),(&3,&0),(&0,&3)) ((&1,&2),(-- &2,&3),(&2,&5)) \/
reachable ((&0,&0),(&3,&0),(&0,&3)) ((&2,&5),(&1,&2),(-- &2,&3)) \/
reachable ((&0,&0),(&3,&0),(&0,&3)) ((&2,&5),(-- &2,&3),(&1,&2)) \/
reachable ((&0,&0),(&3,&0),(&0,&3)) ((-- &2,&3),(&1,&2),(&2,&5)) \/
reachable ((&0,&0),(&3,&0),(&0,&3)) ((-- &2,&3),(&2,&5),(&1,&2)))`,
(* ------------------------------------------------------------------------- *)
(* Verification of a simple concurrent program. *)
(* ------------------------------------------------------------------------- *)
let trans = new_definition
`trans (x,y,pc1,pc2,sem) (x',y',pc1',pc2',sem') <=>
pc1 = 10 /\ sem > 0 /\ pc1' = 20 /\ sem' = sem - 1 /\
(x',y',pc2') = (x,y,pc2) \/
pc2 = 10 /\ sem > 0 /\ pc2' = 20 /\ sem' = sem - 1 /\
(x',y',pc1') = (x,y,pc1) \/
pc1 = 20 /\ pc1' = 30 /\ x' = x + 1 /\
(y',pc2',sem') = (y,pc2,sem) \/
pc2 = 20 /\ pc2' = 30 /\ y' = y + 1 /\ x' = x /\
pc1' = pc1 /\ sem' = sem \/
pc1 = 30 /\ pc1' = 10 /\ sem' = sem + 1 /\
(x',y',pc2') = (x,y,pc2) \/
pc2 = 30 /\ pc2' = 10 /\ sem' = sem + 1 /\
(x',y',pc1') = (x,y,pc1)`;;
needs "Library/rstc.ml";;
let INDUCTIVE_INVARIANT = prove
(`!init invariant transition P.
(!s. init s ==> invariant s) /\
(!s s'. invariant s /\ transition s s' ==> invariant s') /\
(!s. invariant s ==> P s)
==> !s s':A. init s /\
RTC transition s s' ==> P s'`,
REPEAT GEN_TAC THEN MP_TAC(ISPECL
[`transition:A->A->bool`;
`\s s':A. invariant s ==> invariant s'`]
RTC_INDUCT) THEN
MESON_TAC[]);;