154 AddSEs [Ap_E, K_parcontractE, S_parcontractE, Ap_parcontractE]; |
153 AddSEs [Ap_E, K_parcontractE, S_parcontractE, Ap_parcontractE]; |
155 |
154 |
156 (*** Basic properties of parallel contraction ***) |
155 (*** Basic properties of parallel contraction ***) |
157 |
156 |
158 Goal "K#p =1=> r ==> (EX p'. r = K#p' & p =1=> p')"; |
157 Goal "K#p =1=> r ==> (EX p'. r = K#p' & p =1=> p')"; |
159 by (Blast_tac 1); |
158 by Auto_tac; |
160 qed "K1_parcontractD"; |
159 qed "K1_parcontractD"; |
|
160 AddSDs [K1_parcontractD]; |
161 |
161 |
162 Goal "S#p =1=> r ==> (EX p'. r = S#p' & p =1=> p')"; |
162 Goal "S#p =1=> r ==> (EX p'. r = S#p' & p =1=> p')"; |
163 by (Blast_tac 1); |
163 by Auto_tac; |
164 qed "S1_parcontractD"; |
164 qed "S1_parcontractD"; |
|
165 AddSDs [S1_parcontractD]; |
165 |
166 |
166 Goal "S#p#q =1=> r ==> (EX p' q'. r = S#p'#q' & p =1=> p' & q =1=> q')"; |
167 Goal "S#p#q =1=> r ==> (EX p' q'. r = S#p'#q' & p =1=> p' & q =1=> q')"; |
167 by (blast_tac (claset() addSDs [S1_parcontractD]) 1); |
168 by Auto_tac; |
168 qed "S2_parcontractD"; |
169 qed "S2_parcontractD"; |
|
170 AddSDs [S2_parcontractD]; |
169 |
171 |
170 (*Church-Rosser property for parallel contraction*) |
172 (*Church-Rosser property for parallel contraction*) |
171 Goalw [diamond_def] "diamond(parcontract)"; |
173 Goalw [diamond_def] "diamond(parcontract)"; |
172 by (rtac (impI RS allI RS allI) 1); |
174 by (rtac (impI RS allI RS allI) 1); |
173 by (etac parcontract.induct 1); |
175 by (etac parcontract.induct 1); |
174 by (ALLGOALS |
176 by (ALLGOALS |
175 (blast_tac (claset() addSDs [K1_parcontractD, S2_parcontractD] |
177 (blast_tac (claset() addSEs comb.free_SEs |
176 addIs [parcontract_combD2]))); |
178 addIs [parcontract_combD2]))); |
177 qed "diamond_parcontract"; |
179 qed "diamond_parcontract"; |
178 |
180 |
179 (*** Equivalence of p--->q and p===>q ***) |
181 (*** Equivalence of p--->q and p===>q ***) |
180 |
182 |
181 Goal "p-1->q ==> p=1=>q"; |
183 Goal "p-1->q ==> p=1=>q"; |
182 by (etac contract.induct 1); |
184 by (etac contract.induct 1); |
183 by (ALLGOALS Blast_tac); |
185 by Auto_tac; |
184 qed "contract_imp_parcontract"; |
186 qed "contract_imp_parcontract"; |
185 |
187 |
186 Goal "p--->q ==> p===>q"; |
188 Goal "p--->q ==> p===>q"; |
187 by (forward_tac [rtrancl_type RS subsetD RS SigmaD1] 1); |
189 by (forward_tac [rtrancl_type RS subsetD RS SigmaD1] 1); |
188 by (dtac (field_contract_eq RS equalityD1 RS subsetD) 1); |
190 by (dtac (field_contract_eq RS equalityD1 RS subsetD) 1); |
189 by (etac rtrancl_induct 1); |
191 by (etac rtrancl_induct 1); |
190 by (blast_tac (claset() addIs [r_into_trancl]) 1); |
192 by (blast_tac (claset() addIs [r_into_trancl]) 1); |
191 by (blast_tac (claset() addIs [contract_imp_parcontract, |
193 by (blast_tac (claset() addIs [contract_imp_parcontract, |
192 r_into_trancl, trans_trancl RS transD]) 1); |
194 r_into_trancl, trans_trancl RS transD]) 1); |
193 qed "reduce_imp_parreduce"; |
195 qed "reduce_imp_parreduce"; |
194 |
196 |
195 |
197 |
196 Goal "p=1=>q ==> p--->q"; |
198 Goal "p=1=>q ==> p--->q"; |
197 by (etac parcontract.induct 1); |
199 by (etac parcontract.induct 1); |
198 by (blast_tac (claset() addIs reduction_rls) 1); |
200 by (blast_tac (claset() addIs reduction_rls) 1); |
199 by (blast_tac (claset() addIs reduction_rls) 1); |
201 by (blast_tac (claset() addIs reduction_rls) 1); |
200 by (blast_tac (claset() addIs reduction_rls) 1); |
202 by (blast_tac (claset() addIs reduction_rls) 1); |
201 by (blast_tac |
203 by (blast_tac |
202 (claset() addIs [trans_rtrancl RS transD, |
204 (claset() addIs [trans_rtrancl RS transD, |
203 Ap_reduce1, Ap_reduce2, parcontract_combD1, |
205 Ap_reduce1, Ap_reduce2, parcontract_combD1, |
204 parcontract_combD2]) 1); |
206 parcontract_combD2]) 1); |
205 qed "parcontract_imp_reduce"; |
207 qed "parcontract_imp_reduce"; |
206 |
208 |
207 Goal "p===>q ==> p--->q"; |
209 Goal "p===>q ==> p--->q"; |
208 by (forward_tac [trancl_type RS subsetD RS SigmaD1] 1); |
210 by (forward_tac [trancl_type RS subsetD RS SigmaD1] 1); |
209 by (dtac (field_parcontract_eq RS equalityD1 RS subsetD) 1); |
211 by (dtac (field_parcontract_eq RS equalityD1 RS subsetD) 1); |