# HG changeset patch # User Christian Urban # Date 1240688525 -7200 # Node ID e54777ab68bdc7da95d3c32546eaf61545d493ef # Parent 0e8e8903ff4ef615ee1723d1dbffbc497158135a adapted permutation functions to new overloading syntax (the functions are still "unchecked" because they are used in conjunction with type-classes) diff -r 0e8e8903ff4e -r e54777ab68bd src/HOL/Nominal/Nominal.thy --- a/src/HOL/Nominal/Nominal.thy Sat Apr 25 08:34:30 2009 +0200 +++ b/src/HOL/Nominal/Nominal.thy Sat Apr 25 21:42:05 2009 +0200 @@ -23,20 +23,93 @@ perm :: "'x prm \ 'a \ 'a" (infixr "\" 80) swap :: "('x \ 'x) \ 'x \ 'x" +(* a "private" copy of the option type used in the abstraction function *) +datatype 'a noption = nSome 'a | nNone + +(* a "private" copy of the product type used in the nominal induct method *) +datatype ('a,'b) nprod = nPair 'a 'b + (* an auxiliary constant for the decision procedure involving *) -(* permutations (to avoid loops when using perm-composition) *) +(* permutations (to avoid loops when using perm-compositions) *) constdefs "perm_aux pi x \ pi\x" -(* permutation on functions *) -defs (unchecked overloaded) - perm_fun_def: "pi\(f::'a\'b) \ (\x. pi\f((rev pi)\x))" - -(* permutation on bools *) -primrec (unchecked perm_bool) - true_eqvt: "pi\True = True" - false_eqvt: "pi\False = False" - +(* permutation operations *) +overloading + perm_fun \ "perm :: 'x prm \ ('a\'b) \ ('a\'b)" (unchecked) + perm_bool \ "perm :: 'x prm \ bool \ bool" (unchecked) + perm_unit \ "perm :: 'x prm \ unit \ unit" (unchecked) + perm_prod \ "perm :: 'x prm \ ('a\'b) \ ('a\'b)" (unchecked) + perm_list \ "perm :: 'x prm \ 'a list \ 'a list" (unchecked) + perm_option \ "perm :: 'x prm \ 'a option \ 'a option" (unchecked) + perm_char \ "perm :: 'x prm \ char \ char" (unchecked) + perm_nat \ "perm :: 'x prm \ nat \ nat" (unchecked) + perm_int \ "perm :: 'x prm \ int \ int" (unchecked) + + perm_noption \ "perm :: 'x prm \ 'a noption \ 'a noption" (unchecked) + perm_nprod \ "perm :: 'x prm \ ('a, 'b) nprod \ ('a, 'b) nprod" (unchecked) +begin + +definition + perm_fun_def: "perm_fun pi (f::'a\'b) \ (\x. pi\f((rev pi)\x))" + +fun + perm_bool :: "'x prm \ bool \ bool" +where + true_eqvt: "perm_bool pi True = True" +| false_eqvt: "perm_bool pi False = False" + +fun + perm_unit :: "'x prm \ unit \ unit" +where + "perm_unit pi () = ()" + +fun + perm_prod :: "'x prm \ ('a\'b) \ ('a\'b)" +where + "perm_prod pi (x,y) = (pi\x,pi\y)" + +fun + perm_list :: "'x prm \ 'a list \ 'a list" +where + nil_eqvt: "perm_list pi [] = []" +| cons_eqvt: "perm_list pi (x#xs) = (pi\x)#(pi\xs)" + +fun + perm_option :: "'x prm \ 'a option \ 'a option" +where + some_eqvt: "perm_option pi (Some x) = Some (pi\x)" +| none_eqvt: "perm_option pi None = None" + +definition + perm_char :: "'x prm \ char \ char" +where + perm_char_def: "perm_char pi c \ c" + +definition + perm_nat :: "'x prm \ nat \ nat" +where + perm_nat_def: "perm_nat pi i \ i" + +definition + perm_int :: "'x prm \ int \ int" +where + perm_int_def: "perm_int pi i \ i" + +fun + perm_noption :: "'x prm \ 'a noption \ 'a noption" +where + nsome_eqvt: "perm_noption pi (nSome x) = nSome (pi\x)" +| nnone_eqvt: "perm_noption pi nNone = nNone" + +fun + perm_nprod :: "'x prm \ ('a, 'b) nprod \ ('a, 'b) nprod" +where + "perm_nprod pi (nPair x y) = nPair (pi\x) (pi\y)" +end + + +(* permutations on booleans *) lemma perm_bool: shows "pi\(b::bool) = b" by (cases b) auto @@ -54,8 +127,7 @@ lemma if_eqvt: fixes pi::"'a prm" shows "pi\(if b then c1 else c2) = (if (pi\b) then (pi\c1) else (pi\c2))" -apply(simp add: perm_fun_def) -done + by (simp add: perm_fun_def) lemma imp_eqvt: shows "pi\(A\B) = ((pi\A)\(pi\B))" @@ -82,13 +154,7 @@ shows "(pi\(X\Y)) = (pi\X) \ (pi\Y)" by (simp add: perm_fun_def perm_bool Un_iff [unfolded mem_def] expand_fun_eq) -(* permutation on units and products *) -primrec (unchecked perm_unit) - "pi\() = ()" - -primrec (unchecked perm_prod) - "pi\(x,y) = (pi\x,pi\y)" - +(* permutations on products *) lemma fst_eqvt: "pi\(fst x) = fst (pi\x)" by (cases x) simp @@ -98,10 +164,6 @@ by (cases x) simp (* permutation on lists *) -primrec (unchecked perm_list) - nil_eqvt: "pi\[] = []" - cons_eqvt: "pi\(x#xs) = (pi\x)#(pi\xs)" - lemma append_eqvt: fixes pi :: "'x prm" and l1 :: "'a list" @@ -115,41 +177,12 @@ shows "pi\(rev l) = rev (pi\l)" by (induct l) (simp_all add: append_eqvt) -(* permutation on options *) - -primrec (unchecked perm_option) - some_eqvt: "pi\Some(x) = Some(pi\x)" - none_eqvt: "pi\None = None" - -(* a "private" copy of the option type used in the abstraction function *) -datatype 'a noption = nSome 'a | nNone - -primrec (unchecked perm_noption) - nSome_eqvt: "pi\nSome(x) = nSome(pi\x)" - nNone_eqvt: "pi\nNone = nNone" - -(* a "private" copy of the product type used in the nominal induct method *) -datatype ('a,'b) nprod = nPair 'a 'b - -primrec (unchecked perm_nprod) - perm_nProd_def: "pi\(nPair x1 x2) = nPair (pi\x1) (pi\x2)" - -(* permutation on characters (used in strings) *) -defs (unchecked overloaded) - perm_char_def: "pi\(c::char) \ c" - +(* permutation on characters and strings *) lemma perm_string: fixes s::"string" shows "pi\s = s" -by (induct s)(auto simp add: perm_char_def) - -(* permutation on ints *) -defs (unchecked overloaded) - perm_int_def: "pi\(i::int) \ i" - -(* permutation on nats *) -defs (unchecked overloaded) - perm_nat_def: "pi\(i::nat) \ i" + by (induct s)(auto simp add: perm_char_def) + section {* permutation equality *} (*==============================*) @@ -221,46 +254,38 @@ lemma supp_bool: fixes x :: "bool" - shows "supp (x) = {}" - apply(case_tac "x") - apply(simp_all add: supp_def) -done + shows "supp x = {}" + by (cases "x") (simp_all add: supp_def) lemma supp_some: fixes x :: "'a" shows "supp (Some x) = (supp x)" - apply(simp add: supp_def) - done + by (simp add: supp_def) lemma supp_none: fixes x :: "'a" shows "supp (None) = {}" - apply(simp add: supp_def) - done + by (simp add: supp_def) lemma supp_int: fixes i::"int" shows "supp (i) = {}" - apply(simp add: supp_def perm_int_def) - done + by (simp add: supp_def perm_int_def) lemma supp_nat: fixes n::"nat" - shows "supp (n) = {}" - apply(simp add: supp_def perm_nat_def) - done + shows "(supp n) = {}" + by (simp add: supp_def perm_nat_def) lemma supp_char: fixes c::"char" - shows "supp (c) = {}" - apply(simp add: supp_def perm_char_def) - done + shows "(supp c) = {}" + by (simp add: supp_def perm_char_def) lemma supp_string: fixes s::"string" - shows "supp (s) = {}" -apply(simp add: supp_def perm_string) -done + shows "(supp s) = {}" + by (simp add: supp_def perm_string) lemma fresh_set_empty: shows "a\{}" @@ -344,7 +369,6 @@ by (simp add: fresh_def supp_bool) text {* Normalization of freshness results; cf.\ @{text nominal_induct} *} - lemma fresh_unit_elim: shows "(a\() \ PROP C) \ PROP C" by (simp add: fresh_def supp_unit) @@ -393,7 +417,7 @@ lemma fresh_star_prod_list: fixes xs::"'a list" shows "xs\*(a,b) = (xs\*a \ xs\*b)" -by (auto simp add: fresh_star_def fresh_prod) + by (auto simp add: fresh_star_def fresh_prod) lemmas fresh_star_prod = fresh_star_prod_list fresh_star_prod_set