Theory Link_Algebra

section‹Link\_Algebra: Defining equivalence of tangles and links›

theory Link_Algebra
imports Tangles Tangle_Algebra Tangle_Moves
begin

inductive Tangle_Equivalence :: "wall ⇒ wall  ⇒ bool"   (infixl ‹~› 64)
where
  refl [intro!, Pure.intro!, simp]: " a ~  a"
 |equality [Pure.intro]: "linkrel a b ⟹  a ~ b"
 |domain_compose:"(domain_wall a = 0)∧(is_tangle_diagram a) ⟹  a ~  ((basic [])∘a)"
 |codomain_compose:"(codomain_wall a = 0) ∧ (is_tangle_diagram a) ⟹ a ~ (a ∘ (basic []))"
 |compose_eq:"((B::wall) ~ D) ∧ ((A::wall) ~ C)
         ∧(is_tangle_diagram A)∧(is_tangle_diagram B)
         ∧(is_tangle_diagram C)∧(is_tangle_diagram D) 
         ∧(domain_wall B)= (codomain_wall A)
         ∧(domain_wall D)= (codomain_wall C)
                ⟹((A::wall) ∘ B) ~ (C ∘ D)"
 |trans: "A~B ⟹ B~C ⟹ A ~ C"
 |sym:"A~ B ⟹ B ~A"
 |tensor_eq: "((B::wall) ~ D) ∧ ((A::wall) ~ C) ∧(is_tangle_diagram A)∧(is_tangle_diagram B)
 ∧(is_tangle_diagram C)∧(is_tangle_diagram D) ⟹((A::wall) ⊗ B) ~ (C ⊗ D)" 


inductive Framed_Tangle_Equivalence :: "wall ⇒ wall  ⇒ bool"   (infixl ‹~f› 64)
where
  refl [intro!, Pure.intro!, simp]: " a ~f  a"
 |equality [Pure.intro]: "framed_linkrel a b ⟹  a ~f b"
 |domain_compose:"(domain_wall a = 0) ∧ (is_tangle_diagram a) ⟹  a ~f  ((basic [])∘a)"
 |codomain_compose:"(codomain_wall a = 0) ∧ (is_tangle_diagram a) ⟹ a ~f (a ∘ (basic []))"
 |compose_eq:"((B::wall) ~f D) ∧ ((A::wall) ~f C)
         ∧(is_tangle_diagram A)∧(is_tangle_diagram B)
         ∧(is_tangle_diagram C)∧(is_tangle_diagram D) 
         ∧(domain_wall B)= (codomain_wall A)
         ∧(domain_wall D)= (codomain_wall C)
                ⟹((A::wall) ∘ B) ~f (C ∘ D)"
 |trans: "A~fB ⟹ B~fC ⟹ A ~f C"
 |sym:"A~f B ⟹ B ~fA"
 |tensor_eq: "((B::wall) ~f D) ∧ ((A::wall) ~f C) ∧(is_tangle_diagram A)∧(is_tangle_diagram B)
 ∧(is_tangle_diagram C)∧(is_tangle_diagram D) ⟹((A::wall) ⊗ B) ~f (C ⊗ D)" 


definition Tangle_Diagram_Equivalence::"Tangle_Diagram ⇒ Tangle_Diagram ⇒ bool" 
 (infixl ‹~T› 64)
where
"Tangle_Diagram_Equivalence T1 T2 ≡ 
(Rep_Tangle_Diagram T1) ~ (Rep_Tangle_Diagram T2)"

definition Link_Diagram_Equivalence::"Link_Diagram ⇒ Link_Diagram ⇒ bool" 
 (infixl ‹~L› 64)
where
"Link_Diagram_Equivalence T1 T2 ≡ (Rep_Link_Diagram T1) ~ (Rep_Link_Diagram T2)"

quotient_type Tangle = "Tangle_Diagram"/"Tangle_Diagram_Equivalence"
morphisms Rep_Tangles Abs_Tangles
proof (rule equivpI)
 show "reflp Tangle_Diagram_Equivalence" 
         unfolding reflp_def Tangle_Diagram_Equivalence_def 
         Tangle_Equivalence.refl 
         by auto
 show "symp Tangle_Diagram_Equivalence" 
         unfolding Tangle_Diagram_Equivalence_def symp_def
         using  Tangle_Diagram_Equivalence_def Tangle_Equivalence.sym 
         by auto
 show "transp Tangle_Diagram_Equivalence"
         unfolding Tangle_Diagram_Equivalence_def transp_def
         using  Tangle_Diagram_Equivalence_def Tangle_Equivalence.trans 
         by metis
qed

quotient_type Link = "Link_Diagram"/"Link_Diagram_Equivalence"
morphisms Rep_Links Abs_Links
proof (rule equivpI)
 show "reflp Link_Diagram_Equivalence" 
         unfolding reflp_def Link_Diagram_Equivalence_def 
         Tangle_Equivalence.refl 
         by auto
 show "symp Link_Diagram_Equivalence" 
         unfolding Link_Diagram_Equivalence_def symp_def
         using  Link_Diagram_Equivalence_def  Tangle_Equivalence.sym 
         by auto
 show "transp Link_Diagram_Equivalence"
         unfolding Link_Diagram_Equivalence_def transp_def
         using  Link_Diagram_Equivalence_def Tangle_Equivalence.trans 
         by metis
qed

definition Framed_Tangle_Diagram_Equivalence::"Tangle_Diagram ⇒ Tangle_Diagram ⇒ bool" 
 (infixl ‹~T› 64)
where
"Framed_Tangle_Diagram_Equivalence T1 T2 
          ≡ (Rep_Tangle_Diagram T1) ~ (Rep_Tangle_Diagram T2)"


definition Framed_Link_Diagram_Equivalence::"Link_Diagram ⇒ Link_Diagram ⇒ bool" 
 (infixl ‹~L› 64)
where
"Framed_Link_Diagram_Equivalence T1 T2 
       ≡ (Rep_Link_Diagram T1) ~ (Rep_Link_Diagram T2)"


quotient_type Framed_Tangle = "Tangle_Diagram"
               /"Framed_Tangle_Diagram_Equivalence"
morphisms Rep_Framed_Tangles Abs_Framed_Tangles
proof (rule equivpI)
 show "reflp Framed_Tangle_Diagram_Equivalence" 
         unfolding reflp_def Framed_Tangle_Diagram_Equivalence_def 
         Framed_Tangle_Equivalence.refl 
         by auto
 show "symp Framed_Tangle_Diagram_Equivalence" 
         unfolding Framed_Tangle_Diagram_Equivalence_def symp_def
         using  Framed_Tangle_Diagram_Equivalence_def 
          Framed_Tangle_Equivalence.sym 
         by (metis Tangle_Equivalence.sym)
 show "transp Framed_Tangle_Diagram_Equivalence"
         unfolding Framed_Tangle_Diagram_Equivalence_def transp_def
         using  Framed_Tangle_Diagram_Equivalence_def Framed_Tangle_Equivalence.trans 
         by (metis Tangle_Equivalence.trans)
qed

quotient_type Framed_Link = "Link_Diagram"/"Framed_Link_Diagram_Equivalence"
morphisms Rep_Framed_Links Abs_Framed_Links
proof (rule equivpI)
 show "reflp Framed_Link_Diagram_Equivalence" 
         unfolding reflp_def Framed_Link_Diagram_Equivalence_def 
         Framed_Tangle_Equivalence.refl 
         by auto
 show "symp Framed_Link_Diagram_Equivalence" 
         unfolding Framed_Link_Diagram_Equivalence_def symp_def
         using  Framed_Link_Diagram_Equivalence_def  Framed_Tangle_Equivalence.sym 
         by (metis Tangle_Equivalence.sym)
 show "transp Framed_Link_Diagram_Equivalence"
         unfolding Framed_Link_Diagram_Equivalence_def transp_def
         using  Framed_Link_Diagram_Equivalence_def Framed_Tangle_Equivalence.trans 
         by (metis Tangle_Equivalence.trans)
 qed

end