src/HOL/Lattice/Orders.thy
changeset 37678 0040bafffdef
parent 35317 d57da4abb47d
child 39246 9e58f0499f57
equal deleted inserted replaced
37677:c5a8b612e571 37678:0040bafffdef
   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