# HG changeset patch # User Cezary Kaliszyk # Date 1265203345 -3600 # Node ID 277301dc5c4c7336ebff7332b4da9d9ef6d24d91 # Parent e8bb5f85e510328b4de724c7387e4e6c65ecea57# Parent a83ee7ecb1cbdeda53f792486bb7d21e5a8f87cc merge diff -r a83ee7ecb1cb -r 277301dc5c4c Quot/Nominal/Terms.thy --- a/Quot/Nominal/Terms.thy Wed Feb 03 14:15:07 2010 +0100 +++ b/Quot/Nominal/Terms.thy Wed Feb 03 14:22:25 2010 +0100 @@ -655,17 +655,17 @@ | rLcons "name" "rtrm5" "rlts" primrec - bv5 + rbv5 where - "bv5 rLnil = {}" -| "bv5 (rLcons n t ltl) = {atom n} \ (bv5 ltl)" + "rbv5 rLnil = {}" +| "rbv5 (rLcons n t ltl) = {atom n} \ (rbv5 ltl)" primrec rfv_trm5 and rfv_lts where "rfv_trm5 (rVr5 n) = {atom n}" | "rfv_trm5 (rAp5 t s) = (rfv_trm5 t) \ (rfv_trm5 s)" -| "rfv_trm5 (rLt5 lts t) = (rfv_trm5 t - bv5 lts) \ (rfv_lts lts - bv5 lts)" +| "rfv_trm5 (rLt5 lts t) = (rfv_trm5 t - rbv5 lts) \ (rfv_lts lts - rbv5 lts)" | "rfv_lts (rLnil) = {}" | "rfv_lts (rLcons n t ltl) = (rfv_trm5 t) \ (rfv_lts ltl)" @@ -678,7 +678,7 @@ where "permute_rtrm5 pi (rVr5 a) = rVr5 (pi \ a)" | "permute_rtrm5 pi (rAp5 t1 t2) = rAp5 (permute_rtrm5 pi t1) (permute_rtrm5 pi t2)" -| "permute_rtrm5 pi (rLt5 as t) = rLt5 (permute_rlts pi as) (permute_rtrm5 pi t)" +| "permute_rtrm5 pi (rLt5 ls t) = rLt5 (permute_rlts pi ls) (permute_rtrm5 pi t)" | "permute_rlts pi (rLnil) = rLnil" | "permute_rlts pi (rLcons n t ls) = rLcons (pi \ n) (permute_rtrm5 pi t) (permute_rlts pi ls)" @@ -714,9 +714,9 @@ where a1: "a = b \ (rVr5 a) \5 (rVr5 b)" | a2: "\t1 \5 t2; s1 \5 s2\ \ rAp5 t1 s1 \5 rAp5 t2 s2" -| a3: "\pi. ((bv5 l1, t1) \gen alpha5 rfv_trm5 pi (bv5 l2, t2) \ - (bv5 l1, l1) \gen alphalts rfv_lts pi (bv5 l2, l2) \ - (pi \ (bv5 l1) = bv5 l2)) +| a3: "\pi. ((rbv5 l1, t1) \gen alpha5 rfv_trm5 pi (rbv5 l2, t2) \ + (rbv5 l1, l1) \gen alphalts rfv_lts pi (rbv5 l2, l2) \ + (pi \ (rbv5 l1) = rbv5 l2)) \ rLt5 l1 t1 \5 rLt5 l2 t2" | a4: "rLnil \l rLnil" | a5: "ls1 \l ls2 \ t1 \5 t2 \ n1 = n2 \ rLcons n1 t1 ls1 \l rLcons n2 t2 ls2" @@ -726,9 +726,9 @@ lemma alpha5_inj: "((rVr5 a) \5 (rVr5 b)) = (a = b)" "(rAp5 t1 s1 \5 rAp5 t2 s2) = (t1 \5 t2 \ s1 \5 s2)" - "(rLt5 l1 t1 \5 rLt5 l2 t2) = (\pi. ((bv5 l1, t1) \gen alpha5 rfv_trm5 pi (bv5 l2, t2) \ - (bv5 l1, l1) \gen alphalts rfv_lts pi (bv5 l2, l2) \ - (pi \ (bv5 l1) = bv5 l2)))" + "(rLt5 l1 t1 \5 rLt5 l2 t2) = (\pi. ((rbv5 l1, t1) \gen alpha5 rfv_trm5 pi (rbv5 l2, t2) \ + (rbv5 l1, l1) \gen alphalts rfv_lts pi (rbv5 l2, l2) \ + (pi \ (rbv5 l1) = rbv5 l2)))" "rLnil \l rLnil" "(rLcons n1 t1 ls1 \l rLcons n2 t2 ls2) = (ls1 \l ls2 \ t1 \5 t2 \ n1 = n2)" apply - @@ -758,6 +758,143 @@ lts = rlts / alphalts by (auto intro: alpha5_equivps) +quotient_definition + "Vr5 :: name \ trm5" +as + "rVr5" + +quotient_definition + "Ap5 :: trm5 \ trm5 \ trm5" +as + "rAp5" + +quotient_definition + "Lt5 :: lts \ trm5 \ trm5" +as + "rLt5" + +quotient_definition + "Lnil :: lts" +as + "rLnil" + +quotient_definition + "Lcons :: name \ trm5 \ lts \ lts" +as + "rLcons" + +quotient_definition + "fv_trm5 :: trm5 \ atom set" +as + "rfv_trm5" + +quotient_definition + "fv_lts :: lts \ atom set" +as + "rfv_lts" + +quotient_definition + "bv5 :: lts \ atom set" +as + "rbv5" + +lemma alpha5_rfv: + "(t \5 s \ rfv_trm5 t = rfv_trm5 s)" + "(l \l m \ rfv_lts l = rfv_lts m)" + apply(induct rule: alpha5_alphalts.inducts) + apply(simp_all add: alpha_gen) + apply(erule conjE)+ + apply(erule exE) + apply(erule conjE)+ + apply simp + done + +lemma [quot_respect]: +"(op = ===> alpha5 ===> alpha5) permute permute" +"(op = ===> alphalts ===> alphalts) permute permute" +"(op = ===> alpha5) rVr5 rVr5" +"(alpha5 ===> alpha5 ===> alpha5) rAp5 rAp5" +"(alphalts ===> alpha5 ===> alpha5) rLt5 rLt5" +"(alphalts ===> alpha5 ===> alpha5) rLt5 rLt5" +"(op = ===> alpha5 ===> alphalts ===> alphalts) rLcons rLcons" +"(alpha5 ===> op =) rfv_trm5 rfv_trm5" +"(alphalts ===> op =) rfv_lts rfv_lts" +"(alphalts ===> op =) rbv5 rbv5" +sorry + +instantiation trm5 and lts :: pt +begin + +quotient_definition + "permute_trm5 :: perm \ trm5 \ trm5" +as + "permute :: perm \ rtrm5 \ rtrm5" + +quotient_definition + "permute_lts :: perm \ lts \ lts" +as + "permute :: perm \ rlts \ rlts" + +lemma permute_trm5_lts: +"pi \ (Vr5 a) = Vr5 (pi \ a)" +"pi \ (Ap5 t1 t2) = Ap5 (pi \ t1) (pi \ t2)" +"pi \ (Lt5 ls t) = Lt5 (pi \ ls) (pi \ t)" +"pi \ Lnil = Lnil" +"pi \ (Lcons n t ls) = Lcons (pi \ n) (pi \ t) (pi \ ls)" +by (lifting permute_rtrm5_permute_rlts.simps) + +lemma trm5_lts_zero: + "0 \ (x\trm5) = x" + "0 \ (y\lts) = y" +sorry + +lemma trm5_lts_plus: + "(p + q) \ (x\trm5) = p \ q \ x" + "(p + q) \ (y\lts) = p \ q \ y" +sorry + +instance +apply default +apply (simp_all add: trm5_lts_zero trm5_lts_plus) +done + +end + +lemma alpha5_INJ: + "((Vr5 a) = (Vr5 b)) = (a = b)" + "(Ap5 t1 s1 = Ap5 t2 s2) = (t1 = t2 \ s1 = s2)" + "(Lt5 l1 t1 = Lt5 l2 t2) = + (\pi. ((bv5 l1, t1) \gen (op =) fv_trm5 pi (bv5 l2, t2) \ + (bv5 l1, l1) \gen (op =) fv_lts pi (bv5 l2, l2) \ + (pi \ (bv5 l1) = bv5 l2)))" + "Lnil = Lnil" + "(Lcons n1 t1 ls1 = Lcons n2 t2 ls2) = (ls1 = ls2 \ t1 = t2 \ n1 = n2)" +unfolding alpha_gen +apply(lifting alpha5_inj[unfolded alpha_gen]) +done + +lemma bv5[simp]: + "bv5 Lnil = {}" + "bv5 (Lcons n t ltl) = {atom n} \ bv5 ltl" +by (lifting rbv5.simps) + +lemma fv_trm5_lts[simp]: + "fv_trm5 (Vr5 n) = {atom n}" + "fv_trm5 (Ap5 t s) = fv_trm5 t \ fv_trm5 s" + "fv_trm5 (Lt5 lts t) = fv_trm5 t - bv5 lts \ (fv_lts lts - bv5 lts)" + "fv_lts Lnil = {}" + "fv_lts (Lcons n t ltl) = fv_trm5 t \ fv_lts ltl" +by (lifting rfv_trm5_rfv_lts.simps) + +lemma lets_ok: + "(Lt5 (Lcons x (Vr5 x) Lnil) (Vr5 x)) = (Lt5 (Lcons y (Vr5 y) Lnil) (Vr5 y))" +apply (subst alpha5_INJ) +apply (rule_tac x="(x \ y)" in exI) +apply (simp only: alpha_gen) +apply (simp add: permute_trm5_lts) +sorry + + text {* type schemes *} datatype ty = Var "name" @@ -887,6 +1024,6 @@ apply(simp add: fresh_star_def) apply(auto) done - + end