# HG changeset patch # User paulson # Date 1713905901 -3600 # Node ID cf11a7f0a5f0174f8caa3301e6b6241e83f36fac # Parent 378593bf510950032638c24528a96afe565c706d Tidying up another Nominal example (SOS) diff -r 378593bf5109 -r cf11a7f0a5f0 src/HOL/Nominal/Examples/SOS.thy --- a/src/HOL/Nominal/Examples/SOS.thy Tue Apr 23 10:26:04 2024 +0100 +++ b/src/HOL/Nominal/Examples/SOS.thy Tue Apr 23 21:58:21 2024 +0100 @@ -67,11 +67,7 @@ "\<(Var x)> = (lookup \ x)" | "\<(App e\<^sub>1 e\<^sub>2)> = App (\1>) (\2>)" | "x\\ \ \<(Lam [x].e)> = Lam [x].(\)" -apply(finite_guess)+ -apply(rule TrueI)+ -apply(simp add: abs_fresh)+ -apply(fresh_guess)+ -done + by (finite_guess | simp add: abs_fresh | fresh_guess)+ lemma psubst_eqvt[eqvt]: fixes pi::"name prm" @@ -357,24 +353,30 @@ lemma V_eqvt: fixes pi::"name prm" - assumes a: "x\V T" - shows "(pi\x)\V T" -using a -apply(nominal_induct T arbitrary: pi x rule: ty.strong_induct) -apply(auto simp add: trm.inject) -apply(simp add: eqvts) -apply(rule_tac x="pi\xa" in exI) -apply(rule_tac x="pi\e" in exI) -apply(simp) -apply(auto) -apply(drule_tac x="(rev pi)\v" in bspec) -apply(force) -apply(auto) -apply(rule_tac x="pi\v'" in exI) -apply(auto) -apply(drule_tac pi="pi" in big.eqvt) -apply(perm_simp add: eqvts) -done + assumes "x \ V T" + shows "(pi\x) \ V T" +using assms +proof (nominal_induct T arbitrary: pi x rule: ty.strong_induct) + case (TVar nat) + then show ?case + by (simp add: val.eqvt) +next + case (Arrow T\<^sub>1 T\<^sub>2 pi x) + obtain a e where ae: "x = Lam [a]. e" "\v\V T\<^sub>1. \v'. e[a::=v] \ v' \ v' \ V T\<^sub>2" + using Arrow.prems by auto + have "\v'. (pi \ e)[(pi \ a)::=v] \ v' \ v' \ V T\<^sub>2" if v: "v \ V T\<^sub>1" for v + proof - + have "rev pi \ v \ V T\<^sub>1" + by (simp add: Arrow.hyps(1) v) + then obtain v' where "e[a::=(rev pi \ v)] \ v'" "v' \ V T\<^sub>2" + using ae(2) by blast + then have "(pi \ e)[(pi \ a)::=v] \ pi \ v'" + by (metis (no_types, lifting) big.eqvt cons_eqvt nil_eqvt perm_pi_simp(1) perm_prod.simps psubst_eqvt) + then show ?thesis + using Arrow.hyps \v' \ V T\<^sub>2\ by blast + qed + with ae show ?case by force +qed lemma V_arrow_elim_weak: assumes h:"u \ V (T\<^sub>1 \ T\<^sub>2)" @@ -385,33 +387,28 @@ fixes c::"'a::fs_name" assumes h: "u \ V (T\<^sub>1 \ T\<^sub>2)" obtains a t where "a\c" "u = Lam [a].t" "\v \ (V T\<^sub>1). \ v'. t[a::=v] \ v' \ v' \ V T\<^sub>2" -using h -apply - -apply(erule V_arrow_elim_weak) -apply(subgoal_tac "\a'::name. a'\(a,t,c)") (*A*) -apply(erule exE) -apply(drule_tac x="a'" in meta_spec) -apply(drule_tac x="[(a,a')]\t" in meta_spec) -apply(drule meta_mp) -apply(simp) -apply(drule meta_mp) -apply(simp add: trm.inject alpha fresh_left fresh_prod calc_atm fresh_atm) -apply(perm_simp) -apply(force) -apply(drule meta_mp) -apply(rule ballI) -apply(drule_tac x="[(a,a')]\v" in bspec) -apply(simp add: V_eqvt) -apply(auto) -apply(rule_tac x="[(a,a')]\v'" in exI) -apply(auto) -apply(drule_tac pi="[(a,a')]" in big.eqvt) -apply(perm_simp add: eqvts calc_atm) -apply(simp add: V_eqvt) -(*A*) -apply(rule exists_fresh') -apply(simp add: fin_supp) -done +proof - + obtain a t where "u = Lam [a].t" + and at: "\v. v \ (V T\<^sub>1) \ \ v'. t[a::=v] \ v' \ v' \ V T\<^sub>2" + using V_arrow_elim_weak [OF assms] by metis + obtain a'::name where a': "a'\(a,t,c)" + by (meson exists_fresh fs_name_class.axioms) + then have "u = Lam [a'].([(a, a')] \ t)" + unfolding \u = Lam [a].t\ + by (smt (verit) alpha fresh_atm fresh_prod perm_swap trm.inject(2)) + moreover + have "\ v'. ([(a, a')] \ t)[a'::=v] \ v' \ v' \ V T\<^sub>2" if "v \ (V T\<^sub>1)" for v + proof - + obtain v' where v': "t[a::=([(a, a')] \ v)] \ v' \ v' \ V T\<^sub>2" + using V_eqvt \v \ V T\<^sub>1\ at by blast + then have "([(a, a')] \ t[a::=([(a, a')] \ v)]) \ [(a, a')] \ v'" + by (simp add: big.eqvt) + then show ?thesis + by (smt (verit) V_eqvt cons_eqvt nil_eqvt perm_prod.simps perm_swap(1) psubst_eqvt swap_simps(1) v') + qed + ultimately show thesis + by (metis fresh_prod that a') +qed lemma Vs_are_values: assumes a: "e \ V T"