src/HOL/Nominal/Nominal.thy
changeset 19107 b16a45c53884
parent 19045 75786c2eb897
child 19132 ff41946e5092
equal deleted inserted replaced
19106:6e6b5b1fdc06 19107:b16a45c53884
   451   and   b :: "'x"
   451   and   b :: "'x"
   452   assumes at: "at TYPE('x)"
   452   assumes at: "at TYPE('x)"
   453   shows "(a\<sharp>b) = (a\<noteq>b)" 
   453   shows "(a\<sharp>b) = (a\<noteq>b)" 
   454   by (simp add: at_supp[OF at] fresh_def)
   454   by (simp add: at_supp[OF at] fresh_def)
   455 
   455 
   456 lemma at_prm_fresh[rule_format]:
   456 lemma at_prm_fresh:
   457   fixes c :: "'x"
   457   fixes c :: "'x"
   458   and   pi:: "'x prm"
   458   and   pi:: "'x prm"
   459   assumes at: "at TYPE('x)"
   459   assumes at: "at TYPE('x)"
   460   shows "c\<sharp>pi \<longrightarrow> pi\<bullet>c = c"
   460   and     a: "c\<sharp>pi" 
       
   461   shows "pi\<bullet>c = c"
       
   462 using a
   461 apply(induct pi)
   463 apply(induct pi)
   462 apply(simp add: at1[OF at]) 
   464 apply(simp add: at1[OF at]) 
   463 apply(force simp add: fresh_list_cons at2[OF at] fresh_prod at_fresh[OF at] at3[OF at])
   465 apply(force simp add: fresh_list_cons at2[OF at] fresh_prod at_fresh[OF at] at3[OF at])
   464 done
   466 done
   465 
   467 
   466 lemma at_prm_rev_eq:
   468 lemma at_prm_rev_eq:
   467   fixes pi1 :: "'x prm"
   469   fixes pi1 :: "'x prm"
   468   and   pi2 :: "'x prm"
   470   and   pi2 :: "'x prm"
   469   assumes at: "at TYPE('x)"
   471   assumes at: "at TYPE('x)"
   470   shows a: "((rev pi1) \<triangleq> (rev pi2)) = (pi1 \<triangleq> pi2)"
   472   shows "((rev pi1) \<triangleq> (rev pi2)) = (pi1 \<triangleq> pi2)"
   471 proof (simp add: prm_eq_def, auto)
   473 proof (simp add: prm_eq_def, auto)
   472   fix x
   474   fix x
   473   assume "\<forall>x::'x. (rev pi1)\<bullet>x = (rev pi2)\<bullet>x"
   475   assume "\<forall>x::'x. (rev pi1)\<bullet>x = (rev pi2)\<bullet>x"
   474   hence "(rev (pi1::'x prm))\<bullet>(pi2\<bullet>(x::'x)) = (rev (pi2::'x prm))\<bullet>(pi2\<bullet>x)" by simp
   476   hence "(rev (pi1::'x prm))\<bullet>(pi2\<bullet>(x::'x)) = (rev (pi2::'x prm))\<bullet>(pi2\<bullet>x)" by simp
   475   hence "(rev (pi1::'x prm))\<bullet>((pi2::'x prm)\<bullet>x) = (x::'x)" by (simp add: at_rev_pi[OF at])
   477   hence "(rev (pi1::'x prm))\<bullet>((pi2::'x prm)\<bullet>x) = (x::'x)" by (simp add: at_rev_pi[OF at])
   481   hence "(pi1::'x prm)\<bullet>((rev pi2)\<bullet>x) = (pi2::'x prm)\<bullet>((rev pi2)\<bullet>(x::'x))" by simp
   483   hence "(pi1::'x prm)\<bullet>((rev pi2)\<bullet>x) = (pi2::'x prm)\<bullet>((rev pi2)\<bullet>(x::'x))" by simp
   482   hence "(pi1::'x prm)\<bullet>((rev pi2)\<bullet>(x::'x)) = x" by (simp add: at_pi_rev[OF at])
   484   hence "(pi1::'x prm)\<bullet>((rev pi2)\<bullet>(x::'x)) = x" by (simp add: at_pi_rev[OF at])
   483   hence "(rev pi2)\<bullet>x = (rev pi1)\<bullet>(x::'x)" by (simp add: at_bij1[OF at])
   485   hence "(rev pi2)\<bullet>x = (rev pi1)\<bullet>(x::'x)" by (simp add: at_bij1[OF at])
   484   thus "(rev pi1)\<bullet>x = (rev pi2)\<bullet>(x::'x)" by simp
   486   thus "(rev pi1)\<bullet>x = (rev pi2)\<bullet>(x::'x)" by simp
   485 qed
   487 qed
       
   488 
       
   489 lemma at_prm_eq_append:
       
   490   fixes pi1 :: "'x prm"
       
   491   and   pi2 :: "'x prm"
       
   492   and   pi3 :: "'x prm"
       
   493   assumes at: "at TYPE('x)"
       
   494   and     a: "pi1 \<triangleq> pi2"
       
   495   shows "(pi3@pi1) \<triangleq> (pi3@pi2)"
       
   496 using a by (simp add: prm_eq_def at_append[OF at] at_bij[OF at])
       
   497 
       
   498 lemma at_prm_eq_trans:
       
   499   fixes pi1 :: "'x prm"
       
   500   and   pi2 :: "'x prm"
       
   501   and   pi3 :: "'x prm"
       
   502   assumes a1: "pi1 \<triangleq> pi2"
       
   503   and     a2: "pi2 \<triangleq> pi3"  
       
   504   shows "pi1 \<triangleq> pi3"
       
   505 using a1 a2 by (auto simp add: prm_eq_def)
   486   
   506   
       
   507 lemma at_prm_eq_refl:
       
   508   fixes pi :: "'x prm"
       
   509   shows "pi \<triangleq> pi"
       
   510 by (simp add: prm_eq_def)
       
   511 
   487 lemma at_prm_rev_eq1:
   512 lemma at_prm_rev_eq1:
   488   fixes pi1 :: "'x prm"
   513   fixes pi1 :: "'x prm"
   489   and   pi2 :: "'x prm"
   514   and   pi2 :: "'x prm"
   490   assumes at: "at TYPE('x)"
   515   assumes at: "at TYPE('x)"
   491   shows "pi1 \<triangleq> pi2 \<Longrightarrow> (rev pi1) \<triangleq> (rev pi2)"
   516   shows "pi1 \<triangleq> pi2 \<Longrightarrow> (rev pi1) \<triangleq> (rev pi2)"
   500 lemma at_ds2: 
   525 lemma at_ds2: 
   501   fixes pi :: "'x prm"
   526   fixes pi :: "'x prm"
   502   and   a  :: "'x"
   527   and   a  :: "'x"
   503   and   b  :: "'x"
   528   and   b  :: "'x"
   504   assumes at: "at TYPE('x)"
   529   assumes at: "at TYPE('x)"
   505   shows "(pi@[((rev pi)\<bullet>a,(rev pi)\<bullet>b)]) \<triangleq> ([(a,b)]@pi)"
   530   shows "([(a,b)]@pi) \<triangleq> (pi@[((rev pi)\<bullet>a,(rev pi)\<bullet>b)])"
   506   by (force simp add: prm_eq_def at_append[OF at] at_bij[OF at] at_pi_rev[OF at] 
   531   by (force simp add: prm_eq_def at_append[OF at] at_bij[OF at] at_pi_rev[OF at] 
   507       at_rev_pi[OF at] at_calc[OF at])
   532       at_rev_pi[OF at] at_calc[OF at])
   508 
   533 
   509 lemma at_ds3: 
   534 lemma at_ds3: 
   510   fixes a  :: "'x"
   535   fixes a  :: "'x"
   589 apply(drule_tac x="swap(pi1\<bullet>a,pi1\<bullet>b) aa" in spec)
   614 apply(drule_tac x="swap(pi1\<bullet>a,pi1\<bullet>b) aa" in spec)
   590 apply(drule sym)
   615 apply(drule sym)
   591 apply(simp)
   616 apply(simp)
   592 apply(simp add: at_ds8_aux[OF at])
   617 apply(simp add: at_ds8_aux[OF at])
   593 apply(simp add: at_rev_pi[OF at])
   618 apply(simp add: at_rev_pi[OF at])
       
   619 done
       
   620 
       
   621 lemma at_ds10:
       
   622   fixes pi1 :: "'x prm"
       
   623   and   pi2 :: "'x prm"
       
   624   and   a  :: "'x"
       
   625   and   b  :: "'x"
       
   626   assumes at: "at TYPE('x)"
       
   627   and     a:  "b\<sharp>(rev pi1)"
       
   628   shows "(pi2@([(pi1\<bullet>a,b)]@pi1)) \<triangleq> (pi2@(pi1@[(a,b)]))"
       
   629 using a
       
   630 apply -
       
   631 apply(rule at_prm_eq_append[OF at])
       
   632 apply(rule at_prm_eq_trans)
       
   633 apply(rule at_ds2[OF at])
       
   634 apply(simp add: at_prm_fresh[OF at] at_rev_pi[OF at])
       
   635 apply(rule at_prm_eq_refl)
   594 done
   636 done
   595 
   637 
   596 --"there always exists an atom not being in a finite set"
   638 --"there always exists an atom not being in a finite set"
   597 lemma ex_in_inf:
   639 lemma ex_in_inf:
   598   fixes   A::"'x set"
   640   fixes   A::"'x set"