Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Atoms.thy 0100644 0001750 0000144 00000002151 07660505272 011450 0 ustar cu200 users
theory Atoms = Main + Swap + Terms:
consts atms :: "(string \ string) list \ string set"
primrec
"atms [] = {}"
"atms (x#xs) = (atms xs) \ {fst(x),snd(x)}"
lemma [simp]:
"atms (xs@ys) = atms xs \ atms ys"
apply(induct_tac xs, auto)
done
lemma [simp]:
"atms (rev pi) = atms pi"
apply(induct_tac pi, simp_all)
done
lemma a_not_in_atms:
"a\atms pi \ a = swapas pi a"
apply(induct_tac pi, auto)
done
lemma swapas_pi_ineq_a: "swapas pi a \ a \ a\atms pi" and
a_ineq_swapas_pi: "a \ swapas pi a \ a\atms pi"
(* swapas_pi_ineq_a *)
apply(case_tac "a\atms pi")
apply(simp)+
apply(drule a_not_in_atms[THEN mp])
apply(simp)
(* a_ineq_swapas_pi *)
apply(case_tac "a\atms pi")
apply(simp_all add: a_not_in_atms)
done
lemma swapas_pi_in_atms[THEN mp]:
"a\atms pi \ swapas pi a\atms pi"
apply(subgoal_tac "\pi1. (a\atms pi1) \ swapas pi a\(atms pi1 \ atms pi)") (* A *)
apply(force)
(* A *)
apply(induct_tac pi)
apply(auto)
done
end Disagreement.thy 0100644 0001750 0000144 00000007476 07660505307 013012 0 ustar cu200 users
theory Disagreement = Main + Swap + Atoms:
consts
ds :: "(string \ string) list \ (string \ string) list \ string set"
defs
ds_def: "ds xs ys \ { a . a \ (atms xs \ atms ys) \ (swapas xs a \ swapas ys a) }"
lemma
ds_elem: "\swapas pi a\a\\a\ds [] pi"
apply(simp add: ds_def)
apply(auto simp add: swapas_pi_ineq_a)
done
lemma
elem_ds: "\a\ds [] pi\\a\swapas pi a"
apply(simp add: ds_def)
done
lemma
ds_sym: "ds pi1 pi2 = ds pi2 pi1"
apply(simp only: ds_def)
apply(auto)
done
lemma
ds_trans: "c\ds pi1 pi3\(c\ds pi1 pi2 \ c\ds pi2 pi3)"
apply(auto)
apply(simp only: ds_def)
apply(auto)
apply(drule a_not_in_atms[THEN mp])+
apply(simp)
apply(drule a_not_in_atms[THEN mp])
apply(simp)
apply(drule swapas_pi_ineq_a[THEN mp])
apply(assumption)
done
lemma ds_cancel_pi_left:
"(c\ ds (pi1@pi) (pi2@pi)) \ (swapas pi c\ ds pi1 pi2)"
apply(simp only: ds_def)
apply(auto)
apply(simp_all add: swapas_append)
apply(rule a_ineq_swapas_pi[THEN mp], clarify, drule a_not_in_atms[THEN mp], simp)+
done
lemma ds_cancel_pi_right:
"(swapas pi c\ ds pi1 pi2) \ (c\ ds (pi1@pi) (pi2@pi))"
apply(simp only: ds_def)
apply(auto)
apply(simp_all add: swapas_append)
apply(rule a_ineq_swapas_pi[THEN mp],clarify,
drule a_not_in_atms[THEN mp],drule a_not_in_atms[THEN mp],simp)+
done
lemma ds_equality:
"(ds [] pi)-{a,swapas pi a} = (ds [] ((a,swapas pi a)#pi))-{swapas pi a}"
apply(simp only: ds_def)
apply(auto)
done
lemma ds_7:
"\b\ swapas pi b;a\ds [] ((b,swapas pi b)#pi)\\a\ds [] pi"
apply(simp only: ds_def)
apply(case_tac "b=a")
apply(auto)
apply(rule swapas_pi_in_atms)
apply(drule a_ineq_swapas_pi[THEN mp])
apply(assumption)
apply(drule sym)
apply(drule swapas_rev_pi_a)
apply(simp)
apply(case_tac "swapas pi b = a")
apply(auto)
apply(drule sym)
apply(drule swapas_rev_pi_a)
apply(simp)
done
lemma ds_cancel_pi_front:
"ds (pi@pi1) (pi@pi2) = ds pi1 pi2"
apply(simp only: ds_def)
apply(auto)
apply(simp_all add: swapas_append)
apply(rule swapas_pi_ineq_a[THEN mp], clarify, drule a_not_in_atms[THEN mp], simp)+
apply(drule swapas_rev_pi_a, simp)+
done
lemma ds_rev_pi_pi:
"ds ((rev pi1)@pi1) pi2 = ds [] pi2"
apply(simp only: ds_def)
apply(auto)
apply(simp_all add: swapas_append)
apply(drule a_ineq_swapas_pi[THEN mp], assumption)+
done
lemma ds_rev:
"ds [] ((rev pi1)@pi2) = ds pi1 pi2"
apply(subgoal_tac "ds pi1 pi2 = ds ((rev pi1)@pi1) ((rev pi1)@pi2)")
apply(simp add: ds_rev_pi_pi)
apply(simp only: ds_cancel_pi_front)
done
lemma ds_acabbc:
"\a\b;b\c;c\a\\ds [] [(a, c), (a, b), (b, c)] = {a, b}"
apply(simp only: ds_def)
apply(auto)
done
lemma ds_baab:
"\a\b\\ds [] [(b, a), (a, b)] = {}"
apply(simp only: ds_def)
apply(auto)
done
lemma ds_abab:
"\a\b\\ds [] [(a, b), (a, b)] = {}"
apply(simp only: ds_def)
apply(auto)
done
(* disagreement set as list *)
consts flatten :: "(string \ string)list \ string list"
primrec
"flatten [] = []"
"flatten (x#xs) = (fst x)#(snd x)#(flatten xs)"
consts ds_list :: "(string \ string)list \ (string \ string)list \ string list"
defs ds_list_def: "ds_list pi1 pi2 \ remdups ([x:(flatten (pi1@pi2)). x\ds pi1 pi2])"
lemma set_flatten_eq_atms:
"set (flatten pi) = atms pi"
apply(induct_tac pi)
apply(auto)
done
lemma ds_list_equ_ds:
"set (ds_list pi1 pi2) = ds pi1 pi2"
apply(auto)
apply(simp add: ds_list_def)
apply(simp add: ds_list_def)
apply(simp add: set_flatten_eq_atms)
apply(simp add: ds_def)
done
end Equ.thy 0100644 0001750 0000144 00000012033 07660505332 011114 0 ustar cu200 users
theory Equ = Main + Terms + Fresh + PreEqu:
lemma equ_refl:
"nabla\t\t"
apply(induct_tac t)
apply(auto simp add: ds_def)
done
lemma
equ_sym: "nabla\t1\t2 \ nabla\t2\t1" and
equ_trans: "\nabla\t1\t2;nabla\t2\t3\ \ nabla\t1\t3" and
equ_add_pi: "nabla\t1\t2 \ nabla\swap pi t1\swap pi t2"
apply(insert big)
apply(best)+
done
lemma equ_dec_pi:
"nabla\swap pi t1\swap pi t2\nabla\t1\t2"
apply(drule_tac pi="(rev pi)" in equ_add_pi)
apply(subgoal_tac "nabla\swap (rev pi) (swap pi t2)\t2")
apply(drule_tac "t1.0"="swap (rev pi) (swap pi t1)" and
"t2.0"="swap (rev pi) (swap pi t2)" and
"t3.0"="t2" in equ_trans)
apply(assumption)
apply(subgoal_tac "nabla\t1\swap (rev pi) (swap pi t1)")
apply(drule_tac "t1.0"="t1" and
"t2.0"="swap (rev pi) (swap pi t1)" and
"t3.0"="t2" in equ_trans)
apply(assumption)+
apply(rule equ_sym)
apply(rule rev_pi_pi_equ)
apply(rule rev_pi_pi_equ)
done
lemma equ_involutive_left:
"nabla\swap (rev pi) (swap pi t1)\t2 = nabla\t1\t2"
apply(auto)
apply(subgoal_tac "nabla \ t1\ swap (rev pi) (swap pi t1)")
apply(drule_tac "t2.0"="swap (rev pi) (swap pi t1)" and
"t1.0"="t1" and "t3.0"="t2" in equ_trans)
apply(assumption)+
apply(rule equ_sym)
apply(rule rev_pi_pi_equ)
apply(subgoal_tac "nabla \ swap (rev pi) (swap pi t1)\t1")
apply(drule_tac "t1.0"="swap (rev pi) (swap pi t1)" and
"t2.0"="t1" and "t3.0"="t2" in equ_trans)
apply(assumption)+
apply(rule rev_pi_pi_equ)
done
lemma equ_pi_to_left:
"nabla\swap (rev pi) t1\t2 = nabla\t1\ swap pi t2"
apply(auto)
apply(rule_tac pi="rev pi" in equ_dec_pi)
apply(rule equ_sym)
apply(simp only: equ_involutive_left)
apply(rule equ_sym)
apply(assumption)
apply(drule_tac pi="rev pi" in equ_add_pi)
apply(drule equ_sym)
apply(simp only: equ_involutive_left)
apply(drule equ_sym)
apply(assumption)
done
lemma equ_pi_to_right:
"nabla\t1\swap (rev pi) t2 = nabla\swap pi t1\t2"
apply(auto)
apply(rule_tac pi="rev pi" in equ_dec_pi)
apply(simp only: equ_involutive_left)
apply(drule_tac pi="rev pi" in equ_add_pi)
apply(simp only: equ_involutive_left)
done
lemma equ_involutive_right:
"nabla\t1\swap (rev pi) (swap pi t2) = nabla\t1\t2"
apply(simp only: swap_append[THEN sym])
apply(simp only: equ_pi_to_left[THEN sym])
apply(simp)
apply(simp only: swap_append)
apply(simp only: equ_involutive_left)
done
lemma equ_pi1_pi2_add:
"(\a\ ds pi1 pi2. nabla\a\t)\(nabla\swap pi1 t \ swap pi2 t)"
apply(simp only: equ_pi_to_right[THEN sym])
apply(simp only: swap_append[THEN sym])
apply(rule equ_pi_right[THEN spec, THEN mp])
apply(auto)
apply(simp only: ds_rev)
done
lemma pi_right_equ: "(nabla\t \ swap pi t)\(\a\ ds [] pi. nabla\a\t)"
apply(insert pi_right_equ_help)
apply(best)
done
lemma equ_pi1_pi2_dec:
"(nabla\swap pi1 t \ swap pi2 t)\(\a\ ds pi1 pi2. nabla\a\t)"
apply(simp only: equ_pi_to_right[THEN sym])
apply(simp only: swap_append[THEN sym])
apply(drule pi_right_equ[THEN mp])
apply(simp only: ds_rev)
done
lemma equ_weak:
"nabla1\t1\t2\(nabla1\nabla2)\t1\t2"
apply(rule impI)
apply(erule equ.induct)
apply(auto simp add: fresh_weak)
done
(* no term can be equal to one of its proper subterm *)
lemma psub_trm_not_equ:
"\nabla t1. \ t2\psub_trms t1. (\(\ pi. (nabla\t1\swap pi t2)))"
apply(rule allI)+
apply(induct_tac t1)
apply(auto)
(* Abst *)
apply(simp add: equ_pi_to_left[THEN sym])
apply(ind_cases "nabla \ Abst (swapas (rev pi) list) (swap (rev pi) trm) \ t2")
apply(simp_all)
apply(drule abst_psub_trms)
apply(drule_tac x="t2a" in bspec)
apply(assumption)
apply(simp add: equ_pi_to_left[THEN sym] swap_append[THEN sym])
apply(drule_tac x="rev (((swapas (rev pi) list, b) # rev pi))" in spec)
apply(simp)
apply(force dest!: abst_psub_trms)
(* Paar *)
apply(simp add: equ_pi_to_left[THEN sym])
apply(ind_cases "nabla \ Paar (swap (rev pi) trm1) (swap (rev pi) trm2) \ t2")
apply(force dest!: paar_psub_trms)
apply(simp add: equ_pi_to_left[THEN sym])
apply(ind_cases "nabla \ Paar (swap (rev pi) trm1) (swap (rev pi) trm2) \ t2")
apply(force dest!: paar_psub_trms)
(* Func *)
apply(simp add: equ_pi_to_left[THEN sym])
apply(ind_cases "nabla \ Func list (swap (rev pi) trm) \ t2")
apply(force dest!: func_psub_trms)
done
end
Fresh.thy 0100644 0001750 0000144 00000006516 07660505316 011444 0 ustar cu200 users
theory Fresh = Main + Swap + Terms + Disagreement:
types fresh_envs = "(string \ string)set"
consts
fresh :: "(fresh_envs \ string \ trm) set"
syntax
"_fresh_judge" :: "fresh_envs \ string \ trm \ bool" (" _ \ _ \ _" [80,80,80] 80)
translations
"nabla \ a \ t" \ "(nabla,a,t) \ fresh"
inductive fresh
intros
fresh_abst_ab[intro!]: "\(nabla\a\t); a\b\ \ (nabla\a\Abst b t)"
fresh_abst_aa[intro!]: "(nabla\a\Abst a t)"
fresh_unit[intro!]: "(nabla\a\Unit)"
fresh_atom[intro!]: "a\b \ (nabla\a\Atom b)"
fresh_susp[intro!]: "(swapas (rev pi) a,X)\nabla \ (nabla\a\Susp pi X)"
fresh_paar[intro!]: "\(nabla\a\t1);(nabla\a\t2)\ \ (nabla\a\Paar t1 t2)"
fresh_func[intro!]: "(nabla\a\t) \ (nabla\a\Func F t)"
lemma fresh_atom_elim[elim!]: "(nabla\a\Atom b) \ a\b"
apply(ind_cases "(nabla \a\Atom b)")
apply(assumption)
done
lemma fresh_susp_elim[elim!]: "(nabla\a\Susp pi X) \ (swapas (rev pi) a,X)\nabla"
apply(ind_cases "(nabla\a\Susp pi X)")
apply(assumption)
done
lemma fresh_paar_elim[elim!]: "(nabla\a\Paar t1 t2) \ (nabla\a\t1)\(nabla \a\t2)"
apply(ind_cases "(nabla\a\Paar t1 t2)")
apply(force)
done
lemma fresh_func_elim[elim!]: "(nabla\a\Func F t) \ (nabla\a\t)"
apply(ind_cases "nabla\a\Func F t")
apply(assumption)
done
lemma fresh_abst_ab_elim[elim!]: "\nabla\a\Abst b t;a\b\ \ (nabla\a\