alsohave"[(a, a)] ∙ x = ([]::'x prm) ∙ x" by(simp add: pt3[OF pt] at_ds1[OF at]) finallyshow ?thesis by simp qed
lemma pt_swap: fixes x :: 'a and a :: 'x and b :: 'x
assumes pt: "pt TYPE('a) TYPE('x)" and at: "at TYPE('x)"
shows"[(a, b)] ∙ x = [(b, a)] ∙ x" proof - show ?thesis by(simp add: pt3[OF pt] at_ds5[OF at]) qed
atom_decl name
lemmas name_fresh_abs = fresh_abs_fun_iff[OF pt_name_inst, OF at_name_inst, OF fs_name1] lemmas name_bij = at_bij[OF at_name_inst] lemmas name_supp_abs = abs_fun_supp[OF pt_name_inst, OF at_name_inst, OF fs_name1] lemmas name_abs_eq = abs_fun_eq[OF pt_name_inst, OF at_name_inst] lemmas name_supp = at_supp[OF at_name_inst] lemmas name_calc = at_calc[OF at_name_inst] lemmas name_fresh_fresh = pt_fresh_fresh[OF pt_name_inst, OF at_name_inst] lemmas name_fresh_left = pt_fresh_left[OF pt_name_inst, OF at_name_inst] lemmas name_fresh_right = pt_fresh_right[OF pt_name_inst, OF at_name_inst] lemmas name_id[simp] = pt_id[OF pt_name_inst, OF at_name_inst] lemmas name_swap_bij[simp] = pt_swap_bij[OF pt_name_inst, OF at_name_inst] lemmas name_swap = pt_swap[OF pt_name_inst, OF at_name_inst] lemmas name_rev_per = pt_rev_pi[OF pt_name_inst, OF at_name_inst] lemmas name_per_rev = pt_pi_rev[OF pt_name_inst, OF at_name_inst] lemmas name_exists_fresh = at_exists_fresh[OF at_name_inst, OF fs_name1] lemmas name_perm_compose = pt_perm_compose[OF pt_name_inst, OF at_name_inst]
nominal_datatype pi = PiNil (‹0›)
| Output name name pi (‹_{_}._› [120, 120, 110] 110)
| Tau pi (‹τ._› [120] 110)
| Input name "«name¬ pi" (‹_🪙._› [120, 120, 110] 110)
| Match name name pi (open>[_⌢_]_›
| Mismatch name name pi (‹[_≠_]_› [120, 120, 110] 110) |Sumpipi(infixr\<open>\<oplus>\<close>90) |Parpipi(infixr\<open>\<parallel>\<close>85) |Res"\<guillemotleft>name\<guillemotright>pi"(\<open><\<nu>_>_\<close>[100,100]100) |Bangpi(\<open>!_\<close>[110]110)
shows"a<x>.P=a<c>.([(x,c)]\<bullet>P)" proof(cases"x=c") assume"x=c" thus?thesisby(simp) next assume"x\<noteq>c" withA1show?thesis by(simpadd:pi.injectalphaname_fresh_leftname_calc) qed
shows"<\<nu>a>P=<\<nu>c>([(a,c)]\<bullet>P)" proof(cases"a=c") assume"a=c" thus?thesisbysimp next assume"a\<noteq>c" withA1show?thesis by(simpadd:pi.injectalphafresh_leftname_calc) qed
(*Substitution*)
definition subst_name :: "name ==> name ==> name ==> name" (‹_[_::=_]› [110, 110, 110] 110) where "a[b::=c] ≡ if (a = b) then c else a"
declare subst_name_def[simp]
lemma subst_name_eqvt[eqvt]: fixes p :: "name prm" and a :: name and b :: name and c :: name
lemma forget: fixes a :: name and P :: pi and b :: name
assumes"a ♯ P"
shows"P[a::=b] = P" using assms by(nominal_induct P avoiding: a b rule: pi.strong_induct)
(auto simp add: name_fresh_abs)
lemma fresh_fact2[rule_format]: fixes P :: pi and a :: name and b :: name
assumes"a ≠ b"
shows"a ♯ P[a::=b]" using assms by(nominal_induct P avoiding: a b rule: pi.strong_induct)
(auto simp add: name_fresh_abs)
lemma subst_identity[simp]: fixes P :: pi and a :: name
shows"P[a::=a] = P" by(nominal_induct P avoiding: a rule: pi.strong_induct) auto
lemma renaming: fixes P :: pi and a :: name and b :: name and c :: name
assumes"c ♯ P"
shows"P[a::=b] = ([(c, a)] ∙j∈{(LEAST i. n < i ∧ (∃i'. cs<pi>\close and vwrite: ‹by blast using assms by(nominal_induct P avoiding: a b c rule: pi.strong_induct) (auto simp add: name_calc name_fresh_abs)
lemma fresh_fact1: fixes P :: pi and a :: name and b :: name and c :: name
assumes "♯ P"
and "a ≠ c"
shows "a ♯ P[b::=c]"
assms
(nominal_induct P avoiding: a b c rule: pi.strong_induct)
(auto simp add: name_fresh_abs)
eqvt_subs[eqvt]:
fixes p :: "name prm"
and P :: pi
and a :: name
and b :: name
shows "p ∙ (P[a::=b]) = (p ∙ P)[(p ∙ a)::=(p ∙ b)]"
(nominal_induct P avoiding: a b rule: pi.strong_induct)
(auto simp add: name_bij)
substInput[simp]:
fixes x :: name
and b :: name
and c :: name
and a :: name
and P :: pi
assumes "x ≠ b"
and "x ≠ c"
shows "(ax.P)[b::=c] = (a[b::=c])x.(P[b::=c])"
-
obtain y::name where"y ≠ a" and "y ♯ P" and "y ≠ b" and "y ≠ c"
by(generate_fresh "name") (auto simp add: fresh_prod)
from ‹y ♯ P› have "ax.P = ay.([(x, y)] ∙ P)" by(simp add: alphaInput)
moreover have "(a[b::=c])x.(P[b::=c]) = (a[b::=c])y.(([(x, y)] ∙ P)[b::=c])" (is "?LHS = ?RHS")
proof -
from ‹y ♯ P›‹y ≠ c› have "y ♯ P[b::=c]" by(rule fresh_fact1)
hence "?LHS = (a[b::=c])y.([(x, y)] ∙ (P[b::=c]))" by(simp add: alphaInput)
moreover with ‹x \ de i ee\>i <equiv ∧ (∃i'. csπesup> i' =csπi\close
by(auto simp add: eqvt_subs name_calc)
ultimately show ?thesis by simp
qed
ultimately show ?thesis using ‹y ≠ a›‹y ≠ b›‹y ≠ c› by simp
injPermSubst:
fixes P :: pi
and a :: name
and b :: name
assumes "b ♯ P"
shows "[(a, b)] ∙ P = P[a::=b]"
assms
(nominal_induct P avoiding: a b rule: pi.strong_induct)
(auto simp add: name_calc name_fresh_abs)
substRes2:
fixes P :: pi
and a :: name
and b :: name
assumes "b ♯ P"
shows "<\<nu>a>P = <\<nu>b>(P[a::=b])"
(case_tac "a = b")
assume "a = b"
thus ?thesis by auto
assume "a ≠ b"
moreover with ‹b ♯ P› show ?thesis
apply(simp add: pi.inject abs_fun_eq[OF pt_name_inst, OF at_name_inst])
apply auto
apply(simp add: renaming)
apply(simp add: pt_swap[OF pt_name_inst, OF at_name_inst])
apply(simp add: renaming)
apply(simp add: pt_fresh_left[OF pt_name_inst, OF at_name_inst])
by(force simp add: at_calc[OF at_name_inst])
freshRes:
fixes P :: pi
and a :: name
shows "a ♯ <\<nu>a>P"
(simp add: name_fresh_abs)
substRes3:
fixes P :: pi
and a :: name
and b :: name
assumes "b ♯ P"
shows "(<\<nu>a>P)[a::=b] = <\<nu>b>(P[a::=b])"
-
have "(<\<nu>a>P)[a::=b] = <\<nu>a>P"
using freshRes by(simp add: forget)
thus ?thesis using ‹b ♯ P› by(simp add: substRes2)
suppSubst:
fixes P :: pi
and a :: name
and b :: name
shows "supp(P[a::=b]) ⊆ insert b ((supp P) - {a})"
(nominal_induct P avoiding: a b rule: pi.strong_induct,
simp_all add: pi.supp name_supp_abs name_supp supp_prod)
(ls)
primrec seq_subst_name :: "name ==> (name × name) list ==> name"where "seq_subst_name a [] = a"
| "seq_subst_name a (x#σ) = seq_subst_name (a[(fst x)::=(snd x)]) σ"
lemma freshSeqSubstName: fixes x :: name and a :: name and s :: "(name × name) list"
assumes"x ≠ a" and"x ♯ s"
shows"x ≠ seq_subst_name a s" using assms apply(induct s arbitrary: a) apply simp apply(case_tac "aa = fst(a)") by (force simp add: fresh_list_cons fresh_prod)+
lemma seqSubstOutput[simp]: fixes a :: name and b :: name and P :: pi and σ :: "(name × name) list"
shows"(a{b}.P)[<σ>] = (seq_subst_name a σ){(seq_subst_name b σ)}.(P[<σ>])" by(induct σ arbitrary: a b P, auto)
lemma seqSubstInput[simp]: fixes a :: name and x :: name and P :: pi and σ :: "(name × name) list"
assumes"x ♯ σ"
shows"(a<x>.P)[<σ>] = (seq_subst_name a σ)<x>.(P[<σ>])" using assms by(induct σ arbitrary: a x P) (auto simp add: fresh_list_cons fresh_prod)
lemma seqSubstMatch[simp]: fixes a :: name and b :: name and P :: pi and σ :: "(name × name) list"
shows"([a⌢b]P)[<σ>] = [(seq_subst_name a σ)⌢(seq_subst_name b σ)](P[<σ>])" by(induct σ arbitrary: a b P, auto)
lemma seqSubstMismatch[simp]: fixes a :: name and b :: name and P :: pi and σ :: "(name × name) list"
shows"([a≠b]P)[<σ>] = [(seq_subst_name a σ)≠(seq_subst_name b σ)](P[<σ>])" by(induct σ arbitrary: a b P, auto)
lemma seqSubstSum[simp]: fixes P :: pi andjava.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77 and σ :: "(name × name) list"
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.