File: normalize.ml

package info (click to toggle)
hol88 2.02.19940316-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 63,052 kB
  • ctags: 19,365
  • sloc: ml: 199,939; ansic: 9,300; sh: 7,118; makefile: 6,076; lisp: 2,747; yacc: 894; sed: 201; cpp: 87; awk: 5
file content (278 lines) | stat: -rw-r--r-- 7,167 bytes parent folder | download | duplicates (11)
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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
%----------------------------------------------------------------

 FILE           : normalize.ml
 DESCRIPTION    : Defines a tactic for normalizing arithmetic 
                  expressions involving natural numbers.
 READS FILES    : <none>                                                
 WRITES FILES   : <none>
                                                                        
 AUTHOR         : P. J. Windley                                         
 DATE           : 20 FEB 89

----------------------------------------------------------------%
%< Some comments of WP:>%


%< because of the assymetry of "-" (3 - 6 = 0) this normalization does not
   normalize terms with substractions >%
  

%< to avoid the name clash with the :zet MULT_ASSOC>%

let NUM_MULT_ASSOC = theorem `arithmetic` `MULT_ASSOC`;;

%<-------------------------------------------------------------------------->%

% ADD3_SYM = |- !a b c. (a + b) + c = (a + c) + b %

let ADD3_SYM =
 TAC_PROOF
  (([], "!a b c. (a+b)+c = (a+c)+b"),
   REPEAT GEN_TAC
    THEN REWRITE_TAC[SYM(SPEC_ALL ADD_ASSOC)]
    THEN SUBST_TAC[SPECL["b:num";"c:num"]ADD_SYM]
    THEN REFL_TAC);;

%<-------------------------------------------------------------------------->%

% MULT3_SYM = |- !a b c. (a * b) * c = (a * c) * b %

let MULT3_SYM =
 TAC_PROOF
  (([], "!a b c. (a*b)*c = (a*c)*b"),
   REPEAT GEN_TAC
    THEN REWRITE_TAC[SYM(SPEC_ALL NUM_MULT_ASSOC)]
    THEN SUBST_TAC[SPECL["b:num";"c:num"]MULT_SYM]
    THEN REFL_TAC);;

%<-------------------------------------------------------------------------->%

let const_name  = fst o dest_const;;

let var_name  = fst o dest_var;;

let is_plus_term t =
   if is_comb t & ((const_name (fst (strip_comb t))) = `+`) then
      true
   else
      false;;

let is_mult_term t =
   if is_comb t & ((const_name (fst (strip_comb t))) = `*`) then
      true
   else
      false;;

%<-------------------------------------------------------------------------->%

%
   ADD_SYM_CONV "a+b"      --> |- a+b     = b+a       if b << a
   ADD_SYM_CONV "(a+b)+c"  --> |- (a+b)+c = (a+c)+b   if c << b

%

let ADD_SYM_CONV t =
 let op1,[t1;t2] = strip_comb t
 in
 if op1 = "$+" & not (is_plus_term t1) & (t2 << t1)    % t=a+b %
  then SPECL[t1;t2]ADD_SYM
  else
   (let op2,[t3;t4] = strip_comb t1
    in
    if op1 = "$+" & op2 = "$+" & (t2 << t4)                % t=(a+b)+c %
     then SPECL[t3;t4;t2]ADD3_SYM
     else fail);;

%<-------------------------------------------------------------------------->%
%
   MULT_SYM_CONV "a*b"      --> |- a*b     = b*a       if b << a
   MULT_SYM_CONV "(a*b)*c"  --> |- (a*b)*c = (a*c)*b   if c << b

%

let MULT_SYM_CONV t =
 let op1,[t1;t2] = strip_comb t
 in
 if op1 = "$*" & not (is_mult_term t1) & (t2 << t1)    % t=a*b %
  then SPECL[t1;t2]MULT_SYM
  else
   (let op2,[t3;t4] = strip_comb t1
    in
    if op1 = "$*" & op2 = "$*" & (t2 << t4)                % t=(a*b)*c %
     then SPECL[t3;t4;t2]MULT3_SYM
     else fail);;

%<-------------------------------------------------------------------------->%

%
   ADD_ASSOC_CONV "a+(b+c)"  --> |- a+(b+c) = (a+b)+c
%

let ADD_ASSOC_CONV t =
 let op1,[t1;t2] = strip_comb t
 in
 let op2,[t3;t4] = strip_comb t2
 in
 if op1 = "$+"  & op2 = "$+"
  then SPECL[t1;t3;t4]ADD_ASSOC
  else fail;;

%<-------------------------------------------------------------------------->%

%
   ASSOC_ADD_CONV "(a+b)+c"  --> |- (a+b)+c = a+(b+c)
%

let assoc_add = (GEN_ALL o SYM o SPEC_ALL) ADD_ASSOC;;

let ASSOC_ADD_CONV t =
 let op1,[t1;t2] = strip_comb t
 in
 let op2,[t3;t4] = strip_comb t1
 in
 if op1 = "$+"  & op2 = "$+"
  then SPECL[t3;t4;t2] assoc_add
  else fail;;


%<-------------------------------------------------------------------------->%

%
   MULT_ASSOC_CONV "a*(b*c)"  --> |- a*(b*c) = (a*b)*c
%

let MULT_ASSOC_CONV t =
 let op1,[t1;t2] = strip_comb t
 in
 let op2,[t3;t4] = strip_comb t2
 in
 if op1 = "$*"  & op2 = "$*"
  then SPECL[t1;t3;t4] NUM_MULT_ASSOC
  else fail;;


%<-------------------------------------------------------------------------->%
%
   ASSOC_MULT_CONV "(a*b)*c"  --> |- (a*b)*c = a*(b*c)
%

let assoc_mult = (GEN_ALL o SYM o SPEC_ALL) NUM_MULT_ASSOC;;

let ASSOC_MULT_CONV t =
 let op1,[t1;t2] = strip_comb t
 in
 let op2,[t3;t4] = strip_comb t1
 in
 if op1 = "$*"  & op2 = "$*"
  then SPECL[t3;t4;t2] assoc_mult
  else fail;;

%<-------------------------------------------------------------------------->%

%
  WP - 15-6-1990, 
  ADD_DISTRIB_CONV "a*(b+c)" --> |- (a*b) + (a*c)
                   "(a+b)*c" --> |- (a*c) + (b*c)
%


let ADD_DISTRIB_CONV t = 
  let op1,[t2;t3] = strip_comb t
  in 
  let op2,l2 = strip_comb t2 and op3,l3 = strip_comb t3
  in
  if op1 = "$*" & op2 = "$+"
  then
      SPECL (l2 @ [t3]) RIGHT_ADD_DISTRIB
  if op1 = "$*" & op3 = "$+"
  then
      SPECL (l3 @ [t2]) LEFT_ADD_DISTRIB
  else fail;;



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

                   %< The normalization conversion  >%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

             %< normalization of term only containing + >%

let ADD_NORMALIZE_CONV = 
  TOP_DEPTH_CONV ADD_ASSOC_CONV
  THENC TOP_DEPTH_CONV ADD_SYM_CONV;;

%<-------------------------------------------------------------------------->%

                %< terms with + and *; without distributivity >%

let NORMALIZE_CONV = 
  TOP_DEPTH_CONV ADD_ASSOC_CONV
  THENC TOP_DEPTH_CONV ADD_SYM_CONV
  THENC TOP_DEPTH_CONV MULT_ASSOC_CONV
  THENC TOP_DEPTH_CONV MULT_SYM_CONV;;

%<-------------------------------------------------------------------------->%

                %< terms with + and *; with distributivity >%
                      %< WP 15-6-1990 >%

let NUM_NORMALIZE_CONV = 
     TOP_DEPTH_CONV ADD_DISTRIB_CONV
     THENC NORMALIZE_CONV;;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

                        %< The related tactics >%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


let ADD_NORMALIZE_TAC =
   CONV_TAC ADD_NORMALIZE_CONV
   THEN (REFL_TAC ORELSE ALL_TAC);;


let NORMALIZE_TAC =
   PURE_REWRITE_TAC [
       RIGHT_ADD_DISTRIB; 
       LEFT_ADD_DISTRIB; 
      ]       
   THEN CONV_TAC NORMALIZE_CONV
   THEN (REFL_TAC ORELSE ALL_TAC);;

%<-------------------------------------------------------------------------->%

% Example


set_goal([], "((((a + (b + a)) + (d + e)) + e) + f) + h =
         a + ((e + f) + ((e + (d + (b + a))) + h))");;

expand(NORMALIZE_TAC);;

expand(ADD_NORMALIZE_TAC);;

set_goal([],
   "(((((a * 2 * b) + (bee + a)) + (deer + (e * 2 * r))) + e) + f) + h =
       (b * a * 2) + ((e + f) + (((r * e * 2) + (deer + (bee + a))) + h))"
     );;

expand(NORMALIZE_TAC);;

set_goal([], "(adam + bee) * cable = (cable * bee) + (cable * adam)");;

expand(NORMALIZE_TAC);;

set_goal([],
   "((((((a + t) * 2 * b) + (bee + a)) + 
         (deer + (e * 2 * r))) + e) + (f * 4)) + h = 
    ((((((((2 * a) + ((2 * e) * r)) + (4 * f)) + ((2 * b) * t)) + a) +
       bee) + deer) + e) + h");;

expand(NORMALIZE_TAC);;
%
%<------------------------------------------------------------------------->%