lemma fail_then_empty: assumes"fail P1" shows"U P1 = {}" using assms proof(induct rule: fail.induct) case (fail_occur_abst X t pi a xs ys) let ?P = "(Susp pi X ≈? Abst a t # xs, ys)"
{ assume"U ((Susp pi X, Abst a t) # xs, ys) ≠ {}" thenobtain s nabla where eq1: "nabla ⊨ subst s (Susp pi X) ≈ Abst a (subst s t)" by (auto simp add: all_solutions_def) moreover have"occurs X t"by fact thenobtain t' pi' where
eq2: "nabla ⊨ subst s (Susp pi X) ≈ swap pi' t'""t'∈sub_trms (subst s t)" using occurs_sub_trm_equ by blast moreover have eq3: "¬ nabla ⊨ (Abst a (subst s t)) ≈ swap pi' t'" using eq2 psub_trm_not_equ by auto thenhave"False"using eq1 eq2 eq3 by (metis equ_symm equ_trans)
} thenshow"U ?P = {}"by auto next case (fail_occur_func X t pi F xs ys) let ?P = "(Susp pi X ≈? Func F t # xs, ys)"
{ assume"U ((Susp pi X, Func F t) # xs, ys) ≠ {}" thenobtain s nabla where eq1: "nabla ⊨ subst s (Susp pi X) ≈ Func F (subst s t)" by (auto simp add: all_solutions_def) moreover have"occurs X t"by fact thenobtain t' pi' where
eq2: "nabla ⊨ subst s (Susp pi X) ≈ swap pi' t'""t'∈sub_trms (subst s t)" using occurs_sub_trm_equ by blast moreover have eq3: "¬ nabla ⊨ (Func F (subst s t)) ≈ swap pi' t'" using eq2 psub_trm_not_equ by auto thenhave"False"using eq1 eq2 eq3 by (metis equ_symm equ_trans)
} thenshow"U ?P = {}"by auto next case (fail_occur_paar X t1 t2 pi xs ys) let ?P = "(Susp pi X ≈? Paar t1 t2 # xs, ys)" have"occurs X t1 ∨ occurs X t2"by fact thenshow"U ?P = {}" proof
{assume"occurs X t1"
{assume"U ((Susp pi X, Paar t1 t2) # xs, ys) ≠ {}" thenobtain s nabla where eq1: "nabla ⊨ subst s (Susp pi X) ≈ Paar (subst s t1) (subst s t2)" by (auto simp add: all_solutions_def) moreover have"occurs X t1"by fact thenobtain t' pi' where
eq2: "nabla ⊨ subst s (Susp pi X) ≈ swap pi' t'""t'∈sub_trms (subst s t1)" using occurs_sub_trm_equ by blast moreover have eq3: "¬ nabla ⊨ (Paar (subst s t1) (subst s t2)) ≈ swap pi' t'" using eq2 psub_trm_not_equ by auto thenhave"False"using eq1 eq2 eq3 by (metis equ_symm equ_trans)} thenshow"U ?P = {}"by auto}
{assume"occurs X t2"
{assume"U ((Susp pi X, Paar t1 t2) # xs, ys) ≠ {}" thenobtain s nabla where eq1: "nabla ⊨ subst s (Susp pi X) ≈ Paar (subst s t1) (subst s t2)" by (auto simp add: all_solutions_def) moreover have"occurs X t2"by fact thenobtain t' pi' where
eq2: "nabla ⊨ subst s (Susp pi X) ≈ swap pi' t'""t'∈sub_trms (subst s t2)" using occurs_sub_trm_equ by blast moreover have eq3: "¬ nabla ⊨ (Paar (subst s t1) (subst s t2)) ≈ swap pi' t'" using eq2 psub_trm_not_equ by auto thenhave"False"using eq1 eq2 eq3 by (metis equ_symm equ_trans)
} thenshow"U ?P = {}"by auto} qed next case (fail_fresh_atom a ys) let ?P = "([], a ♯? Atom a # ys)" have"∄ nabla s. nabla ⊨ a ♯ subst s (Atom a)" using subst_atom Fresh_elims(3) by auto thus"U ?P = {}" using all_solutions_def by simp next case (fail_diff_atoms a b xs ys) let ?P = "(Atom a ≈? Atom b # xs, ys)" from‹a ≠ b›have"∄ nabla s. nabla ⊨ subst s (Atom a) ≈ subst s (Atom b)" using Equ_elims(1) by auto thus"U ?P = {}" using all_solutions_def by simp next case (fail_abst_unit a t xs ys) let ?P = "(Abst a t ≈? Unit # xs, ys)" have"∄ nabla s. nabla ⊨ subst s (Abst a t) ≈ subst s Unit" by (auto elim: equ.cases) thus"U ?P = {}" using all_solutions_def by simp next case (fail_abst_atom a t b xs ys) let ?P = "(Abst a t ≈? Atom b # xs, ys)" have"∄ nabla s. nabla ⊨ subst s (Abst a t) ≈ subst s (Atom b)" by (auto elim: equ.cases) thus"U ?P = {}" using all_solutions_def by simp next case (fail_abst_paar a t t1 t2 xs ys) let ?P = "(Abst a t ≈? Paar t1 t2 # xs, ys)" have"∄ nabla s. nabla ⊨ subst s (Abst a t) ≈ subst s (Paar t1 t2)" by (auto elim: equ.cases) thus"U ?P = {}" using all_solutions_def by simp next case (fail_func_abst F t1 a t xs ys) let ?P = "(Func F t1 ≈? Abst a t # xs, ys)" have"∄ nabla s. nabla ⊨ subst s (Func F t1) ≈ subst s (Abst a t)" by (auto elim: equ.cases) thus"U ?P = {}" using all_solutions_def by simp next case (fail_atom_unit b xs ys) let ?P = "(Atom b ≈? Unit # xs, ys)" have"∄ nabla s. nabla ⊨ subst s (Atom b) ≈ subst s (Unit)" by (auto elim: equ.cases) thus"U ?P = {}" using all_solutions_def by simp next case (fail_paar_unit t1 t2 xs ys) let ?P = "(Paar t1 t2 ≈? Unit # xs, ys)" have"∄ nabla s. nabla ⊨ subst s (Paar t1 t2) ≈ subst s (Unit)" by (auto elim: equ.cases) thus"U ?P = {}" using all_solutions_def by simp next case (fail_func_unit F t1 xs ys) let ?P = "(Func F t1≈? Unit # xs, ys)" have"∄ nabla s. nabla ⊨ subst s (Func F t1) ≈ subst s (Unit)" by (auto elim: equ.cases) thus"U ?P = {}" using all_solutions_def by simp next case (fail_atom_paar b t1 t2 xs ys) let ?P = "(Atom b ≈? Paar t1 t2 # xs, ys)" have"∄ nabla s. nabla ⊨ subst s (Atom b) ≈ subst s (Paar t1 t2)" by (auto elim: equ.cases) thus"U ?P = {}" using all_solutions_def by simp next case (fail_func_atom F t1 b xs ys) let ?P = "(Func F t1 ≈? Atom b # xs, ys)" have"∄ nabla s. nabla ⊨ subst s (Func F t1) ≈ subst s (Atom b)" by (auto elim: equ.cases) thus"U ?P = {}" using all_solutions_def by simp next case (fail_func_paar F t t1 t2 xs ys) let ?P = "(Func F t ≈? Paar t1 t2 # xs, ys)" have"∄ nabla s. nabla ⊨ subst s (Func F t) ≈ subst s (Paar t1 t2)" by (auto elim: equ.cases) thus"U ?P = {}" using all_solutions_def by simp next case (fail_diff_func F1 F2 t1 t2 xs ys) let ?P = "(Func F1 t1 ≈? Func F2 t2 # xs, ys)" from‹F1 ≠ F2›have"∄ nabla s. nabla ⊨ subst s (Func F1 t1) ≈ subst s (Func F2 t2)" by (auto elim: equ.cases) thus"U ?P = {}" using all_solutions_def by simp next case (fail_sym s t xs ys) let ?P = "(t ≈? s # xs, ys)" have"fail ((s, t) # xs, ys)" "U ((s, t) # xs, ys) = {}"by fact+ thus"U ?P = {}" using all_solutions_def U_equ_symm by simp qed
(* the only stuck problems are the "failed" problems and the empty problem *)
lemma not_reduce_then_fail: assumes"¬ (∃nabla s P'. ((t1 ≈? t2) # xs, ys) ⊨ (nabla,s) ==> P')" shows"fail ((t1 ≈? t2) # xs, ys)" using assms proof(cases t1) case (Abst a t1') have t1_def: "t1 = Abst a t1'"by fact thenshow"fail ((t1, t2) # xs, ys)" proof(cases t2) case (Abst b t2') with t1_def have"((t1 ≈? t2)#xs,ys) ⊨[]↝ ((t1'≈?t2')#xs,ys) ∨ ((t1≈? t2)#xs,ys) ⊨[]↝ ((t1'≈?swap [(a,b)] t2')#xs,(a♯?t2')#ys)" using abst_aa_sred abst_ab_sred by (cases "a=b") auto hence"∃ P2. ((t1 ≈? t2)#xs,ys) ⊨({},[])==>P2" using sred_single by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp next case (Susp pi X) have t2_def: "t2 = Susp pi X"by fact with t1_def show"fail ((t1, t2) # xs, ys)" proof(cases "occurs X t1'") case True with t1_def t2_def show"fail ((t1, t2) # xs, ys)" using fail_sym[OF fail_occur_abst[OF True]] by simp next case False with t1_def have not_occurs: "¬ occurs X t1"by simp hence"((t1≈? Susp pi X)#xs,ys) ⊨[(X,swap (rev pi) t1)]↝ apply_subst [(X,swap (rev pi) t1)] (xs,ys)" using t1_def var_2_sred[OF not_occurs] by simp hence"∃ P2 s. ((t1 ≈? t2)#xs,ys) ⊨({},s)==>P2" using t1_def t2_def sred_single by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp qed qed (auto) next case (Susp pi X) have t1_def: "t1 = Susp pi X"by fact thenshow"fail ((t1, t2) # xs, ys)" proof(cases "occurs X t2") case True thenshow"fail ((t1, t2) # xs, ys)" proof(cases t2) case (Abst a t2') have t2_def: "t2 = Abst a t2'"by fact with True have"occurs X t2'"unfolding occurs.simps(4) t2_def by argo thus"fail ((t1, t2) # xs, ys)" using t1_def t2_def fail_occur_abst by simp next case (Susp pi' Y) have t2_def: "t2 = Susp pi' Y"by fact have"X = Y" using True unfolding t2_def occurs.simps(3) by argo hence"((Susp pi X≈?Susp pi' Y)#xs,ys) ⊨[]↝ (xs,(map (λa. a♯? Susp [] X) (ds_list pi pi'))@ys)" using susp_sred by simp hence"∃ P2. ((t1 ≈? t2)#xs,ys) ⊨({},[])==>P2" using sred_single t1_def t2_def by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp next case (Paar t21 t22) have t2_def: "t2 = Paar t21 t22"by fact with True have"occurs X t21 ∨ occurs X t22"unfolding occurs.simps(5) t2_def by argo thus"fail ((t1, t2) # xs, ys)" using t1_def t2_def fail_occur_paar by simp next case (Func f t2') have t2_def: "t2 = Func f t2'"by fact with True have"occurs X t2'"unfolding occurs.simps(6) t2_def by argo thus"fail ((t1, t2) # xs, ys)" using t1_def t2_def fail_occur_func by simp qed (auto simp add: True) next case False hence"((Susp pi X, t2) # xs, ys) ⊨ [(X, swap (rev pi) t2)] ↝ apply_subst [(X, swap (rev pi) t2)] (xs, ys)" using var_1_sred[OF False] by simp hence"∃ P2 s. ((t1 ≈? t2)#xs,ys) ⊨({},s)==>P2" using t1_def sred_single by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp qed next case Unit have t1_def: "t1 = Unit"by fact thenshow"fail ((t1, t2) # xs, ys)" proof(cases t2) case (Susp pi X) have t2_def: "t2 = Susp pi X"by fact with t1_def have not_occurs: "¬ occurs X t1"by simp hence"((t1≈? Susp pi X)#xs,ys) ⊨[(X,swap (rev pi) t1)]↝ apply_subst [(X,swap (rev pi) t1)] (xs,ys)" using t1_def var_2_sred[OF not_occurs] by simp hence"∃ P2 s. ((t1 ≈? t2)#xs,ys) ⊨({},s)==>P2" using t1_def t2_def sred_single by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp next case Unit with t1_def have"((t1 ≈? t2)#xs,ys) ⊨[]↝ (xs,ys)" using unit_sred by auto hence"∃ P2. ((t1 ≈? t2)#xs,ys) ⊨({},[])==>P2" using sred_single by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp qed (auto) next case (Atom a) have t1_def: "t1 = Atom a"by fact thenshow"fail ((t1, t2) # xs, ys)" proof(cases t2) case (Susp pi X) have t2_def: "t2 = Susp pi X"by fact with t1_def have not_occurs: "¬ occurs X t1"by simp hence"((t1≈? Susp pi X)#xs,ys) ⊨[(X,swap (rev pi) t1)]↝ apply_subst [(X,swap (rev pi) t1)] (xs,ys)" using t1_def var_2_sred[OF not_occurs] by simp hence"∃ P2 s. ((t1 ≈? t2)#xs,ys) ⊨({},s)==>P2" using t1_def t2_def sred_single by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp next case (Atom b) have t2_def: "t2 = Atom b"by fact thenshow"fail ((t1, t2) # xs, ys)" proof(cases "a=b") case True hence"((t1 ≈? t2)#xs,ys) ⊨[]↝ (xs,ys)" using t2_def t1_def atom_sred by simp hence"∃ P2. ((t1 ≈? t2)#xs,ys) ⊨({},[])==>P2" using sred_single by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp qed (simp add: t1_def t2_def fail_diff_atoms) qed(auto) next case (Paar t11 t12) have t1_def: "t1 = Paar t11 t12"by fact thenshow"fail ((t1, t2) # xs, ys)" proof(cases t2) next case (Susp pi X) have t2_def: "t2 = Susp pi X"by fact thenshow"fail ((t1, t2) # xs, ys)" proof(cases "occurs X t11 ∨ occurs X t12") case True thenshow"fail ((t1, t2) # xs, ys)" using t1_def t2_def fail_sym[OF fail_occur_paar[OF True]] by simp next case False hence"¬ occurs X t1" using t1_def by simp hence"((t1≈?Susp pi X)#xs,ys) ⊨[(X,swap (rev pi) t1)]↝ apply_subst [(X,swap (rev pi) t1)] (xs,ys)" by auto hence"∃ P2 s. ((t1 ≈? t2)#xs,ys) ⊨({},s)==>P2" using t1_def t2_def sred_single by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp qed next case (Paar t21 t22) have t2_def: "t2 = Paar t21 t22"by fact with t1_def have "((t1 ≈? t2)#xs,ys) ⊨[]↝ ((t11≈?t21)#(t12≈?t22)#xs,ys)" using paar_sred by simp hence"∃ P2. ((t1 ≈? t2)#xs,ys) ⊨({},[])==>P2" using sred_single by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp qed(auto) next case (Func f t1') have t1_def: "t1 = Func f t1'"by fact thenshow"fail ((t1, t2) # xs, ys)" proof(cases t2) case (Susp pi X) have t2_def: "t2 = Susp pi X"by fact with t1_def show"fail ((t1, t2) # xs, ys)" proof(cases "occurs X t1'") case True with t1_def t2_def show"fail ((t1, t2) # xs, ys)" using fail_sym[OF fail_occur_func[OF True]] by simp next case False with t1_def have not_occurs: "¬ occurs X t1"by simp hence"((t1≈? Susp pi X)#xs,ys) ⊨[(X,swap (rev pi) t1)]↝ apply_subst [(X,swap (rev pi) t1)] (xs,ys)" using t1_def var_2_sred[OF not_occurs] by simp hence"∃ P2 s. ((t1 ≈? t2)#xs,ys) ⊨({},s)==>P2" using t1_def t2_def sred_single by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp qed next case (Func g t2') have t2_def: "t2 = Func g t2'"by fact thenshow"fail ((t1, t2) # xs, ys)" proof(cases "f=g") case True hence"((t1 ≈? t2)#xs,ys) ⊨[]↝ ((t1'≈?t2')#xs,ys)" using t1_def t2_def func_sred by simp hence"∃ P2. ((t1 ≈? t2)#xs,ys) ⊨({},[])==>P2" using sred_single by blast thus"fail ((t1, t2) # xs, ys)" using assms by simp next case False thenshow"fail ((t1, t2) # xs, ys)" using t1_def t2_def fail_diff_func[OF False] by simp qed qed(auto) qed
lemma fresh_reduces_if_not_atom: assumes"t ≠ Atom a" shows"∃P2 nabla s. ([], (a ♯? t) # xs) ⊨ (nabla,s) ==> P2" using assms cred_single proof(cases t) case (Abst b t') thenshow"∃P2 nabla s. ([], (a ♯? t) # xs) ⊨ (nabla, s) ==> P2" proof(cases "a=b") case True hence"([], (a ♯? t) # xs) ⊨{}→ ([],xs)" unfolding Abst using abst_aa_cred by simp thenshow"∃P2 nabla s. ([], (a ♯? t) # xs) ⊨ (nabla, s) ==> P2" using cred_single by blast next case False hence"([], (a ♯? t) # xs) ⊨{}→ ([], (a♯? t') # xs)" unfolding Abst using abst_ab_cred by simp thenshow"∃P2 nabla s. ([], (a ♯? t) # xs) ⊨ (nabla, s) ==> P2" using cred_single by blast qed next case (Atom b) with assms have"a ≠ b"by simp hence"([], (a ♯? t) # xs) ⊨ {}→ ([],xs)" unfolding Atom using atom_cred by simp thenshow"∃P2 nabla s. ([], (a ♯? t) # xs) ⊨ (nabla, s) ==> P2" using cred_single by blast qed (simp add: cred_single, blast+)
lemma empty_stuck: shows"([],[]) ∈ stuck" proof- have"¬ (∃P2 nabla s. ([],[]) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thus"([],[]) ∈ stuck" unfolding stuck_def by auto qed
lemma fail_is_stuck: assumes"fail P" shows"P ∈ stuck" using assms proof(induct rule: fail.induct) case (fail_occur_abst X t pi a xs ys) have t_occurs: "occurs X t"by fact moreoverhave"¬ (∃P2 nabla s. ((Susp pi X ≈? Abst a t) # xs, ys) ⊨ (nabla,s) ==>P2)" proof assume"∃P2 nabla s. ((Susp pi X ≈? Abst a t) # xs, ys) ⊨ (nabla,s) ==> P2" thenobtain P2 nabla s where
red: "((Susp pi X ≈? Abst a t) # xs, ys) ⊨ (nabla,s) ==> P2" by auto thus False proof (cases rule: red_plus.cases) case sred_single have"((Susp pi X, Abst a t) # xs, ys) ⊨ s ↝ P2"by fact hence"¬ occurs X t" by (auto elim: s_red.cases) with t_occurs show False by simp next case cred_single have"((Susp pi X, Abst a t) # xs, ys) ⊨ nabla → P2"by fact moreoverhave"fst ((Susp pi X, Abst a t) # xs, ys) ≠ []" by simp ultimatelyshow False using c_red_eqs_empty by blast next case (sred_step s1 P3 s2) have"((Susp pi X, Abst a t) # xs, ys) ⊨ s1 ↝ P3"by fact hence"¬ occurs X t" by (auto elim: s_red.cases) with t_occurs show False by simp next case (cred_step nabla1 P3 nabla2) have"((Susp pi X, Abst a t) # xs, ys) ⊨ nabla1 → P3"by fact moreoverhave"fst ((Susp pi X, Abst a t) # xs, ys) ≠ []" by simp ultimatelyshow False using c_red_eqs_empty by blast qed qed thenshow"((Susp pi X, Abst a t) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_occur_func X t pi F xs ys) have t_occurs: "occurs X t"by fact moreoverhave"¬ (∃P2 nabla s. ((Susp pi X ≈? Func F t) # xs, ys) ⊨ (nabla,s) ==>P2)" proof assume"∃P2 nabla s. ((Susp pi X ≈? Func F t) # xs, ys) ⊨ (nabla,s) ==> P2" thenobtain P2 nabla s where
red: "((Susp pi X ≈? Func F t) # xs, ys) ⊨ (nabla,s) ==> P2" by auto thus False proof (cases rule: red_plus.cases) case sred_single have"((Susp pi X, Func F t) # xs, ys) ⊨ s ↝ P2"by fact hence"¬ occurs X t" by (auto elim: s_red.cases) with t_occurs show False by simp next case cred_single have"((Susp pi X, Func F t) # xs, ys) ⊨ nabla → P2"by fact moreoverhave"fst ((Susp pi X, Func F t) # xs, ys) ≠ []" by simp ultimatelyshow False using c_red_eqs_empty by blast next case (sred_step s1 P3 s2) have"((Susp pi X, Func F t) # xs, ys) ⊨ s1 ↝ P3"by fact hence"¬ occurs X t" by (auto elim: s_red.cases) with t_occurs show False by simp next case (cred_step nabla1 P3 nabla2) have"((Susp pi X, Func F t) # xs, ys) ⊨ nabla1 → P3"by fact moreoverhave"fst ((Susp pi X, Func F t) # xs, ys) ≠ []" by simp ultimatelyshow False using c_red_eqs_empty by blast qed qed thenshow"((Susp pi X, Func F t) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_occur_paar X t1 t2 pi xs ys) have"occurs X t1 ∨ occurs X t2"by fact hence t_occurs: "occurs X (Paar t1 t2)" using occurs.simps(5) by auto moreoverhave"¬ (∃P2 nabla s. ((Susp pi X ≈? Paar t1 t2) # xs, ys) ⊨ (nabla,s) ==> P2)" proof assume"∃P2 nabla s. ((Susp pi X ≈? Paar t1 t2) # xs, ys) ⊨ (nabla,s) ==> P2" thenobtain P2 nabla s where
red: "((Susp pi X ≈? Paar t1 t2) # xs, ys) ⊨ (nabla,s) ==> P2" by auto thus False proof (cases rule: red_plus.cases) case sred_single have"((Susp pi X, Paar t1 t2) # xs, ys) ⊨ s ↝ P2"by fact hence"¬ occurs X (Paar t1 t2)" by (auto elim: s_red.cases) with t_occurs show False by simp next case cred_single have"((Susp pi X, Paar t1 t2) # xs, ys) ⊨ nabla → P2"by fact moreoverhave"fst ((Susp pi X, Paar t1 t2) # xs, ys) ≠ []" by simp ultimatelyshow False using c_red_eqs_empty by blast next case (sred_step s1 P3 s2) have"((Susp pi X, Paar t1 t2) # xs, ys) ⊨ s1 ↝ P3"by fact hence"¬ occurs X (Paar t1 t2)" by (auto elim: s_red.cases) with t_occurs show False by simp next case (cred_step nabla1 P3 nabla2) have"((Susp pi X, Paar t1 t2) # xs, ys) ⊨ nabla1 → P3"by fact moreoverhave"fst ((Susp pi X, Paar t1 t2) # xs, ys) ≠ []" by simp ultimatelyshow False using c_red_eqs_empty by blast qed qed thenshow"((Susp pi X, Paar t1 t2) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_fresh_atom a ys) have"¬ (∃P2 nabla s. ([], (a, Atom a) # ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"([], (a, Atom a) # ys) ∈ stuck" unfolding stuck_def by simp next case (fail_diff_atoms a b xs ys) hence"¬ (∃P2 nabla s. ((Atom a, Atom b) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Atom a, Atom b) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_abst_unit a t xs ys) hence"¬ (∃P2 nabla s. ((Abst a t, Unit) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Abst a t, Unit) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_abst_atom a t b xs ys) hence"¬ (∃P2 nabla s. ((Abst a t, Atom b) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Abst a t, Atom b) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_abst_paar a t t1 t2 xs ys) hence"¬ (∃P2 nabla s. ((Abst a t, Paar t1 t2) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Abst a t, Paar t1 t2) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_func_abst F t1 a t xs ys) hence"¬ (∃P2 nabla s. ((Func F t1, Abst a t) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Func F t1, Abst a t) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_atom_unit b xs ys) hence"¬ (∃P2 nabla s. ((Atom b, Unit) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Atom b, Unit) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_paar_unit t1 t2 xs ys) hence"¬ (∃P2 nabla s. ((Paar t1 t2, Unit) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Paar t1 t2, Unit) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_func_unit F t1 xs ys) hence"¬ (∃P2 nabla s. ((Func F t1, Unit) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Func F t1, Unit) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_atom_paar a t1 t2 xs ys) hence"¬ (∃P2 nabla s. ((Atom a, Paar t1 t2) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Atom a, Paar t1 t2) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_func_atom F t1 a xs ys) hence"¬ (∃P2 nabla s. ((Func F t1, Atom a) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Func F t1, Atom a) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_func_paar F t t1 t2 xs ys) hence"¬ (∃P2 nabla s. ((Func F t, Paar t1 t2) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Func F t, Paar t1 t2) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_diff_func F1 F2 t1 t2 xs ys) hence"¬ (∃P2 nabla s. ((Func F1 t1, Func F2 t2) # xs, ys) ⊨ (nabla,s) ==> P2)" by (auto elim: red_plus.cases s_red.cases c_red.cases) thenshow"((Func F1 t1, Func F2 t2) # xs, ys) ∈ stuck" unfolding stuck_def by simp next case (fail_sym s t xs ys) hence not_reduce: "∄ P2 nabla s1. ((s, t) # xs, ys) ⊨ (nabla, s1) ==> P2" unfolding stuck_def by simp have"∄ P2 nabla s1. ((t, s) # xs, ys) ⊨ (nabla, s1) ==> P2" proof assume"∃P2 nabla s1. ((t, s) # xs, ys) ⊨ (nabla, s1) ==> P2" thenobtain P2 nabla s1 where
reduces: "((t, s) # xs, ys) ⊨ (nabla, s1) ==> P2" by auto hence"∃ P3 nabla1 s2. ((s, t) # xs, ys) ⊨ (nabla1, s2) ==> P3" using red_plus_symm[of ‹((t, s) # xs, ys)› t s xs ys nabla s1 P2] by auto with not_reduce show False by simp qed thenshow"((t, s) # xs, ys) ∈ stuck"unfolding stuck_def by simp qed
lemma stuck_equiv: shows"stuck = {([],[])} ∪ {P1. fail P1}" proof (rule set_eqI, rule iffI) fix P
{assume P_is_stuck: "P ∈ stuck" thenobtain eqs freshs where
P_def: "P = (eqs, freshs)"by (cases P) show"P ∈ {([], [])} ∪ {P1. fail P1}" proof(cases eqs) case Nil thenshow"P ∈ {([], [])} ∪ {P1. fail P1}" proof(cases freshs) case Nil with‹eqs = []› show"P ∈ {([], [])} ∪ {P1. fail P1}"using P_def by simp next case (Cons c freshs') thenobtain a t where c_def: "c = a ♯? t"by force have"t = Atom a" using fresh_reduces_if_not_atom P_is_stuck unfolding stuck_def P_def Nil Cons c_def by blast hence"fail P" unfolding P_def Nil Cons c_def using fail_fresh_atom by simp thus"P ∈ {([], [])} ∪ {P1. fail P1}"by auto qed next case(Cons e eqs') thenobtain s t where e_def: "e = s ≈? t"by force have"fail P" using P_is_stuck unfolding P_def Cons e_def
stuck_def using not_reduce_then_fail by simp thus"P ∈ {([], [])} ∪ {P1. fail P1}"by auto qed }
{assume"P ∈ {([], [])} ∪ {P1. fail P1}" thenshow"P ∈ stuck" using empty_stuck fail_is_stuck by blast
} qed
(*if reduces to a non-solvable problem, then it is non-solvable *)
lemma u_empty_sred: assumes"P1⊨s↝P2"and"U P2 ={}" shows"U P1 = {}" using assms P1_from_P2_sred all_solutions_def P1_to_P2_sred by blast
lemma u_empty_cred: assumes"P1⊨nabla→P2"and"U P2 ={}" shows"U P1={}" using assms P1_from_P2_cred all_solutions_def P1_to_P2_cred by blast
lemma u_empty_red_plus: assumes"P1⊨(nabla,s)==>P2"and"U P2 ={}" shows"U P1={}" using assms P1_from_P2_red_plus all_solutions_def P1_to_P2_red_plus1 by fast
(* all problems that cannot be solved produce "failed" problems only *)
lemma empty_then_fail: assumes"U P1={}" shows" (∀P ∈ normal_form P1. fail P)" proof fix P assume P_is_nf: "P ∈ normal_form P1" hence P_is_stuck: "P ∈ stuck" using normal_form_def by (cases "P1 ∈ stuck") auto hence P_is_empty_or_fails: "P = ([],[]) ∨ fail P" using stuck_equiv by auto have"P ≠ ([],[])" proof assume P_empty: "P = ([],[])" hence solution: "({},[]) ∈ U P" using all_solutions_def by simp hence P_neq: "P ≠ P1" using assms by auto show False proof(cases "P1∈ stuck") case True thenhave"normal_form P1 = {P1}" unfolding normal_form_def by simp with P_is_nf have"P = P1"by simp with P_neq show False by simp next case False with P_is_nf obtain nabla s where P1_goes_to_P: "P1 ⊨ (nabla, s) ==> P" unfolding normal_form_def by auto hence"({} ∪ nabla, [] ∙ s) ∈ U P1" using P1_from_P2_red_plus[OF P1_goes_to_P solution ext_subst_id] by simp with assms show False by simp qed qed thus"fail P" using P_is_empty_or_fails by simp qed
(* if a problem can be solved then no "failed" problem is produced *)
lemma not_empty_then_not_fail: assumes"U P1≠{}" shows"¬(∃P∈ normal_form P1. fail P)" proof(simp, rule ballI) fix P assume P_is_nf: "P ∈ normal_form P1" show"¬ fail P" proof assume P_fails: "fail P" show False proof(cases "P1∈ stuck") case True have"normal_form P1 = {P1}" unfolding normal_form_def using True by simp hence"P = P1"using P_is_nf by simp with P_fails have"U P1 = {}" using fail_then_empty by simp thus False using assms by simp next case False with P_is_nf obtain nabla s where P1_goes_to_P: "P1 ⊨ (nabla, s) ==> P" unfolding normal_form_def by auto moreoverhave"U P = {}" using P_fails fail_then_empty by simp ultimatelyhave"U P1 = {}" using u_empty_red_plus by simp thenshow False using assms by simp qed qed qed
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.