equal
deleted
inserted
replaced
194 The classes of quasi and partial orders are closed under binary |
194 The classes of quasi and partial orders are closed under binary |
195 products. Note that the direct product of linear orders need |
195 products. Note that the direct product of linear orders need |
196 \emph{not} be linear in general. |
196 \emph{not} be linear in general. |
197 *} |
197 *} |
198 |
198 |
199 instantiation * :: (leq, leq) leq |
199 instantiation prod :: (leq, leq) leq |
200 begin |
200 begin |
201 |
201 |
202 definition |
202 definition |
203 leq_prod_def: "p \<sqsubseteq> q \<equiv> fst p \<sqsubseteq> fst q \<and> snd p \<sqsubseteq> snd q" |
203 leq_prod_def: "p \<sqsubseteq> q \<equiv> fst p \<sqsubseteq> fst q \<and> snd p \<sqsubseteq> snd q" |
204 |
204 |
212 |
212 |
213 lemma leq_prodE [elim?]: |
213 lemma leq_prodE [elim?]: |
214 "p \<sqsubseteq> q \<Longrightarrow> (fst p \<sqsubseteq> fst q \<Longrightarrow> snd p \<sqsubseteq> snd q \<Longrightarrow> C) \<Longrightarrow> C" |
214 "p \<sqsubseteq> q \<Longrightarrow> (fst p \<sqsubseteq> fst q \<Longrightarrow> snd p \<sqsubseteq> snd q \<Longrightarrow> C) \<Longrightarrow> C" |
215 by (unfold leq_prod_def) blast |
215 by (unfold leq_prod_def) blast |
216 |
216 |
217 instance * :: (quasi_order, quasi_order) quasi_order |
217 instance prod :: (quasi_order, quasi_order) quasi_order |
218 proof |
218 proof |
219 fix p q r :: "'a::quasi_order \<times> 'b::quasi_order" |
219 fix p q r :: "'a::quasi_order \<times> 'b::quasi_order" |
220 show "p \<sqsubseteq> p" |
220 show "p \<sqsubseteq> p" |
221 proof |
221 proof |
222 show "fst p \<sqsubseteq> fst p" .. |
222 show "fst p \<sqsubseteq> fst p" .. |
232 also from qr have "\<dots> \<sqsubseteq> snd r" .. |
232 also from qr have "\<dots> \<sqsubseteq> snd r" .. |
233 finally show "snd p \<sqsubseteq> snd r" . |
233 finally show "snd p \<sqsubseteq> snd r" . |
234 qed |
234 qed |
235 qed |
235 qed |
236 |
236 |
237 instance * :: (partial_order, partial_order) partial_order |
237 instance prod :: (partial_order, partial_order) partial_order |
238 proof |
238 proof |
239 fix p q :: "'a::partial_order \<times> 'b::partial_order" |
239 fix p q :: "'a::partial_order \<times> 'b::partial_order" |
240 assume pq: "p \<sqsubseteq> q" and qp: "q \<sqsubseteq> p" |
240 assume pq: "p \<sqsubseteq> q" and qp: "q \<sqsubseteq> p" |
241 show "p = q" |
241 show "p = q" |
242 proof |
242 proof |