File: ste.ml

package info (click to toggle)
hol-light 20170109-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 36,568 kB
  • ctags: 8,549
  • sloc: ml: 540,018; cpp: 439; lisp: 286; java: 279; makefile: 262; sh: 229; yacc: 108; perl: 78; ansic: 57; sed: 39
file content (208 lines) | stat: -rw-r--r-- 9,620 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
(* ========================================================================= *)
(* Abstract version of symbolic trajectory evaluation.                       *)
(*                                                                           *)
(* Based on the paper "Symbolic Trajectory Evaluation in a Nutshell"         *)
(* by Tom Melham & Ashish Darbari, 2002 (still unpublished?)                 *)
(* ========================================================================= *)

parse_as_infix("&&",(16,"right"));;
parse_as_infix("<<=",(14,"right"));;
parse_as_infix(">->",(13,"right"));;
parse_as_infix(">~~>",(6,"right"));;

(* ------------------------------------------------------------------------- *)
(* Some type of nodes that we don't really care much about.                  *)
(* ------------------------------------------------------------------------- *)

let node_INDUCT,node_RECURSION = define_type
  "node = Node num";;

(* ------------------------------------------------------------------------- *)
(* Also "abstract" propositional formulas (i.e. we never unfold "eval").     *)
(* ------------------------------------------------------------------------- *)

let propform_INDUCT,propform_RECURSION = define_type
  "propform = Propform (num->bool)->bool";;

let eval = new_recursive_definition propform_RECURSION
  `eval (Propform p) v = p v`;;

(* ------------------------------------------------------------------------- *)
(* Quaternary lattice.                                                       *)
(* ------------------------------------------------------------------------- *)

let quat_INDUCT,quat_RECURSION = define_type
 "quat = X | ZERO | ONE | TOP";;

let quat_DISTINCT = prove_constructors_distinct quat_RECURSION;;

(* ------------------------------------------------------------------------- *)
(* Basic lattice operations.                                                 *)
(* ------------------------------------------------------------------------- *)

let qle = new_definition
  `x <<= y <=> x = X \/ y = TOP \/ x = y`;;

let qjoin = new_definition
  `x && y = if x <<= y then y else if y <<= x then x else TOP`;;

(* ------------------------------------------------------------------------- *)
(* Trivial lemmas about the quaternary lattice.                              *)
(* ------------------------------------------------------------------------- *)

let QLE_REFL = prove
 (`!x. x <<= x`,
  REWRITE_TAC[qle]);;

let QLE_TRANS = prove
 (`!x y z. x <<= y /\ y <<= z ==> x <<= z`,
  REPEAT(MATCH_MP_TAC quat_INDUCT THEN REPEAT CONJ_TAC) THEN
  REWRITE_TAC[qle; quat_DISTINCT]);;

let QLE_LJOIN = prove
 (`!x y z. x && y <<= z <=> x <<= z /\ y <<= z`,
  REPEAT(MATCH_MP_TAC quat_INDUCT THEN REPEAT CONJ_TAC) THEN
  REWRITE_TAC[qjoin; qle; quat_DISTINCT]);;

let QLE_RJOIN = prove
 (`!x y. x <<= x && y /\ y <<= x && y`,
  REPEAT(MATCH_MP_TAC quat_INDUCT THEN REPEAT CONJ_TAC) THEN
  REWRITE_TAC[qjoin; qle; quat_DISTINCT]);;

(* ------------------------------------------------------------------------- *)
(* Choice expressions.                                                       *)
(* ------------------------------------------------------------------------- *)

let choice = new_definition
  `b >-> x = if b then x else X`;;

let QLE_CHOICE = prove
 (`(b >-> x) <<= y <=> b ==> x <<= y`,
  REPEAT GEN_TAC THEN REWRITE_TAC[choice] THEN
  COND_CASES_TAC THEN REWRITE_TAC[] THEN REWRITE_TAC[qle]);;

(* ------------------------------------------------------------------------- *)
(* Basic type of trajectory formulas.                                        *)
(* ------------------------------------------------------------------------- *)

let trajform_INDUCT,trajform_RECURSION = define_type
 "trajform = Is_0 node
           | Is_1 node
           | Andj trajform trajform
           | When trajform propform
           | Next trajform";;

(* ------------------------------------------------------------------------- *)
(* Semantics.                                                                *)
(* ------------------------------------------------------------------------- *)

let tholds = new_recursive_definition trajform_RECURSION
  `(tholds (Is_0 nd) seq v <=> ZERO <<= seq 0 nd v) /\
   (tholds (Is_1 nd) seq v <=> ONE <<= seq 0 nd v) /\
   (tholds (Andj tf1 tf2) seq v <=> tholds tf1 seq v /\ tholds tf2 seq v) /\
   (tholds (When tf1 p) seq v <=> eval p v ==> tholds tf1 seq v) /\
   (tholds (Next(tf1)) seq v <=> tholds tf1 (\t. seq(t + 1)) v)`;;

(* ------------------------------------------------------------------------- *)
(* Defining sequence.                                                        *)
(* ------------------------------------------------------------------------- *)

let defseq = new_recursive_definition trajform_RECURSION
  `(defseq (Is_0 n) t nd v = ((n = nd) /\ (t = 0)) >-> ZERO) /\
   (defseq (Is_1 n) t nd v = ((n = nd) /\ (t = 0)) >-> ONE) /\
   (defseq (Andj tf1 tf2) t nd v = defseq tf1 t nd v && defseq tf2 t nd v) /\
   (defseq (When tf1 p) t nd v =  eval p v >-> defseq tf1 t nd v) /\
   (defseq (Next(tf1)) t nd v = ~(t = 0) >-> defseq tf1 (t - 1) nd v)`;;

(* ------------------------------------------------------------------------- *)
(* Proof of the key property.                                                *)
(* ------------------------------------------------------------------------- *)

let DEFSEQ_MINIMAL = prove
 (`!tf seq v. tholds tf seq v <=> !t nd. defseq tf t nd v <<= seq t nd v`,
  let cases_lemma = prove
   (`(!t. P t) <=> P 0 /\ !t. P(SUC t)`,MESON_TAC[num_CASES]) in
  MATCH_MP_TAC trajform_INDUCT THEN REWRITE_TAC[defseq; tholds] THEN
  REPEAT CONJ_TAC THENL
   [REPEAT GEN_TAC THEN REWRITE_TAC[QLE_CHOICE] THEN MESON_TAC[];
    REPEAT GEN_TAC THEN REWRITE_TAC[QLE_CHOICE] THEN MESON_TAC[];
    SIMP_TAC[QLE_LJOIN; FORALL_AND_THM];
    REWRITE_TAC[QLE_CHOICE] THEN MESON_TAC[];
    REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[cases_lemma] THEN
    ASM_REWRITE_TAC[QLE_CHOICE; NOT_SUC; ADD1; ADD_SUB]]);;

(* ------------------------------------------------------------------------- *)
(* Notion of a trajectory w.r.t. a next-state function.                      *)
(* ------------------------------------------------------------------------- *)

let trajectory = new_definition
  `trajectory next seq v <=> !t nd. next(seq t) nd v <<= seq (t + 1) nd v`;;

(* ------------------------------------------------------------------------- *)
(* Defining trajectory of a formula.                                         *)
(* ------------------------------------------------------------------------- *)

let deftraj = new_recursive_definition num_RECURSION
  `(deftraj step tf 0 nd v = defseq tf 0 nd v) /\
   (deftraj step tf (SUC t) nd v =
        defseq tf (SUC t) nd v && step(deftraj step tf t) nd v)`;;

(* ------------------------------------------------------------------------- *)
(* Obviously this is at least as strong as the defining sequence.            *)
(* ------------------------------------------------------------------------- *)

let DEFTRAJ_DEFSEQ = prove
 (`!tf t nd v. defseq tf t nd v <<= deftraj step tf t nd v`,
  GEN_TAC THEN INDUCT_TAC THEN
  REWRITE_TAC[deftraj; QLE_REFL; QLE_RJOIN]);;

(* ------------------------------------------------------------------------- *)
(* ...and it is indeed a trajectory.                                         *)
(* ------------------------------------------------------------------------- *)

let TRAJECTORY_DEFTRAJ = prove
 (`!step tf v. trajectory step (deftraj step tf) v`,
  REPEAT GEN_TAC THEN REWRITE_TAC[trajectory] THEN
  REWRITE_TAC[GSYM ADD1; deftraj; QLE_RJOIN]);;

(* ------------------------------------------------------------------------- *)
(* Monotonicity of next-state function.                                      *)
(* ------------------------------------------------------------------------- *)

let monotonic = new_definition
 `monotonic next v <=>
   !s1 s2. (!nd. s1 nd v <<= s2 nd v) ==> !nd. next s1 nd v <<= next s2 nd v`;;

(* ------------------------------------------------------------------------- *)
(* Minimality property of defining trajectory (needs monotonicity).          *)
(* ------------------------------------------------------------------------- *)

let DEFTRAJ_MINIMAL = prove
 (`!step v.
      monotonic step v
      ==> !tf seq. trajectory step seq v
                   ==> (tholds tf seq v <=>
                        !t nd. deftraj step tf t nd v <<= seq t nd v)`,
  REWRITE_TAC[monotonic; trajectory; RIGHT_IMP_FORALL_THM] THEN
  REPEAT STRIP_TAC THEN EQ_TAC THENL
   [ALL_TAC; MESON_TAC[DEFSEQ_MINIMAL; DEFTRAJ_DEFSEQ; QLE_TRANS]] THEN
  DISCH_TAC THEN INDUCT_TAC THEN REWRITE_TAC[deftraj; QLE_LJOIN] THEN
  ASM_MESON_TAC[DEFSEQ_MINIMAL; QLE_TRANS; ADD1]);;

(* ------------------------------------------------------------------------- *)
(* Basic semantic notion in STE.                                             *)
(* ------------------------------------------------------------------------- *)

let ste = new_definition
  `(A >~~> C) ckt v <=>
      !seq. trajectory ckt seq v /\ tholds A seq v ==> tholds C seq v`;;

(* ------------------------------------------------------------------------- *)
(* The "fundamental theorem of STE".                                         *)
(* ------------------------------------------------------------------------- *)

let STE_THM = prove
 (`monotonic ckt v
   ==> ((A >~~> C) ckt v <=> !t nd. defseq C t nd v <<= deftraj ckt A t nd v)`,
  MESON_TAC[ste; DEFTRAJ_MINIMAL; DEFSEQ_MINIMAL; DEFTRAJ_DEFSEQ;
            TRAJECTORY_DEFTRAJ; QLE_TRANS]);;