Theory Pappus_Desargues
theory Pappus_Desargues
imports Main Projective_Plane_Axioms Pappus_Property Pascal_Property Desargues_Property
begin
text ‹
Contents:
▪ We prove Hessenberg's theorem @{term "hessenberg_theorem"}: Pappus's property implies Desargues's
property in a projective plane.
›
section ‹Hessenberg's Theorem›
context projective_plane
begin
lemma col_ABC_ABD_1:
assumes "A ≠ B" and "col A B C" and "col A B D"
shows "col B C D"
by (metis assms ax_uniqueness col_def)
lemma col_ABC_ABD_2:
assumes "A ≠ B" and "col A B C" and "col A B D"
shows "col A C D"
by (metis assms ax_uniqueness col_def)
lemma col_line_eq_1:
assumes "A ≠ B" and "B ≠ C"and "col A B C"
shows "line A B = line B C"
by (metis assms ax_uniqueness col_def incidA_lAB incidB_lAB)
lemma col_line_eq_2:
assumes "A ≠ B" and "A ≠ C" and "col A B C"
shows "line A B = line A C"
by (metis assms col_line_eq_1 col_rot_CW line_comm)
lemma desargues_config_not_col_1:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col A A' B'"
proof
assume a1:"col A A' B'"
have f1:"A ≠ A'"
using assms desargues_config_def distinct7_def
by force
have f2:"col A A' R"
using assms desargues_config_def meet_3_col_1
by blast
from f1 and f2 and a1 have f3:"col A' B' R"
using col_ABC_ABD_1
by blast
from a1 have f4:"line A A' = line A' B'"
by (metis assms ax_uniqueness col_def desargues_config_def f1 incidA_lAB incidB_lAB)
have f5:"A' ≠ B'"
using assms desargues_config_def distinct7_def
by force
have f6:"B' ≠ R"
using assms desargues_config_def distinct7_def
by force
from f3 and f5 and f6 have f7:"line A' B' = line B' R"
using col_line_eq_1
by blast
have "line B' R = line B B'"
by (metis a1 assms col_2cycle col_AAB col_line_eq_1 desargues_config_def f6 meet_3_col_2)
have "line A A' = line B B'"
by (simp add: ‹line B' R = line B B'› f4 f7)
then have "False"
using assms desargues_config_def distinct3_def
by auto
then show f8:"col A A' B' ⟹ False"
by simp
qed
lemma desargues_config_not_col_2:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col B B' C'"
using assms desargues_config_not_col_1 desargues_config_rot_CCW
by blast
lemma desargues_config_not_col_3:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col C C' B'"
by (smt assms col_line_eq_1 col_rot_CW desargues_config_def desargues_config_not_col_2
desargues_config_rot_CW distinct3_def meet_3_in_def meet_col_1 meet_col_2)
lemma desargues_config_not_col_4:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col A A' C'"
using assms desargues_config_not_col_3 desargues_config_rot_CCW
by blast
lemma desargues_config_not_col_5:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col B B' A'"
using assms desargues_config_not_col_3 desargues_config_rot_CW
by blast
lemma desargues_config_not_col_6:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col C C' A'"
using assms desargues_config_not_col_1 desargues_config_rot_CW
by blast
lemma desargues_config_not_col_7:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col A B B'"
proof
assume a1:"col A B B'"
have f1:"col A B R"
by (metis a1 assms col_ABB col_ABC_ABD_2 col_rot_CW desargues_config_def desargues_config_not_col_5
meet_3_col_2)
have f2:"col A A' R"
using assms desargues_config_def meet_3_col_1
by blast
have f3:"A ≠ A'"
using assms col_AAB desargues_config_not_col_4
by blast
have f4:"A ≠ R" using assms desargues_config_def distinct7_def
by auto
from f2 and f3 and f4 have f5:"line A A' = line A R"
using col_line_eq_2
by blast
from f1 have f6:"line A R = line B R"
by (metis a1 assms col_2cycle col_ABC_ABD_2 desargues_config_not_col_1 f2 f4)
have f7:"line B R = line B B'"
by (metis ‹line A R = line B R› a1 assms col_AAB col_line_eq_1 desargues_config_def
desargues_config_not_col_2 f1)
from f5 and f6 and f7 have "line A A' = line B B'"
by simp
then have "False"
using assms desargues_config_def distinct3_def
by auto
thus "col A B B' ⟹ False"
by simp
qed
lemma desargues_config_not_col_8:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col A C C'"
by (smt (z3) assms col_ABA col_line_eq_1 col_rot_CW desargues_config_def desargues_config_not_col_6 desargues_config_not_col_7 distinct3_def meet_3_col_1 meet_3_col_3 projective_plane.meet_all_3 projective_plane.meet_col_1 projective_plane_axioms)
lemma desargues_config_not_col_9:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col B A A'"
using assms desargues_config_not_col_8 desargues_config_rot_CCW
by blast
lemma desargues_config_not_col_10:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col B C C'"
using assms desargues_config_not_col_7 desargues_config_rot_CCW
by blast
lemma desargues_config_not_col_11:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col C A A'"
using assms desargues_config_not_col_7 desargues_config_rot_CW
by blast
lemma desargues_config_not_col_12:
assumes "desargues_config A B C A' B' C' M N P R"
shows "¬ col C B B'"
using assms desargues_config_not_col_8 desargues_config_rot_CW
by blast
lemma col_inter:
assumes "A ≠ C" and "B ≠ C" and "col A B C"
shows "inter l (line B C) = inter l (line A C)"
by (metis assms col_line_eq_1 col_line_eq_2)
lemma lemma_1:
assumes "desargues_config A B C A' B' C' M N P R" and "is_pappus"
shows "col M N P ∨ incid A (line B' C') ∨ incid C' (line A B)"
proof-
have "?thesis" if "incid A (line B' C') ∨ incid C' (line A B)"
by (simp add: that)
define Q E X F where "Q = inter (line A B) (line B' C')" and "E = inter (line A C) (line R Q)"
and "X = inter (line A C') (line R B)" and "F = inter (line A' C') (line R Q)"
have "col X E M" if "¬ incid A (line B' C')" and "¬ incid C' (line A B)"
proof-
have f1:"distinct [C,C',R,Q,B,A]"
by (smt Q_def ‹¬ incid A (line B' C')› ‹¬ incid C' (line A B)› assms(1) col_ABB col_A_B_ABl
col_A_B_lAB col_line_eq_2 col_rot_CW desargues_config_def desargues_config_not_col_12
desargues_config_not_col_2 desargues_config_not_col_3 desargues_config_not_col_7
desargues_config_not_col_9 distinct6_def incidA_lAB line_comm meet_3_col_1 meet_3_col_2)
have f2: "col C C' R"
using assms(1) desargues_config_def meet_3_col_3
by blast
have f3: "col Q B A"
using Q_def col_2cycle col_A_B_ABl col_rot_CW
by blast
have f4: "is_a_intersec E C A Q R"
using E_def col_2cycle inter_is_a_intersec is_a_intersec_def
by auto
have f5:"is_a_intersec M C B Q C'"
by (metis Q_def assms(1) col_2cycle col_ABB col_ABC_ABD_1 col_A_B_lAB col_rot_CW
desargues_config_def is_a_intersec_def meet_col_1 meet_col_2)
have f6:"is_a_intersec X C' A B R"
using X_def col_2cycle inter_is_a_intersec is_a_intersec_def
by auto
from f1 and f2 and f3 and f4 and f5 and f6 have "col M X E"
using assms(2) is_pappus2_def is_pappus_def
by blast
then show "col X E M"
using col_def
by auto
qed
have "col P X F" if "¬ incid A (line B' C')" and "¬ incid C' (line A B)"
proof-
have f1:"distinct [A',A,R,Q,B',C']"
by (smt Q_def ‹¬ incid A (line B' C')› ‹¬ incid C' (line A B)› assms(1) col_AAB col_A_B_ABl
col_A_B_lAB col_line_eq_1 col_rot_CW desargues_config_def desargues_config_not_col_2
desargues_config_not_col_3 desargues_config_not_col_4 desargues_config_not_col_6
desargues_config_not_col_7 distinct6_def incidB_lAB meet_3_col_2 meet_3_col_3)
have f2:"col A' A R"
by (metis assms(1) col_ABA col_line_eq_1 desargues_config_def meet_3_col_1)
have f3:"col Q B' C'"
by (simp add: Q_def col_A_B_lAB col_rot_CW)
have "is_a_intersec (inter (line A B) (line A' B')) A' B' Q A"
by (metis Q_def col_def incidA_lAB incid_inter_left inter_is_a_intersec is_a_intersec_def)
then have f4:"is_a_intersec P A' B' Q A"
using assms(1) desargues_config_def meet_in_def uniq_inter
by auto
have f5:"is_a_intersec X A C' B' R"
by (metis X_def assms(1) col_def col_line_eq_2 desargues_config_def desargues_config_not_col_9
f2 inter_is_a_intersec is_a_intersec_def line_comm meet_3_col_2)
have f6:"is_a_intersec F A' C' Q R"
by (metis F_def inter_is_a_intersec inter_line_line_comm)
from f1 and f2 and f3 and f4 and f5 and f6 and assms(2)
show "col P X F"
using is_pappus2_def is_pappus_def
by blast
qed
have "col M N P" if "¬ incid A (line B' C')" and "¬ incid C' (line A B)"
proof-
have f1:"Q ≠ C' ∧ X ≠ E ∧ line Q C' ≠ line X E"
by (smt E_def Q_def X_def ‹¬ incid A (line B' C')› ‹¬ incid C' (line A B)› assms(1) col_ABB
col_A_B_ABl col_A_B_lAB col_line_eq_2 col_rot_CW desargues_config_def
desargues_config_not_col_10 desargues_config_not_col_2 desargues_config_not_col_8
incidB_lAB incid_C_AB line_comm meet_3_col_1 meet_3_col_2 meet_3_col_3)
have f2:"E ≠ A ∧ C' ≠ F ∧ line E A ≠ line C' F"
by (smt E_def F_def Q_def X_def ‹⟦¬ incid A (line B' C'); ¬ incid C' (line A B)⟧ ⟹ col X E M›
assms(1) ax_uniqueness col_def desargues_config_def desargues_config_not_col_10
desargues_config_not_col_3 f1 incidA_lAB incidB_lAB incid_inter_left incid_inter_right
meet_in_def that(1))
have f3:"Q ≠ A ∧ X ≠ F ∧ line Q A ≠ line X F"
by (smt F_def Q_def X_def ‹¬ incid A (line B' C')› ‹¬ incid C' (line A B)› assms(1)
ax_uniqueness col_def desargues_config_def desargues_config_not_col_10
desargues_config_not_col_2 desargues_config_not_col_7 incidA_lAB incidB_lAB incid_inter_left
incid_inter_right meet_3_col_2 meet_3_col_3)
have f4:"col Q E F"
using E_def F_def col_def incidB_lAB incid_inter_right
by blast
have f5:"col X C' A"
using X_def col_2cycle col_A_B_ABl col_rot_CW
by blast
have f6:"is_a_intersec M Q C' X E"
by (metis Q_def ‹⟦¬ incid A (line B' C'); ¬ incid C' (line A B)⟧ ⟹ col X E M› assms(1)
col_ABB col_A_B_lAB col_def col_line_eq_1 desargues_config_def incidB_lAB is_a_intersec_def
meet_in_def that(1) that(2))
have f7:"is_a_intersec N E A C' F"
by (metis E_def F_def assms(1) ax_uniqueness col_rot_CW desargues_config_def f2 incidA_lAB
incidB_lAB incid_inter_left is_a_intersec_def meet_col_1 meet_col_2)
have f8:"is_a_intersec P Q A X F"
by (metis Q_def ‹⟦¬ incid A (line B' C'); ¬ incid C' (line A B)⟧ ⟹ col P X F› assms(1) col_AAB col_A_B_ABl col_line_eq_2 col_rot_CW desargues_config_def is_a_intersec_def meet_col_1 that(1) that(2))
from f1 and f2 and f3 and f4 and f5 and f6 and f7 and f8 and assms(2) show "col M N P"
using is_pappus2_def is_pappus_def
by blast
qed
show "col M N P ∨ incid A (line B' C') ∨ incid C' (line A B)"
using ‹⟦¬ incid A (line B' C'); ¬ incid C' (line A B)⟧ ⟹ col M N P›
by auto
qed
corollary corollary_1:
assumes "desargues_config A B C A' B' C' M N P R" and "is_pappus"
shows "col M N P ∨ ((incid A (line B' C') ∨ incid C' (line A B)) ∧
(incid C (line A' B') ∨ incid B' (line A C)) ∧ (incid B (line A' C') ∨ incid A' (line B C)))"
by (metis assms(1) assms(2) col_rot_CW desargues_config_rot_CCW lemma_1 line_comm)
definition triangle_circumscribes_triangle ::
"['point, 'point, 'point, 'point, 'point, 'point] ⇒ bool" where
"triangle_circumscribes_triangle A' B' C' A B C ≡ incid A (line B' C') ∧ incid C (line A' B') ∧
incid B (line A' C')"
lemma lemma_2:
assumes "desargues_config A B C A' B' C' M N P R" and "incid A (line B' C') ∨ incid C' (line A B)"
and "incid C (line A' B') ∨ incid B' (line A C)" and "incid B (line A' C') ∨ incid A' (line B C)"
shows "col M N P ∨ triangle_circumscribes_triangle A B C A' B' C' ∨ triangle_circumscribes_triangle A' B' C' A B C"
by (smt assms ax_uniqueness col_def desargues_config_not_col_1
desargues_config_not_col_11 desargues_config_not_col_12 desargues_config_not_col_2
desargues_config_not_col_3 desargues_config_not_col_9 incidA_lAB incidB_lAB
triangle_circumscribes_triangle_def)
lemma lemma_3:
assumes "is_pappus" and "desargues_config A B C A' B' C' M N P R" and
"triangle_circumscribes_triangle A' B' C' A B C"
shows "col M N P"
proof-
define S T where "S = inter (line C' P) (line R A)" and "T = inter (line C' P) (line R B)"
have "col N S B'"
proof-
have f1:"distinct [R,C,C',P,B,A]"
by (smt assms(2) col_AAB col_line_eq_2 col_rot_CW desargues_config_def
desargues_config_not_col_1 desargues_config_not_col_12 desargues_config_not_col_2
desargues_config_not_col_5 desargues_config_not_col_7 desargues_config_not_col_8
desargues_config_not_col_9 distinct6_def line_comm meet_3_col_1 meet_3_col_2 meet_col_1
meet_col_2)
have f2:"col R C C'"
using assms(2) col_rot_CW desargues_config_def meet_3_col_3
by blast
have f3:"col P B A"
by (metis assms(2) col_rot_CW desargues_config_def line_comm meet_col_1)
have f4:"is_a_intersec B' R B P C"
by (metis assms(2) assms(3) col_def desargues_config_def incidB_lAB is_a_intersec_def
meet_3_col_2 meet_in_def triangle_circumscribes_triangle_def)
have f5:"is_a_intersec S R A P C'"
using S_def col_2cycle inter_is_a_intersec is_a_intersec_def
by auto
have "line B C' = line A' C'"
by (metis ‹distinct [R,C,C',P,B,A]› assms(3) ax_uniqueness distinct6_def incidA_lAB incidB_lAB
triangle_circumscribes_triangle_def)
then have f6:"is_a_intersec N C A B C'"
by (metis assms(2) desargues_config_def inter_is_a_intersec line_comm meet_in_def uniq_inter)
from f1 and f2 and f3 and f4 and f5 and f6 and assms(1) have "col B' N S"
using is_pappus2_def is_pappus_def
by blast
then show "col N S B'"
by (simp add: col_rot_CW)
qed
have "col M T A'"
proof-
have f1:"distinct [R,C,C',P,A,B]"
by (smt assms(2) col_ABA col_line_eq_2 col_rot_CW desargues_config_def desargues_config_not_col_1
desargues_config_not_col_12 desargues_config_not_col_2 desargues_config_not_col_5
desargues_config_not_col_7 desargues_config_not_col_8 desargues_config_not_col_9 distinct6_def
line_comm meet_3_col_1 meet_3_col_2 meet_col_1 meet_col_2)
have f2:"col R C C'"
using assms(2) col_rot_CW desargues_config_def meet_3_col_3
by blast
have f3:"col P A B"
using assms(2) col_rot_CW desargues_config_def meet_col_1
by blast
have f4:"line P C = line A' B'"
by (metis ‹distinct [R,C,C',P,A,B]› assms(2) assms(3) ax_uniqueness desargues_config_def
distinct6_def incidA_lAB incidB_lAB meet_in_def triangle_circumscribes_triangle_def)
have f5:"line R A = line A A'"
by (metis ‹distinct [R,C,C',P,A,B]› assms(2) col_AAB col_line_eq_2 desargues_config_def
desargues_config_not_col_1 distinct6_def line_comm meet_3_col_1)
from f4 and f5 have f6:"is_a_intersec A' R A P C"
by (metis col_def incidA_lAB incidB_lAB is_a_intersec_def)
have "line A C' = line B' C'"
by (metis assms(3) ax_uniqueness distinct6_def f1 incidA_lAB incidB_lAB
triangle_circumscribes_triangle_def)
then have f7:"is_a_intersec M C B A C'"
by (metis assms(2) col_rot_CW desargues_config_def is_a_intersec_def line_comm meet_col_1
meet_col_2)
have f8:"is_a_intersec T R B P C'"
by (metis T_def distinct6_def f1 inter_comm_line_line_comm inter_is_a_intersec line_comm)
from f1 and f2 and f3 and f6 and f7 and f8 and assms(1) have "col A' M T"
using is_pappus2_def is_pappus_def
by blast
thus "col M T A'"
by (simp add: col_rot_CW)
qed
then show "col M N P"
proof-
have f1:"S ≠ T ∧ B ≠ A ∧ line S T ≠ line B A"
by (smt T_def ‹col N S B'› assms(2) assms(3) ax_uniqueness col_AAB col_line_eq_2 col_rot_CW
desargues_config_def desargues_config_not_col_10 desargues_config_not_col_7
desargues_config_not_col_9 incidB_lAB incid_inter_left incid_inter_right
line_comm meet_3_col_2 meet_3_col_3 meet_col_1 meet_col_2 triangle_circumscribes_triangle_def)
have f2:"A ≠ B' ∧ T ≠ A' ∧ line A B' ≠ line T A'"
by (smt (verit) S_def T_def assms(2) assms(3) col_A_B_ABl col_line_eq_2 desargues_config_def desargues_config_not_col_1 desargues_config_not_col_9 f1 incidA_lAB inter_comm line_comm meet_3_col_1 meet_col_2 projective_plane.col_def projective_plane_axioms triangle_circumscribes_triangle_def)
have f3:"S ≠ B' ∧ B ≠ A'"
by (smt S_def assms(2) assms(3) ax_uniqueness col_A_B_ABl col_line_eq_2 col_rot_CW
desargues_config_def desargues_config_not_col_2 desargues_config_not_col_5
desargues_config_not_col_7 incidA_lAB incidB_lAB incid_inter_right inter_comm line_comm
meet_3_col_2 meet_in_def triangle_circumscribes_triangle_def)
then have f4:"line S B' ≠ line B A'"
by (metis assms(2) col_def desargues_config_not_col_5 incidA_lAB incidB_lAB)
have f5:"col S A A'"
by (metis S_def assms(2) col_ABC_ABD_1 col_A_B_lAB col_rot_CW desargues_config_def
desargues_config_not_col_8 meet_3_col_1 meet_3_col_3)
have f6:"col B T B'"
by (metis T_def assms(2) col_def col_line_eq_2 desargues_config_def desargues_config_not_col_10
incidB_lAB incid_inter_right line_comm meet_3_col_2 meet_3_col_3)
have f7:"is_a_intersec P S T B A"
by (metis S_def T_def assms(2) col_ABC_ABD_1 col_A_B_ABl col_def desargues_config_def incidA_lAB
incidB_lAB is_a_intersec_def meet_in_def)
have f8:"is_a_intersec M A B' T A'"
by (smt (verit, del_insts) ‹col M T A'› assms(2) assms(3) col_rot_CW desargues_config_def f2 incidA_lAB incidB_lAB is_a_intersec_def meet_col_2 projective_plane.ax_uniqueness projective_plane_axioms triangle_circumscribes_triangle_def)
have f9:"is_a_intersec N S B' B A'"
using ‹col N S B'› assms(2) assms(3) col_def desargues_config_def incidA_lAB is_a_intersec_def
meet_in_def triangle_circumscribes_triangle_def
by auto
from f1 and f2 and f3 and f4 and f5 and f6 and f7 and f8 and f9 and assms(1) have "col P M N"
using is_pappus2_def is_pappus_def
by blast
thus "col M N P"
by (simp add: col_rot_CW)
qed
qed
theorem pappus_desargues:
assumes "is_pappus" and "desargues_config A B C A' B' C' M N P R"
shows "col M N P"
proof-
have f1:"col M N P ∨ ((incid A (line B' C') ∨ incid C' (line A B)) ∧
(incid C (line A' B') ∨ incid B' (line A C)) ∧ (incid B (line A' C') ∨ incid A' (line B C)))"
using assms corollary_1
by auto
have f2:"col M N P ∨ triangle_circumscribes_triangle A B C A' B' C' ∨ triangle_circumscribes_triangle A' B' C' A B C"
if "(incid A (line B' C') ∨ incid C' (line A B)) ∧ (incid C (line A' B') ∨ incid B' (line A C))
∧ (incid B (line A' C') ∨ incid A' (line B C))"
using assms(2) lemma_2 that
by auto
have f3:"col M N P" if "triangle_circumscribes_triangle A' B' C' A B C"
using assms lemma_3 that
by auto
have f4:"col M N P" if "triangle_circumscribes_triangle A B C A' B' C'"
proof-
have "desargues_config A' B' C' A B C M N P R"
proof-
have f1:"distinct [A',B',C',A,B,C,R]"
using assms(2) desargues_config_def distinct7_def
by auto
have f2:"¬ col A' B' C'"
using assms(2) desargues_config_def
by blast
have f3:"¬ col A B C"
using assms(2) desargues_config_def
by blast
have f4:"distinct [(line A' A),(line B' B),(line C' C)]"
by (metis assms(2) desargues_config_def line_comm)
have f5:"meet_3_in (line A' A) (line B' B) (line C' C) R"
by (metis assms(2) desargues_config_def line_comm)
have f6:"(line A' B') ≠ (line A B) ∧ (line B' C') ≠ (line B C) ∧ (line A' C') ≠ (line A C)"
using assms(2) desargues_config_def
by auto
have f7:"meet_in (line B' C') (line B C) M ∧ meet_in (line A' C') (line A C) N ∧
meet_in (line A' B') (line A B) P"
using assms(2) desargues_config_def meet_comm
by blast
from f1 and f2 and f3 and f4 and f5 and f6 and f7 show "desargues_config A' B' C' A B C M N P R"
by (simp add: desargues_config_def)
qed
then show "col M N P"
using assms(1) lemma_3 that
by blast
qed
from f1 and f2 and f3 and f4 show "col M N P"
by blast
qed
theorem hessenberg_thereom:
assumes "is_pappus"
shows "desargues_prop"
by (smt are_perspective_from_line_def assms col_def desargues_prop_def pappus_desargues
perspective_from_point_desargues_config)
corollary pascal_desargues:
assumes "pascal_prop"
shows "desargues_prop"
by (simp add: assms hessenberg_thereom pascal_pappus)
end
end