diff -r 66f39908df95 -r 18eac4596ef1 QuotProd.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QuotProd.thy Mon Dec 07 08:45:04 2009 +0100 @@ -0,0 +1,80 @@ +theory QuotProd +imports QuotScript +begin + +fun + prod_rel +where + "prod_rel r1 r2 = (\(a,b) (c,d). r1 a c \ r2 b d)" + +(* prod_fun is a good mapping function *) + +lemma prod_equivp: + assumes a: "equivp R1" + assumes b: "equivp R2" + shows "equivp (prod_rel R1 R2)" +unfolding equivp_reflp_symp_transp reflp_def symp_def transp_def +apply(auto simp add: equivp_reflp[OF a] equivp_reflp[OF b]) +apply(simp only: equivp_symp[OF a]) +apply(simp only: equivp_symp[OF b]) +using equivp_transp[OF a] apply blast +using equivp_transp[OF b] apply blast +done + +lemma prod_quotient: + assumes q1: "Quotient R1 Abs1 Rep1" + assumes q2: "Quotient R2 Abs2 Rep2" + shows "Quotient (prod_rel R1 R2) (prod_fun Abs1 Abs2) (prod_fun Rep1 Rep2)" +unfolding Quotient_def +apply (simp add: Quotient_abs_rep[OF q1] Quotient_abs_rep[OF q2] Quotient_rel_rep[OF q1] Quotient_rel_rep[OF q2]) +using Quotient_rel[OF q1] Quotient_rel[OF q2] by blast + +lemma pair_rsp: + assumes q1: "Quotient R1 Abs1 Rep1" + assumes q2: "Quotient R2 Abs2 Rep2" + shows "(R1 ===> R2 ===> prod_rel R1 R2) Pair Pair" +by auto + +lemma pair_prs: + assumes q1: "Quotient R1 Abs1 Rep1" + assumes q2: "Quotient R2 Abs2 Rep2" + shows "(prod_fun Abs1 Abs2) (Rep1 l, Rep2 r) \ (l, r)" + by (simp add: Quotient_abs_rep[OF q1] Quotient_abs_rep[OF q2]) + +(* TODO: Is the quotient assumption q1 necessary? *) +(* TODO: Aren't there hard to use later? *) +lemma fst_rsp: + assumes q1: "Quotient R1 Abs1 Rep1" + assumes q2: "Quotient R2 Abs2 Rep2" + assumes a: "(prod_rel R1 R2) p1 p2" + shows "R1 (fst p1) (fst p2)" + using a + apply(case_tac p1) + apply(case_tac p2) + apply(auto) + done + +lemma snd_rsp: + assumes q1: "Quotient R1 Abs1 Rep1" + assumes q2: "Quotient R2 Abs2 Rep2" + assumes a: "(prod_rel R1 R2) p1 p2" + shows "R2 (snd p1) (snd p2)" + using a + apply(case_tac p1) + apply(case_tac p2) + apply(auto) + done + +lemma fst_prs: + assumes q1: "Quotient R1 Abs1 Rep1" + assumes q2: "Quotient R2 Abs2 Rep2" + shows "Abs1 (fst ((prod_fun Rep1 Rep2) p)) = fst p" +by (case_tac p) (auto simp add: Quotient_abs_rep[OF q1]) + +lemma snd_prs: + assumes q1: "Quotient R1 Abs1 Rep1" + assumes q2: "Quotient R2 Abs2 Rep2" + shows "Abs2 (snd ((prod_fun Rep1 Rep2) p)) = snd p" +by (case_tac p) (auto simp add: Quotient_abs_rep[OF q2]) + +end