Theory Linkrel_Kauffman
section‹Tangle moves and Kauffman bracket›
theory Linkrel_Kauffman
imports Computations
begin
lemma mat1_vert_wall_left:
assumes "is_tangle_diagram b"
shows
"rat_poly.matrix_mult (blockmat (make_vert_block (nat (domain_wall b)))) (kauff_mat b)
= (kauff_mat b)"
proof-
have "mat (2^(nat (domain_wall b))) (length (kauff_mat b)) (kauff_mat b)"
by (metis assms matrix_kauff_mat)
moreover have "(blockmat (make_vert_block (nat (domain_wall b))))
= mat1 (2^(nat (domain_wall b)))"
using make_vert_block_map_blockmat by auto
ultimately show ?thesis by (metis blockmat_make_vert mat1_mult_left prop_make_vert_equiv(1))
qed
lemma mat1_vert_wall_right:
assumes "is_tangle_diagram b"
shows
"rat_poly.matrix_mult (kauff_mat b) (blockmat (make_vert_block (nat (codomain_wall b))))
= (kauff_mat b)"
proof-
have "mat (rat_poly.row_length (kauff_mat b)) (2^(nat (codomain_wall b))) (kauff_mat b)"
by (metis assms matrix_kauff_mat)
moreover have "(blockmat (make_vert_block (nat (codomain_wall b))))
= mat1 (2^(nat (codomain_wall b)))"
using make_vert_block_map_blockmat by auto
ultimately show ?thesis by (metis mat1_rt_mult)
qed
lemma compress_top_inv:"(compress_top w1 w2) ⟹ kauff_mat w1 = kauff_mat w2"
proof-
assume assm:"compress_top w1 w2"
have " ∃B.((w1 = (basic (make_vert_block (nat (domain_wall B))))∘ B)
∧(w2 = (B ∘ (basic ([]))))∧(codomain_wall B = 0)
∧(is_tangle_diagram B))"
using compress_top_def assm by auto
then obtain B where "(w1 = (basic (make_vert_block (nat (domain_wall B))))∘ B)
∧(w2 = (B ∘ (basic ([]))))∧(codomain_wall B = 0)∧(is_tangle_diagram B)"
by auto
then have 1:"(w1 = (basic (make_vert_block (nat (domain_wall B))))∘ B)
∧(w2 = (B ∘ (basic ([]))))∧(codomain_wall B = 0)∧(is_tangle_diagram B)"
by auto
then have "kauff_mat(w1) = (kauff_mat ((basic (make_vert_block (nat (domain_wall B))))∘ B))"
by auto
moreover then have "... = kauff_mat ((make_vert_block (nat (domain_wall B)))*B)"
by auto
moreover then have "... = rat_poly.matrix_mult (blockmat (make_vert_block (nat (domain_wall B))))
(kauff_mat B)"
by auto
moreover then have "... = (kauff_mat B)"
using 1 mat1_vert_wall_left by (metis)
ultimately have "kauff_mat(w1) = kauff_mat B"
by auto
moreover have "kauff_mat w2 = kauff_mat B"
using 1 by (metis left_mat_compose)
ultimately show ?thesis by auto
qed
lemma domain_make_vert_int:"(n ≥ 0) ⟹ (domain_block (make_vert_block (nat n)))
= n"
using domain_make_vert by auto
lemma compress_bottom_inv:"(compress_bottom w1 w2) ⟹ kauff_mat w1 = kauff_mat w2"
proof-
assume assm:"compress_bottom w1 w2"
have "∃B.((w1 = B ∘ (basic (make_vert_block (nat (codomain_wall B)))))
∧(w2 = ((basic ([]) ∘ B)))∧(domain_wall B = 0)
∧(is_tangle_diagram B))"
using compress_bottom_def assm by auto
then obtain B where "((w1 = B ∘ (basic (make_vert_block (nat (codomain_wall B)))))
∧(w2 = ((basic ([]) ∘ B)))∧(domain_wall B = 0)
∧(is_tangle_diagram B))"
by auto
then have 1:"((w1 = B ∘ (basic (make_vert_block (nat (codomain_wall B)))))
∧(w2 = ((basic ([]) ∘ B)))∧(domain_wall B = 0)
∧(is_tangle_diagram B))"
by auto
then have "kauff_mat(w1) = (kauff_mat ( B ∘ (basic (make_vert_block (nat (codomain_wall B))))))"
by auto
moreover then have "... = rat_poly.matrix_mult (kauff_mat B)
(kauff_mat (basic (make_vert_block (nat (codomain_wall B)))))"
proof-
have "is_tangle_diagram B"
using 1 by auto
moreover have "is_tangle_diagram (basic (make_vert_block (nat (codomain_wall B))))"
using is_tangle_diagram.simps by auto
moreover have "codomain_wall B = domain_wall (basic (make_vert_block (nat (codomain_wall B))))"
proof-
have "codomain_wall B ≥ 0"
apply (induct B)
by (auto) (metis codomain_block_nonnegative)
then have "domain_block (make_vert_block (nat (codomain_wall B)))
= codomain_wall B"
using domain_make_vert_int by auto
then show ?thesis unfolding domain_wall.simps(1) by auto
qed
ultimately show ?thesis using tangle_compose_matrix by auto
qed
moreover then have "... = rat_poly.matrix_mult (kauff_mat B)
(blockmat (make_vert_block (nat (codomain_wall B))))"
using kauff_mat.simps(1) tangle_compose_matrix by auto
moreover then have "... = (kauff_mat B)"
using 1 mat1_vert_wall_right by auto
ultimately have "kauff_mat(w1) = kauff_mat B"
by auto
moreover have "kauff_mat w2 = kauff_mat B"
using 1 by (metis right_mat_compose)
ultimately show ?thesis by auto
qed
theorem compress_inv:"compress w1 w2 ⟹ (kauff_mat w1 = kauff_mat w2)"
unfolding compress_def using compress_bottom_inv compress_top_inv
by auto
lemma striaghten_topdown_computation:"kauff_mat ((basic ([vert,cup]))∘(basic ([cap,vert])))
= kauff_mat ((basic ([vert]))∘(basic ([vert])))"
apply(simp add:kauff_mat_def)
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
apply (auto simp add:inverse1 inverse2)
done
theorem straighten_topdown_inv:"straighten_topdown w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding straighten_topdown_def using striaghten_topdown_computation by auto
lemma striaghten_downtop_computation:"kauff_mat ((basic ([cup,vert]))∘(basic ([vert,cap])))
= kauff_mat ((basic ([vert]))∘(basic ([vert])))"
apply(simp add:kauff_mat_def)
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
apply (auto simp add:inverse1 inverse2)
done
theorem straighten_downtop_inv:"straighten_downtop w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding straighten_downtop_def using striaghten_downtop_computation by auto
theorem straighten_inv:"straighten w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding straighten_def using straighten_topdown_inv straighten_downtop_inv by auto
lemma kauff_mat_swingpos:
"kauff_mat (r_over_braid) = kauff_mat (l_over_braid)"
apply (simp)
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
apply(auto simp add:computation_swingpos)
done
lemma swing_pos_inv:"swing_pos w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding swing_pos_def using kauff_mat_swingpos by auto
lemma kauff_mat_swingneg:
"kauff_mat (r_under_braid) = kauff_mat (l_under_braid)"
apply (simp)
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
apply(auto simp add:computation_swingneg)
done
lemma swing_neg_inv:"swing_neg w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding swing_neg_def using kauff_mat_swingneg by auto
theorem swing_inv:
"swing w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding swing_def using swing_pos_inv swing_neg_inv by auto
lemma rotate_toppos_kauff_mat:"kauff_mat ((basic [vert,over])∘(basic [cap, vert]))
= kauff_mat ((basic [under,vert])∘(basic [vert,cap]))"
apply (simp)
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
apply(simp add:computation_toppos)
done
lemma rotate_toppos_inv:"rotate_toppos w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding rotate_toppos_def using rotate_toppos_kauff_mat by auto
lemma rotate_topneg_kauff_mat:"kauff_mat ((basic [vert,under])∘(basic [cap, vert]))
= kauff_mat ((basic [over,vert])∘(basic [vert,cap]))"
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
apply(simp add:computation_toppos)
done
lemma rotate_topneg_inv:"rotate_topneg w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding rotate_topneg_def using rotate_topneg_kauff_mat by auto
lemma rotate_downpos_kauff_mat:
"kauff_mat ((basic [cup,vert])∘(basic [vert,over]))= kauff_mat ((basic [vert,cup])∘(basic [under,vert]))"
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
apply(simp add:computation_downpos)
done
lemma rotate_downpos_inv:"rotate_downpos w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding rotate_downpos_def using rotate_downpos_kauff_mat by auto
lemma rotate_downneg_kauff_mat:
"kauff_mat ((basic [cup,vert])∘(basic [vert,under]))= kauff_mat ((basic [vert,cup])∘(basic [over,vert]))"
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
apply(simp add:computation_downpos)
done
lemma rotate_downneg_inv:"rotate_downneg w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding rotate_downneg_def using rotate_downneg_kauff_mat by auto
theorem rotate_inv:"rotate w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding rotate_def using rotate_downneg_inv rotate_downpos_inv rotate_topneg_inv
rotate_toppos_inv by auto
lemma positive_flip_kauff_mat:
"kauff_mat (left_over) = kauff_mat (right_over)"
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
using computatition_positive_flip apply auto[1]
using computatition_positive_flip by auto
lemma uncross_positive_flip_inv: "uncross_positive_flip w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding uncross_positive_flip_def using positive_flip_kauff_mat by auto
lemma negative_flip_kauff_mat: "kauff_mat (left_under) = kauff_mat (right_under)"
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
using computation_negative_flip apply auto
done
lemma uncross_negative_flip_inv: "uncross_negative_flip w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding uncross_negative_flip_def using negative_flip_kauff_mat by auto
theorem framed_uncross_inv:"(framed_uncross w1 w2) ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding framed_uncross_def using uncross_negative_flip_inv uncross_positive_flip_inv
by auto
lemma pos_neg_kauff_mat:
"kauff_mat ((basic [over]) ∘ (basic [under]))
= kauff_mat ((basic [vert,vert]) ∘ (basic [vert,vert])) "
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
apply(auto simp add:inverse1 inverse2)
apply(auto simp add:computation_pull_pos_neg)
done
lemma pull_posneg_inv: "pull_posneg w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding pull_posneg_def using pos_neg_kauff_mat by auto
lemma neg_pos_kauff_mat:"kauff_mat ((basic [under]) ∘ (basic [over]))
= kauff_mat ((basic [vert,vert]) ∘ (basic [vert,vert])) "
apply(simp add:mat_multI_def)
apply(simp add:matT_vec_multI_def)
apply(auto simp add:replicate_def rat_poly.row_length_def)
apply(auto simp add:scalar_prod)
apply(auto simp add:inverse1 inverse2)
using computation_pull_pos_neg by (simp add: computation_downpos)
lemma pull_negpos_inv:"pull_negpos w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding pull_negpos_def using neg_pos_kauff_mat by auto
theorem pull_inv:"pull w1 w2 ⟹ (kauff_mat w1) = (kauff_mat w2)"
unfolding pull_def using pull_posneg_inv pull_negpos_inv by auto
theorem slide_inv:"slide w1 w2 ⟹ (kauff_mat w1 = kauff_mat w2)"
proof-
assume assm:"slide w1 w2"
have " ∃B.((w1 = ((basic (make_vert_block (nat (domain_block B))))∘(basic B)))
∧(w2 = ((basic B)∘(basic (make_vert_block (nat (codomain_block B))))))
∧ ((domain_block B) ≠ 0))"
using slide_def assm by auto
then obtain B where "((w1 = ((basic (make_vert_block (nat (domain_block B))))∘(basic B)))
∧(w2 = ((basic B)∘(basic (make_vert_block (nat (codomain_block B))))))
∧ ((domain_block B) ≠ 0))" by auto
then have 1:"((w1 = ((basic (make_vert_block (nat (domain_block B))))∘(basic B)))
∧(w2 = ((basic B)∘(basic (make_vert_block (nat (codomain_block B))))))
∧ ((domain_block B) ≠ 0))"
by auto
have "kauff_mat w1 = kauff_mat (basic B)"
proof-
have s1:"mat (2^(nat (domain_block B))) (length (blockmat B)) (blockmat B)"
by (metis matrix_blockmat row_length_domain_block)
have "w1 = ((basic (make_vert_block (nat (domain_wall (basic B))))∘(basic B)))"
using 1 domain_wall.simps by auto
then have "kauff_mat w1 = rat_poly.matrix_mult
(kauff_mat (basic (make_vert_block (nat (domain_wall (basic B))))))
(kauff_mat (basic B))"
using tangle_compose_matrix is_tangle_diagram.simps
by (metis compose_Nil kauff_mat.simps(1) kauff_mat.simps(2))
moreover then have "... = rat_poly.matrix_mult (mat1 (2^(nat (domain_block B)))) (blockmat B)"
using kauff_mat.simps(1) domain_wall.simps(1) by (metis make_vert_block_map_blockmat)
moreover have "... = (blockmat B)"
using s1 mat1_mult_left by (metis make_vert_equiv_mat prop_make_vert_equiv(1))
ultimately show ?thesis by auto
qed
moreover have "kauff_mat w2 = kauff_mat (basic B)"
proof-
have s1:"mat (2^(nat (domain_block B))) (2^(nat (codomain_block B))) (blockmat B)"
by (metis length_codomain_block matrix_blockmat row_length_domain_block)
have "w2 = ((basic B) ∘(basic (make_vert_block (nat (codomain_wall (basic B))))))"
using 1 domain_wall.simps by auto
then have "kauff_mat w2 =
rat_poly.matrix_mult
(kauff_mat (basic B))
(kauff_mat (basic (make_vert_block (nat (codomain_wall (basic B))))))"
using tangle_compose_matrix is_tangle_diagram.simps
by (metis compose_Nil kauff_mat.simps(1) kauff_mat.simps(2))
moreover then have "... = rat_poly.matrix_mult (blockmat B) (mat1 (2^(nat (codomain_block B)))) "
using kauff_mat.simps(1) domain_wall.simps(1)
by (metis blockmat_make_vert codomain_wall.simps(1) make_vert_equiv_mat)
moreover have "... = (blockmat B)"
using s1 by (metis mat1_rt_mult)
ultimately show ?thesis by auto
qed
ultimately show ?thesis by auto
qed
theorem framed_linkrel_inv:"framed_linkrel w1 w2 ⟹ (kauff_mat w1)= (kauff_mat w2)"
unfolding framed_linkrel_def
apply(auto)
using framed_uncross_inv pull_inv straighten_inv swing_inv rotate_inv compress_inv slide_inv
by auto
end