1 (* ========================================================================= *)
2 (* Abstract version of symbolic trajectory evaluation. *)
4 (* Based on the paper "Symbolic Trajectory Evaluation in a Nutshell" *)
5 (* by Tom Melham & Ashish Darbari, 2002 (still unpublished?) *)
6 (* ========================================================================= *)
8 parse_as_infix("&&",(16,"right"));;
9 parse_as_infix("<<=",(14,"right"));;
10 parse_as_infix(">->",(13,"right"));;
11 parse_as_infix(">~~>",(6,"right"));;
13 (* ------------------------------------------------------------------------- *)
14 (* Some type of nodes that we don't really care much about. *)
15 (* ------------------------------------------------------------------------- *)
17 let node_INDUCT,node_RECURSION = define_type
20 (* ------------------------------------------------------------------------- *)
21 (* Also "abstract" propositional formulas (i.e. we never unfold "eval"). *)
22 (* ------------------------------------------------------------------------- *)
24 let propform_INDUCT,propform_RECURSION = define_type
25 "propform = Propform (num->bool)->bool";;
27 let eval = new_recursive_definition propform_RECURSION
28 `eval (Propform p) v = p v`;;
30 (* ------------------------------------------------------------------------- *)
31 (* Quaternary lattice. *)
32 (* ------------------------------------------------------------------------- *)
34 let quat_INDUCT,quat_RECURSION = define_type
35 "quat = X | ZERO | ONE | TOP";;
37 let quat_DISTINCT = prove_constructors_distinct quat_RECURSION;;
39 (* ------------------------------------------------------------------------- *)
40 (* Basic lattice operations. *)
41 (* ------------------------------------------------------------------------- *)
43 let qle = new_definition
44 `x <<= y <=> x = X \/ y = TOP \/ x = y`;;
46 let qjoin = new_definition
47 `x && y = if x <<= y then y else if y <<= x then x else TOP`;;
49 (* ------------------------------------------------------------------------- *)
50 (* Trivial lemmas about the quaternary lattice. *)
51 (* ------------------------------------------------------------------------- *)
58 (`!x y z. x <<= y /\ y <<= z ==> x <<= z`,
59 REPEAT(MATCH_MP_TAC quat_INDUCT THEN REPEAT CONJ_TAC) THEN
60 REWRITE_TAC[qle; quat_DISTINCT]);;
63 (`!x y z. x && y <<= z <=> x <<= z /\ y <<= z`,
64 REPEAT(MATCH_MP_TAC quat_INDUCT THEN REPEAT CONJ_TAC) THEN
65 REWRITE_TAC[qjoin; qle; quat_DISTINCT]);;
68 (`!x y. x <<= x && y /\ y <<= x && y`,
69 REPEAT(MATCH_MP_TAC quat_INDUCT THEN REPEAT CONJ_TAC) THEN
70 REWRITE_TAC[qjoin; qle; quat_DISTINCT]);;
72 (* ------------------------------------------------------------------------- *)
73 (* Choice expressions. *)
74 (* ------------------------------------------------------------------------- *)
76 let choice = new_definition
77 `b >-> x = if b then x else X`;;
79 let QLE_CHOICE = prove
80 (`(b >-> x) <<= y <=> b ==> x <<= y`,
81 REPEAT GEN_TAC THEN REWRITE_TAC[choice] THEN
82 COND_CASES_TAC THEN REWRITE_TAC[] THEN REWRITE_TAC[qle]);;
84 (* ------------------------------------------------------------------------- *)
85 (* Basic type of trajectory formulas. *)
86 (* ------------------------------------------------------------------------- *)
88 let trajform_INDUCT,trajform_RECURSION = define_type
91 | Andj trajform trajform
92 | When trajform propform
95 (* ------------------------------------------------------------------------- *)
97 (* ------------------------------------------------------------------------- *)
99 let tholds = new_recursive_definition trajform_RECURSION
100 `(tholds (Is_0 nd) seq v <=> ZERO <<= seq 0 nd v) /\
101 (tholds (Is_1 nd) seq v <=> ONE <<= seq 0 nd v) /\
102 (tholds (Andj tf1 tf2) seq v <=> tholds tf1 seq v /\ tholds tf2 seq v) /\
103 (tholds (When tf1 p) seq v <=> eval p v ==> tholds tf1 seq v) /\
104 (tholds (Next(tf1)) seq v <=> tholds tf1 (\t. seq(t + 1)) v)`;;
106 (* ------------------------------------------------------------------------- *)
107 (* Defining sequence. *)
108 (* ------------------------------------------------------------------------- *)
110 let defseq = new_recursive_definition trajform_RECURSION
111 `(defseq (Is_0 n) t nd v = ((n = nd) /\ (t = 0)) >-> ZERO) /\
112 (defseq (Is_1 n) t nd v = ((n = nd) /\ (t = 0)) >-> ONE) /\
113 (defseq (Andj tf1 tf2) t nd v = defseq tf1 t nd v && defseq tf2 t nd v) /\
114 (defseq (When tf1 p) t nd v = eval p v >-> defseq tf1 t nd v) /\
115 (defseq (Next(tf1)) t nd v = ~(t = 0) >-> defseq tf1 (t - 1) nd v)`;;
117 (* ------------------------------------------------------------------------- *)
118 (* Proof of the key property. *)
119 (* ------------------------------------------------------------------------- *)
121 let DEFSEQ_MINIMAL = prove
122 (`!tf seq v. tholds tf seq v <=> !t nd. defseq tf t nd v <<= seq t nd v`,
123 let cases_lemma = prove
124 (`(!t. P t) <=> P 0 /\ !t. P(SUC t)`,MESON_TAC[num_CASES]) in
125 MATCH_MP_TAC trajform_INDUCT THEN REWRITE_TAC[defseq; tholds] THEN
126 REPEAT CONJ_TAC THENL
127 [REPEAT GEN_TAC THEN REWRITE_TAC[QLE_CHOICE] THEN MESON_TAC[];
128 REPEAT GEN_TAC THEN REWRITE_TAC[QLE_CHOICE] THEN MESON_TAC[];
129 SIMP_TAC[QLE_LJOIN; FORALL_AND_THM];
130 REWRITE_TAC[QLE_CHOICE] THEN MESON_TAC[];
131 REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[cases_lemma] THEN
132 ASM_REWRITE_TAC[QLE_CHOICE; NOT_SUC; ADD1; ADD_SUB]]);;
134 (* ------------------------------------------------------------------------- *)
135 (* Notion of a trajectory w.r.t. a next-state function. *)
136 (* ------------------------------------------------------------------------- *)
138 let trajectory = new_definition
139 `trajectory next seq v <=> !t nd. next(seq t) nd v <<= seq (t + 1) nd v`;;
141 (* ------------------------------------------------------------------------- *)
142 (* Defining trajectory of a formula. *)
143 (* ------------------------------------------------------------------------- *)
145 let deftraj = new_recursive_definition num_RECURSION
146 `(deftraj step tf 0 nd v = defseq tf 0 nd v) /\
147 (deftraj step tf (SUC t) nd v =
148 defseq tf (SUC t) nd v && step(deftraj step tf t) nd v)`;;
150 (* ------------------------------------------------------------------------- *)
151 (* Obviously this is at least as strong as the defining sequence. *)
152 (* ------------------------------------------------------------------------- *)
154 let DEFTRAJ_DEFSEQ = prove
155 (`!tf t nd v. defseq tf t nd v <<= deftraj step tf t nd v`,
156 GEN_TAC THEN INDUCT_TAC THEN
157 REWRITE_TAC[deftraj; QLE_REFL; QLE_RJOIN]);;
159 (* ------------------------------------------------------------------------- *)
160 (* ...and it is indeed a trajectory. *)
161 (* ------------------------------------------------------------------------- *)
163 let TRAJECTORY_DEFTRAJ = prove
164 (`!step tf v. trajectory step (deftraj step tf) v`,
165 REPEAT GEN_TAC THEN REWRITE_TAC[trajectory] THEN
166 REWRITE_TAC[GSYM ADD1; deftraj; QLE_RJOIN]);;
168 (* ------------------------------------------------------------------------- *)
169 (* Monotonicity of next-state function. *)
170 (* ------------------------------------------------------------------------- *)
172 let monotonic = new_definition
173 `monotonic next v <=>
174 !s1 s2. (!nd. s1 nd v <<= s2 nd v) ==> !nd. next s1 nd v <<= next s2 nd v`;;
176 (* ------------------------------------------------------------------------- *)
177 (* Minimality property of defining trajectory (needs monotonicity). *)
178 (* ------------------------------------------------------------------------- *)
180 let DEFTRAJ_MINIMAL = prove
183 ==> !tf seq. trajectory step seq v
184 ==> (tholds tf seq v <=>
185 !t nd. deftraj step tf t nd v <<= seq t nd v)`,
186 REWRITE_TAC[monotonic; trajectory; RIGHT_IMP_FORALL_THM] THEN
187 REPEAT STRIP_TAC THEN EQ_TAC THENL
188 [ALL_TAC; MESON_TAC[DEFSEQ_MINIMAL; DEFTRAJ_DEFSEQ; QLE_TRANS]] THEN
189 DISCH_TAC THEN INDUCT_TAC THEN REWRITE_TAC[deftraj; QLE_LJOIN] THEN
190 ASM_MESON_TAC[DEFSEQ_MINIMAL; QLE_TRANS; ADD1]);;
192 (* ------------------------------------------------------------------------- *)
193 (* Basic semantic notion in STE. *)
194 (* ------------------------------------------------------------------------- *)
196 let ste = new_definition
197 `(A >~~> C) ckt v <=>
198 !seq. trajectory ckt seq v /\ tholds A seq v ==> tholds C seq v`;;
200 (* ------------------------------------------------------------------------- *)
201 (* The "fundamental theorem of STE". *)
202 (* ------------------------------------------------------------------------- *)
206 ==> ((A >~~> C) ckt v <=> !t nd. defseq C t nd v <<= deftraj ckt A t nd v)`,
207 MESON_TAC[ste; DEFTRAJ_MINIMAL; DEFSEQ_MINIMAL; DEFTRAJ_DEFSEQ;
208 TRAJECTORY_DEFTRAJ; QLE_TRANS]);;