Theory Tarski_Postulate_Parallels

(* IsaGeoCoq - Tarski_Postulate_Parallels.thy

Port part of GeoCoq 3.4.0 (https://geocoq.github.io/GeoCoq/) in Isabelle/Hol 

Copyright (C) 2021-2025  Roland Coghetto roland.coghetto (at) cafr-msa2p.be

License: LGPL

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*)

theory Tarski_Postulate_Parallels

imports
  Tarski_Neutral_Archimedes

begin

context Tarski_neutral_dimensionless

begin

section "Parallel's Postulate"

subsection "Definitions"

definition tarski_s_parallel_postulate ::
  "bool"
  ("TarskiSParallelPostulate")
  where
    "tarski_s_parallel_postulate  

      A B C D T.
     Bet A D T  Bet B D C  A  D 

     ( X Y. Bet A B X  Bet A C Y  Bet X T Y)"

definition euclid_5 ::
  "bool" ("Euclid5")
  where
    "euclid_5  

      P Q R S T U.
     BetS P T Q  BetS R T S  BetS Q U R  ¬ Col P Q S  Cong P T Q T  Cong R T S T

     ( I. BetS S Q I  BetS P U I)"

definition euclid_s_parallel_postulate ::
  "bool" ("EuclidSParallelPostulate")
  where
    "euclid_s_parallel_postulate  

      A B C D P Q R.
     B C OS A D  SAMS A B C B C D  A B C B C D SumA P Q R  ¬ Bet P Q R 

     ( Y. B Out A Y  C Out D Y)"

definition playfair_s_postulate ::
  "bool"
  ("PlayfairSPostulate")
  where
    "playfair_s_postulate  

      A1 A2 B1 B2 C1 C2 P.
     A1 A2 Par B1 B2  Col P B1 B2  A1 A2 Par C1 C2  Col P C1 C2 

     Col C1 B1 B2  Col C2 B1 B2"

definition decidability_of_intersection ::
  "bool"
  ("DecidabilityIntersection")
  where
    "decidability_of_intersection  

     A B C D.
    
    ( I. Col I A B  Col I C D)  ¬ ( I. Col I A B  Col I C D)"

definition alternate_interior_angles_postulate ::
  "bool"
  ("AlternateInteriorAnglesPostulate")
  where
    "alternate_interior_angles_postulate  

      A B C D.
     A C TS B D  A B Par C D 
 
     B A C CongA D C A"

definition consecutive_interior_angles_postulate ::
  "bool"
  ("ConsecutiveInteriorAnglesPostulate")
  where
    "consecutive_interior_angles_postulate  

      A B C D.
     B C OS A D  A B Par C D 
 
     A B C SuppA B C D"

definition alternative_playfair_s_postulate ::
  "bool"
  ("AlternativePlayfairSPostulate")
  where
    "alternative_playfair_s_postulate  

      A1 A2 B1 B2 C1 C2 P.
     P Perp2 A1 A2 B1 B2  ¬ Col A1 A2 P  Col P B1 B2  
     Coplanar A1 A2 B1 B2  A1 A2 Par C1 C2  Col P C1 C2

     Col C1 B1 B2  Col C2 B1 B2"

definition proclus_postulate ::
  "bool"
  ("ProclusPostulate")
  where
    "proclus_postulate  

      A B C D P Q.
     A B Par C D  Col A B P  ¬ Col A B Q  Coplanar C D P Q 

     ( Y. Col P Q Y  Col C D Y)"

definition triangle_postulate ::
  "bool"
  ("TrianglePostulate")
  where
    "triangle_postulate  

      A B C D E F.
     A B C TriSumA D E F
 
     Bet D E F"

definition bachmann_s_lotschnittaxiom ::
  "bool"
  ("BachmannsLotschnittaxiom")
  where
    "bachmann_s_lotschnittaxiom  

      P Q R P1 R1.
     (P  Q  Q  R  Per P Q R  Per Q P P1  Per Q R R1  
     Coplanar P Q R P1  Coplanar P Q R R1
 
     ( S. Col P P1 S  Col R R1 S))"

definition legendre_s_parallel_postulate ::
  "bool"
  ("LegendresParallelPostulate")
  where
    "legendre_s_parallel_postulate 

     A B C.

    ¬ Col A B C  
    Acute A B C 
    ( T. T InAngle A B C  ( X Y. B Out A X  B Out C Y  Bet X T Y))"

definition weak_inverse_projection_postulate ::
  "bool"
  ("WeakInverseProjectionPostulate")
  where
    "weak_inverse_projection_postulate  

     A B C D E F P Q.
    ((Acute A B C  Per D E F  A B C A B C SumA D E F  
    B Out A P  P  Q  Per B P Q  Coplanar A B C Q)

    ( Y. B Out C Y  Col P Q Y))"

definition weak_triangle_circumscription_principle ::
  "bool"
  ("WeakTriangleCircumscriptionPrinciple")
  where
    "weak_triangle_circumscription_principle  

      A B C A1 A2 B1 B2.
     (¬ Col A B C  Per A C B  A1 A2 PerpBisect B C  
     B1 B2 PerpBisect A C  Coplanar A B C A1  Coplanar A B C A2  
     Coplanar A B C B1  Coplanar A B C B2

     ( I. Col A1 A2 I  Col B1 B2 I))"

definition weak_tarski_s_parallel_postulate ::
  "bool"
  ("WeakTarskiParallelPostulate")
  where
    "weak_tarski_s_parallel_postulate  

      A B C T.
     (Per A B C  T InAngle A B C 

     ( X Y. B Out A X  B Out C Y  Bet X T Y))"

definition existential_playfair_s_postulate ::
  "bool"
  ("ExistentialPlayfairPostulate")
  where
    "existential_playfair_s_postulate 
  
     A1 A2 P. 

    ¬ Col A1 A2 P 

    ( B1 B2 C1 C2. 
            A1 A2 Par B1 B2  Col P B1 B2  A1 A2 Par C1 C2  Col P C1 C2 
       
            (Col C1 B1 B2  Col C2 B1 B2))"

definition postulate_of_right_saccheri_quadrilaterals ::
  "bool"
  ("PostulateRightSaccheriQuadrilaterals")
  where
    "postulate_of_right_saccheri_quadrilaterals  

     A B C D.
    Saccheri A B C D
 
    Per A B C"

definition postulate_of_existence_of_a_right_saccheri_quadrilateral ::
  "bool"
  ("PostulateExistenceRightSaccheriQuadrilateral")
  where
    "postulate_of_existence_of_a_right_saccheri_quadrilateral 
  
     A B C D. 

    Saccheri A B C D  Per A B C"

definition postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights ::
  "bool"
  ("PostulateExistenceTriangleAnglesSumTwoRights")
  where
    "postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights 
  
      A B C D E F. 

     ¬ Col A B C  A B C TriSumA D E F  Bet D E F"

definition inverse_projection_postulate ::
  "bool"
  ("InverseProjectionPostulate")
  where
    "inverse_projection_postulate  
 
      A B C P Q.
     Acute A B C  B Out A P  P  Q  Per B P Q  Coplanar A B C Q 

     ( Y. B Out C Y  Col P Q Y)"

definition alternative_proclus_postulate ::
  "bool"
  ("AlternativeProclusPostulate")
  where
    "alternative_proclus_postulate  

     A B C D P Q.
    P Perp2 A B C D  ¬ Col C D P  Coplanar A B C D  Col A B P  
    ¬ Col A B Q  Coplanar C D P Q 

    ( Y. (Col P Q Y  Col C D Y))"

definition strong_parallel_postulate ::
  "bool"
  ("StrongParallelPostulate")
  where
    "strong_parallel_postulate  

     P Q R S T U.
    BetS P T Q  BetS R T S  ¬ Col P R U  Coplanar P Q R U  
    Cong P T Q T  Cong R T S T

    ( I. (Col S Q I  Col P U I))"

definition triangle_circumscription_principle ::
  "bool"
  ("TriangleCircumscriptionPrinciple")
  where
    "triangle_circumscription_principle  

    A B C.
   ¬ Col A B C

   ( D. Cong A D B D  Cong A D C D  Coplanar A B C D)"

definition thales_converse_postulate::
  "bool"
  ("ThalesConversePostulate") where
  "thales_converse_postulate  

    A B C M.
   M Midpoint A B  Per A C B
 
   Cong M A M C"

definition existential_thales_postulate ::
  "bool"
  ("ExistentialThalesPostulate") where
  "existential_thales_postulate 
  
    A B C M. 

   ¬ Col A B C  M Midpoint A B  Cong M A M C  Per A C B"

definition thales_postulate::
  "bool"
  ("ThalesPostulate") where
  "thales_postulate  

    A B C M.
   M Midpoint A B  Cong M A M C
 
   Per A C B"

definition posidonius_postulate ::
  "bool"
  ("PosidoniusPostulate") where
  "posidonius_postulate 

    A1 A2 B1 B2.

    ¬ Col A1 A2 B1  B1  B2  Coplanar A1 A2 B1 B2 
    ( A3 A4 B3 B4.
              Col A1 A2 A3  Col B1 B2 B3  A1 A2 Perp A3 B3 
              Col A1 A2 A4  Col B1 B2 B4  A1 A2 Perp A4 B4
         
              Cong A3 B3 A4 B4)"

definition postulate_of_right_lambert_quadrilaterals ::
  "bool"
  ("PostulateOfRightLambertQuadrilaterals") where
  "postulate_of_right_lambert_quadrilaterals  

    A B C D.
   Lambert A B C D 
 
   Per B C D"

definition postulate_of_existence_of_a_right_lambert_quadrilateral ::
  "bool"
  ("PostulateExistenceRightLambertQuadrilateral") where
  "postulate_of_existence_of_a_right_lambert_quadrilateral  

    A B C D. 

   Lambert A B C D  Per B C D"

definition postulate_of_existence_of_similar_triangles ::
  "bool"
  ("PostulateOfExistenceOfSimilarTriangles") where
  "postulate_of_existence_of_similar_triangles  

    A B C D E F. 
  
   ¬ Col A B C  ¬ Cong A B D E  A B C CongA D E F  
   B C A CongA E F D  C A B CongA F D E"

definition midpoint_converse_postulate ::
  "bool"
  ("MidpointConversePostulate") where
  "midpoint_converse_postulate  

    A B C P Q.
   ¬ Col A B C  P Midpoint B C  A B Par Q P  Col A C Q

   Q Midpoint A C"

definition postulate_of_transitivity_of_parallelism::
  "bool"
  ("PostulateOfTransitivityOfParallelism") where
  "postulate_of_transitivity_of_parallelism  

    A1 A2 B1 B2 C1 C2.
   A1 A2 Par B1 B2  B1 B2 Par C1 C2 
 
   A1 A2 Par C1 C2"

definition perpendicular_transversal_postulate ::
  "bool"
  ("PerpendicularTransversalPostulate") where
  "perpendicular_transversal_postulate  

    A B C D P Q.
   A B Par C D  A B Perp P Q  Coplanar C D P Q
 
   C D Perp P Q"

definition postulate_of_parallelism_of_perpendicular_transversals ::
  "bool"
  ("PostulateOfParallelismOfPerpendicularTransversals") where
  "postulate_of_parallelism_of_perpendicular_transversals  

    A1 A2 B1 B2 C1 C2 D1 D2.
   A1 A2 Par B1 B2  A1 A2 Perp C1 C2  B1 B2 Perp D1 D2 
   Coplanar A1 A2 C1 D1  Coplanar A1 A2 C1 D2 
   Coplanar A1 A2 C2 D1  Coplanar A1 A2 C2 D2
 
   C1 C2 Par D1 D2"

definition universal_posidonius_postulate ::
  "bool"
  ("UniversalPosidoniusPostulate") where
  "universal_posidonius_postulate  

    A1 A2 A3 A4 B1 B2 B3 B4.
   A1 A2 Par B1 B2  Col A1 A2 A3  Col B1 B2 B3  A1 A2 Perp A3 B3 
   Col A1 A2 A4  Col B1 B2 B4  A1 A2 Perp A4 B4
 
   Cong A3 B3 A4 B4"

definition alternative_strong_parallel_postulate ::
  "bool"
  ("AlternativeStrongParallelPostulate") where
  "alternative_strong_parallel_postulate  

    A B C D P Q R.
   B C OS A D  A B C B C D SumA P Q R  ¬ Bet P Q R

   ( Y. Col B A Y  Col C D Y)"

(* (1) tarski_a_paralell_postulate = ? tarski_s_parallel_postulate ? *)
definition Postulate01 :: "bool" where
  "Postulate01  tarski_s_parallel_postulate"

(* (2) playfair_s_postulate *)
definition Postulate02 :: "bool" where
  "Postulate02  playfair_s_postulate"

(* (3) triangle_postulate *)
definition Postulate03 :: "bool" where
  "Postulate03  triangle_postulate"

(* (4) bachmann_s_lotschnittaxiom *)
definition Postulate04 :: "bool" where
  "Postulate04  bachmann_s_lotschnittaxiom"

(* (5) postulate_of_transitivity_of_parallelism *)
definition Postulate05 :: "bool" where 
  "Postulate05  postulate_of_transitivity_of_parallelism"

(* (6) midpoint_converse_postulate *)
definition Postulate06 :: "bool" where 
  "Postulate06  midpoint_converse_postulate"

(* (7) alternate_interior_angles_postulate *)
definition Postulate07 :: "bool" where 
  "Postulate07  alternate_interior_angles_postulate"

(* (8) consecutive_interior_angles_postulate *)
definition Postulate08 :: "bool" where 
  "Postulate08  consecutive_interior_angles_postulate"

(* (9) perpendicular_transversal_postulate *)
definition Postulate09 :: "bool" where 
  "Postulate09  perpendicular_transversal_postulate"

(* (10) postulate_of_parallelism_of_perpendicular_transversals *)
definition Postulate10 :: "bool" where 
  "Postulate10  postulate_of_parallelism_of_perpendicular_transversals"

(* (11) universal_posidonius_postulate *)
definition Postulate11 :: "bool" where 
  "Postulate11  universal_posidonius_postulate"

(* (12) alternative_playfair_s_postulate *)
definition Postulate12 :: "bool" where 
  "Postulate12  alternative_playfair_s_postulate"

(* (13) proclus_postulate *)
definition Postulate13 :: "bool" where 
  "Postulate13  proclus_postulate"

(* (14) alternative_proclus_postulate *)
definition Postulate14 :: "bool" where 
  "Postulate14  alternative_proclus_postulate"

(* (15) triangle_circumscription_principle *)
definition Postulate15 :: "bool" where 
  "Postulate15  triangle_circumscription_principle"

(* (16) inverse_projection_postulate *)
definition Postulate16 :: "bool" where 
  "Postulate16  inverse_projection_postulate"

(* (17) euclid_5 *)
definition Postulate17 :: "bool" where 
  "Postulate17  euclid_5"

(* (18) strong_parallel_postulate *)
definition Postulate18 :: "bool" where 
  "Postulate18  strong_parallel_postulate"

(* (19) strong_parallel_postulate *)

definition Postulate19 :: "bool" where 
  "Postulate19  alternative_strong_parallel_postulate"

(* (20) euclid_s_parallel_postulate *)
definition Postulate20 :: "bool" where 
  "Postulate20   euclid_s_parallel_postulate"

(* (21) postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights *)
definition Postulate21 :: "bool" where 
  "Postulate21   postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights"

(* (22) posidonius_postulate *)
definition Postulate22 :: "bool" where 
  "Postulate22   posidonius_postulate"

(* (23) postulate_of_existence_of_similar_triangles *)
definition Postulate23 :: "bool" where 
  "Postulate23   postulate_of_existence_of_similar_triangles"

(* (24) thales_postulate *)
definition Postulate24 :: "bool" where 
  "Postulate24   thales_postulate"

(* (25) thales_converse_postulate *)
definition Postulate25 :: "bool" where 
  "Postulate25   thales_converse_postulate"

(* (26) existential_thales_postulate *)
definition Postulate26 :: "bool" where 
  "Postulate26   existential_thales_postulate"

(* (27) postulate_of_right_saccheri_quadrilaterals *)
definition Postulate27 :: "bool" where 
  "Postulate27   postulate_of_right_saccheri_quadrilaterals"

(* (28) postulate_of_existence_of_a_right_saccheri_quadrilateral *)
definition Postulate28 :: "bool" where 
  "Postulate28   postulate_of_existence_of_a_right_saccheri_quadrilateral"

(* (29) postulate_of_right_lambert_quadrilaterals *)
definition Postulate29 :: "bool" where 
  "Postulate29   postulate_of_right_lambert_quadrilaterals"

(* (30) postulate_of_existence_of_a_right_lambert_quadrilateral *)
definition Postulate30 :: "bool" where 
  "Postulate30   postulate_of_existence_of_a_right_lambert_quadrilateral"

(* (31) weak_inverse_projection_postulate *)
definition Postulate31 :: "bool" where 
  "Postulate31  weak_inverse_projection_postulate"

(* (32) weak_tarski_s_parallel_postulate *)
definition Postulate32 :: "bool" where 
  "Postulate32  weak_tarski_s_parallel_postulate"

(* (33) weak_triangle_circumscription_principle *)
definition Postulate33 :: "bool" where 
  "Postulate33  weak_triangle_circumscription_principle"

(* (34) legendre_s_parallel_postulate *)
definition Postulate34 :: "bool" where 
  "Postulate34  legendre_s_parallel_postulate"

(* (35) existential_playfair_s_postulate *)
definition Postulate35 :: "bool" where 
  "Postulate35  existential_playfair_s_postulate"

subsection "Propositions"

lemma euclid_5__original_euclid:
  assumes "Euclid5"
  shows "EuclidSParallelPostulate"
proof -
  {
    fix A B C D P Q R
    assume P1: "B C OS A D  SAMS A B C B C D  A B C B C D SumA P Q R  ¬ Bet P Q R"
    obtain M where P2: "M Midpoint B C"
      using midpoint_existence by auto
    obtain D' where P3: "C Midpoint D D'"
      using symmetric_point_construction by auto
    obtain E where P4: "M Midpoint D' E"
      using symmetric_point_construction by auto
    have P5: "A  B"
      using P1 os_distincts by blast
    have P6: "B  C"
      using P1 os_distincts by blast
    have P7: "C  D"
      using P1 os_distincts by blast
    have P10: "M  B"
      using P2 P6 is_midpoint_id by auto
    have P11: "M  C"
      using P2 P6 is_midpoint_id_2 by auto
    have P13: "C  D'"
      using P3 P7 is_midpoint_id_2 by blast
    have P16: "¬ Col B C A"
      using one_side_not_col123 P1 by blast
    have "B C OS D A"
      using P1 one_side_symmetry by blast
    then have P17: "¬ Col B C D"
      using one_side_not_col123 P1 by blast
    then have P18: "¬ Col M C D"
      using P2 Col_perm P11 col_transitivity_2 midpoint_col by blast
    then have P19: "¬ Col M C D'"
      by (metis P13  P3 Col_perm col_transitivity_2 midpoint_col)
    then have P20: "¬ Col D' C B"
      by (metis Col_perm P13 P17 P3 col_transitivity_2 midpoint_col)
    then have P21: "¬ Col M C E"
      by (metis P19 P4 bet_col col2__eq col_permutation_4 midpoint_bet midpoint_distinct_2)
    have P22: "M C D' CongA M B E  M D' C CongA M E B" using P13 l11_49
      by (metis Cong_cases P19 P2 P4 l11_51 l7_13_R1 l7_2 midpoint_cong not_col_distincts)
    have P23: "Cong C D' B E"
      using P11 P2 P4 l7_13_R1 l7_2 by blast
    have P27: "C B TS D D'"
      by (simp add: P13 P17 P3 bet__ts midpoint_bet not_col_permutation_4)
    have P28: "A InAngle C B E"
    proof -
      have "C B A LeA C B E"
      proof -
        have "A B C LeA B C D'"
        proof -
          have "Bet D C D'"
            by (simp add: P3 midpoint_bet)
          then show ?thesis using P1 P7 P13 sams_chara
            by (metis sams_left_comm sams_sym)
        qed
        moreover have "A B C CongA C B A"
          using P5 P6 conga_pseudo_refl by auto
        moreover have "B C D' CongA C B E"
          by (metis CongA_def Mid_cases P2 P22 P4 P6 symmetry_preserves_conga)
        ultimately show ?thesis
          using l11_30 by blast
      qed
      moreover have "C B OS E A"
      proof -
        have "C B TS E D'"
          using P2 P20 P4 l7_2 l9_2 mid_two_sides not_col_permutation_1 by blast
        moreover have "C B TS A D'"
          using P27 B C OS D A invert_two_sides l9_8_2 by blast
        ultimately show ?thesis
          using OS_def by blast
      qed
      ultimately show ?thesis
        using lea_in_angle by simp
    qed
    obtain A' where P30: "Bet C A' E  (A' = B  B Out A' A)" using P28 InAngle_def by auto
    {
      assume "A' = B"
      then have "Col D' C B"
        by (metis Col_def P2 P21 P30 P6 col_transitivity_1 midpoint_col)
      then have "False"
        by (simp add: P20)
      then have " Y. B Out A Y  C Out D Y" by auto
    }
    {
      assume P31: "B Out A' A"
      have " I. BetS D' C I  BetS B A' I"
      proof -
        have P32: "BetS B M C"
          using BetS_def Midpoint_def P10 P11 P2 by auto
        moreover have "BetS E M D'"
          using BetS_def Bet_cases P19 P21 P4 midpoint_bet not_col_distincts by fastforce
        moreover have "BetS C A' E"
        proof -
          have P32A: "C  A'"
            using P16 P31 out_col by auto
          {
            assume "A' = E"
            then have P33: "B Out A E"
              using P31 l6_6 by blast
            then have "A B C B C D SumA D' C D"
            proof -
              have "D' C B CongA A B C"
              proof -
                have "D' C M CongA E B M"
                  by (simp add: P22 conga_comm)
                moreover have "C Out D' D'"
                  using P13 out_trivial by auto
                moreover have "C Out B M"
                  using BetSEq Out_cases P32 bet_out_1 by blast
                moreover have "B Out A E"
                  using P33 by auto
                moreover have "B Out C M"
                  using BetSEq Out_def P32 by blast
                ultimately show ?thesis
                  using l11_10 by blast
              qed
              moreover have "D' C B B C D SumA D' C D"
                by (simp add: P27 l9_2 ts__suma_1)
              moreover have "B C D CongA B C D"
                using P6 P7 conga_refl by auto
              moreover have "D' C D CongA D' C D"
                using P13 P7 conga_refl by presburger
              ultimately show ?thesis
                using conga3_suma__suma by blast
            qed
            then have "D' C D CongA P Q R"
              using P1 suma2__conga by auto
            then have "Bet P Q R"
              using Bet_cases P3 bet_conga__bet midpoint_bet by blast
            then have "False" using P1 by simp
          }
          then have "A'  E" by auto
          then show ?thesis
            by (simp add: BetS_def P30 P32A)
        qed
        moreover have "¬ Col B C D'"
          by (simp add: P20 not_col_permutation_3)
        moreover have "Cong B M C M"
          using Midpoint_def P2 not_cong_1243 by blast
        moreover have "Cong E M D' M"
          using Cong_perm Midpoint_def P4 by blast
        ultimately show ?thesis
          using euclid_5_def assms by blast
      qed
      then obtain Y where P34: "Bet D' C Y  BetS B A' Y" using BetSEq by blast
      then have " Y. B Out A Y  C Out D Y"
      proof -
        have P35: "B Out A Y"
          by (metis BetSEq Out_def P31 P34 l6_7)
        moreover have "C Out D Y"
        proof -
          have "D  C"
            using P7 by auto
          moreover have "Y  C"
            using P16 P35 l6_6 out_col by blast
          moreover have "D'  C"
            using P13 by auto
          moreover have "Bet D C D'"
            by (simp add: P3 midpoint_bet)
          moreover have "Bet Y C D'"
            by (simp add: Bet_perm P34)
          ultimately show ?thesis
            using l6_2 by blast
        qed
        ultimately show ?thesis by auto
      qed
    }
    then have " Y. B Out A Y  C Out D Y"
      using P30 A' = B  Y. B Out A Y  C Out D Y by blast
  }
  then show ?thesis using euclid_s_parallel_postulate_def  by blast
qed

lemma tarski_s_euclid_implies_euclid_5:
  assumes "TarskiSParallelPostulate"
  shows "Euclid5"
proof -
  {
    fix P Q R S T U
    assume
      P1: "BetS P T Q  BetS R T S  BetS Q U R  ¬ Col P Q S  Cong P T Q T  Cong R T S T"
    have P1A: "BetS P T Q" using P1 by simp
    have P1B: "BetS R T S" using P1 by simp
    have P1C: "BetS Q U R" using P1 by simp
    have P1D: "¬ Col P Q S" using P1 by simp
    have P1E: "Cong P T Q T" using P1 by simp
    have P1F: "Cong R T S T" using P1 by simp
    obtain V where P2: "P Midpoint R V"
      using symmetric_point_construction by auto
    have P3: "Bet V P R"
      using Mid_cases P2 midpoint_bet by blast
    then obtain W where P4: "Bet P W Q  Bet U W V" using inner_pasch
      using BetSEq P1C by blast
    {
      assume "P = W"
      have "P  V"
        by (metis BetSEq Bet_perm Col_def Cong_perm Midpoint_def P1A P1B P1D P1E P1F 
            P2 between_trivial is_midpoint_id_2 l7_9)
      have "Col P Q S"
      proof -
        have f1: "Col V P R"
          by (meson Col_def P3)
        have f2: "Col U R Q"
          by (simp add: BetSEq Col_def P1)
        have f3: "Bet P T Q"
          using BetSEq P1 by fastforce
        have f4: "R = P  Col V P U"
          by (metis (no_types) Col_def P4 P = W P  V l6_16_1)
        have f5: "Col Q P T"
          using f3 by (meson Col_def)
        have f6: "Col T Q P"
          using f3 by (meson Col_def)
        have f7: "Col P T Q"
          using f3 by (meson Col_def)
        have f8: "Col P Q P"
          using Col_def P4 P = W by blast
        have "Col R T S"
          by (meson BetSEq Col_def P1)
        then have "T = P  Q = P"
          using f8 f7 f6 f5 f4 f2 f1 by (metis (no_types) BetSEq P1 P  V colx l6_16_1)
        then show ?thesis
          by (metis BetSEq P1)
      qed
      then have "False"
        by (simp add: P1D)
    }
    then have P5: "P  W" by auto
    have "Bet V W U"
      using Bet_cases P4 by auto
    then obtain X Y where P7: "Bet P V X  Bet P U Y  Bet X Q Y"
      using assms(1) P1 P4 P5 tarski_s_parallel_postulate_def by blast
    have "Q S Par P R"
    proof -
      have "Q  S"
        using P1D col_trivial_2 by auto
      moreover have "T Midpoint Q P"
        using BetSEq P1A P1E l7_2 midpoint_def not_cong_1243 by blast
      moreover have "T Midpoint S R"
        using BetSEq P1B P1F l7_2 midpoint_def not_cong_1243 by blast
      ultimately show ?thesis
        using l12_17 by auto
    qed
    then have P9: "Q S ParStrict P R"
      using P1D Par_def par_strict_symmetry par_symmetry by blast
    have P10: "Q S TS P Y"
    proof -
      have P10A: "P  R"
        using P9 par_strict_distinct by auto
      then have P11: "P  X"
        by (metis P2 P7 bet_neq12__neq midpoint_not_midpoint)
      have P12: "¬ Col X Q S"
      proof -
        have "Q S ParStrict P R"
          by (simp add: P9)
        then have "Col P R X"
          by (metis P2 P3 P7 bet_col between_symmetry midpoint_not_midpoint 
              not_col_permutation_4 outer_transitivity_between)
        then have "P X ParStrict Q S"
          using P9 Par_strict_perm P11 par_strict_col_par_strict by blast
        then show ?thesis
          using par_strict_not_col_2 by auto
      qed
      {
        assume W1: "Col Y Q S"
        have W2: "Q = Y"
          by (metis P12 P7 W1 bet_col bet_col1 colx)
        then have "¬ Col Q P R"
          using P9 W1 par_not_col by auto
        then have W3: "Q = U"
          by (smt BetS_def Col_def P1C P7 W2 col_transitivity_2)
        then have "False"
          using BetS_def P1C by auto
      }
      then have "¬ Col Y Q S" by auto
      then have "Q S TS X Y"
        by (metis P7 P12 bet__ts not_col_distincts not_col_permutation_1)
      moreover have "Q S OS X P"
      proof -
        have "P  V"
          using P10A P2 is_midpoint_id_2 by blast
        then have "Q S ParStrict P X"
          by (meson Bet_perm P3 P7 P9 P11 bet_col not_col_permutation_4 par_strict_col_par_strict)
        then have "Q S ParStrict X P"
          by (simp add: par_strict_right_comm)
        then show ?thesis
          by (simp add: l12_6)
      qed
      ultimately show ?thesis
        using l9_8_2 by auto
    qed
    then obtain I where W4: "Col I Q S  Bet P I Y"
      using TS_def by blast
    have " I. (BetS S Q I  BetS P U I)"
    proof -
      have "BetS P U I"
      proof -
        have "P  Y"
          using P10 not_two_sides_id by auto
        have W4A: "Bet P U I"
        proof -
          have W5: "Col P U I"
            using P7 W4 bet_col1 by auto
          {
            assume W6: "Bet U I P"
            have W7: "Q S OS P U"
            proof -
              have "Q S OS R U"
              proof -
                have "¬ Col Q S R"
                  using P9 par_strict_not_col_4 by auto
                moreover have "Q Out R U"
                  using BetSEq Out_def P1C by blast
                ultimately show ?thesis
                  by (simp add: out_one_side)
              qed
              moreover have "Q S OS P R"
                by (simp add: P9 l12_6)
              ultimately show ?thesis
                using one_side_transitivity by blast
            qed
            have W8: "I Out P U  ¬ Col Q S P"
              by (simp add: P1D not_col_permutation_1)
            have "False"
            proof -
              have "I Out U P"
                using W4 W6 W7 between_symmetry one_side_chara by blast
              then show ?thesis
                using W6 not_bet_and_out by blast
            qed
          }
          {
            assume V1: "Bet I P U"
            have "P R OS I U"
            proof -
              have "P R OS I Q"
              proof -
                {
                  assume "Q = I"
                  then have "Col P Q S"
                    by (metis BetSEq Col_def P1C P7 P9 V1 W4 between_equality 
                        outer_transitivity_between par_not_col)
                  then have "False"
                    using P1D by blast
                }
                then have "Q  I" by blast
                moreover have "P R ParStrict Q S"
                  using P9 par_strict_symmetry by blast
                moreover have "Col Q S I"
                  using Col_cases W4 by blast
                ultimately show ?thesis
                  using one_side_symmetry par_strict_all_one_side by blast
              qed
              moreover have "P R OS Q U"
              proof -
                have "Q S ParStrict P R"
                  using P9 by blast
                have "R Out Q U  ¬ Col P R Q"
                  by (metis BetSEq Bet_cases Out_def P1C calculation col124__nos)
                then show ?thesis
                  by (metis P7 V1 W4 Bet U I P  False between_equality 
                      col_permutation_2 not_bet_distincts out_col outer_transitivity_between)
              qed
              ultimately show ?thesis
                using one_side_transitivity by blast
            qed
            then have V2: "P Out I U"
              using P7 W4 bet2__out os_distincts by blast
            then have "Col P I U"
              using V1 not_bet_and_out by blast
            then have "False"
              using V1 V2 not_bet_and_out by blast
          }
          then moreover have "¬ (Bet U I P  Bet I P U)"
            using Bet U I P  False by auto
          ultimately show ?thesis
            using Col_def W5 by blast
        qed
        {
          assume "P = U"
          then have "Col P R Q"
            using BetSEq Col_def P1C by blast
          then have "False"
            using P9 par_strict_not_col_3 by blast
        }
        then have V6: "P  U" by auto
        {
          assume "U = I"
          have "Q = U"
          proof -
            have f1: "BetS Q I R"
              using P1C U = I by blast
            then have f2: "Col Q I R"
              using BetSEq Col_def by blast
            have f3: "Col I R Q"
              using f1 by (simp add: BetSEq Col_def)
            { assume "R  Q"
              moreover
              { assume "(R  Q  R  I)  ¬ Col I Q R"
                moreover
                { assume "p. (R  Q  ¬ Col I p I)  Col Q I p"
                  then have "I = Q"
                    using f1 by (metis (no_types) BetSEq Col_def col_transitivity_2) }
                ultimately have "(p pa. ((pa  I  ¬ Col pa p R)  Col Q I pa)  Col I pa p)  I = Q"
                  using f3 f2 by (metis (no_types) col_transitivity_2) }
              ultimately have "(p pa. ((pa  I  ¬ Col pa p R)  Col Q I pa)  Col I pa p)  I = Q"
                using f1 by (metis (no_types) BetSEq P9 W4 col_transitivity_2 par_strict_not_col_4) }
            then show ?thesis
              using f2 by (metis P9 W4 U = I col_transitivity_2 par_strict_not_col_4)
          qed
          then have "False"
            using BetSEq P1C by blast
        }
        then have "U  I" by auto
        then show ?thesis
          by (simp add: W4A V6 BetS_def)
      qed
      moreover have "BetS S Q I"
      proof -
        have "Q R TS S I"
        proof -
          have "Q R TS P I"
          proof -
            have "¬ Col P Q R"
              using P9 col_permutation_5 par_strict_not_col_3 by blast
            moreover have "¬ Col I Q R"
            proof -
              {
                assume "Col I Q R"
                then have "Col Q S R"
                proof -
                  have f1: "p pa pb. Col p pa pb  ¬ BetS pb p pa"
                    by (meson BetSEq Col_def)
                  then have f2: "Col U I P"
                    using BetS P U I by blast
                  have f3: "Col I P U"
                    by (simp add: BetSEq Col_def BetS P U I)
                  have f4: "p. (U = Q  Col Q p R)  ¬ Col Q U p"
                    by (metis BetSEq Col_def P1C col_transitivity_1)
                  { assume "P  Q"
                    moreover
                    { assume "(P  Q  U  Q)  Col Q P Q"
                      then have "(P  Q  U  Q)  ¬ Col Q P R"
                        using Col_cases ¬ Col P Q R by blast
                      moreover
                      { assume "p. ((U  Q  P  Q)  ¬ Col Q p P)  Col Q P p"
                        then have "U  Q  ¬ Col Q P P"
                          by (metis col_transitivity_1)
                        then have "¬ Col U Q P"
                          using col_transitivity_2 by blast }
                      ultimately have "¬ Col U Q P  I  Q"
                        using f4 f3 by blast }
                    ultimately have "I  Q"
                      using f2 f1 by (metis BetSEq P1C col_transitivity_1 col_transitivity_2) }
                  then have "I  Q"
                    using BetSEq BetS P U I by blast
                  then show ?thesis
                    by (simp add: W4 Col I Q R col_transitivity_2)
                qed
                then have "False"
                  using P9 par_strict_not_col_4 by blast
              }
              then show ?thesis by blast
            qed
            moreover have "Col U Q R"
              using BetSEq Bet_cases Col_def P1C by blast
            moreover have "Bet P U I"
              by (simp add: BetSEq BetS P U I)
            ultimately show ?thesis
              using TS_def by blast
          qed
          moreover have "Q R OS P S"
          proof -
            have "Q R Par P S"
            proof -
              have "Q  R"
                using BetSEq P1 by blast
              moreover have "T Midpoint Q P"
                using BetSEq Bet_cases P1A P1E cong_3421 midpoint_def by blast
              moreover have "T Midpoint R S"
                using BetSEq P1B P1F midpoint_def not_cong_1243 by blast
              ultimately show ?thesis
                using l12_17 by blast
            qed
            then have "Q R ParStrict P S"
              by (simp add: P1D Par_def not_col_permutation_4)
            then show ?thesis
              using l12_6 by blast
          qed
          ultimately show ?thesis
            using l9_8_2 by blast
        qed
        then show ?thesis
          by (metis BetS_def W4 col_two_sides_bet not_col_permutation_2 ts_distincts)
      qed
      ultimately show ?thesis
        by auto
    qed
  }
  then show ?thesis using euclid_5_def by blast
qed

lemma tarski_s_implies_euclid_s_parallel_postulate:
  assumes "TarskiSParallelPostulate"
  shows "EuclidSParallelPostulate"
  by (simp add: assms euclid_5__original_euclid tarski_s_euclid_implies_euclid_5)

theorem tarski_s_euclid_implies_playfair_s_postulate:
  assumes "TarskiSParallelPostulate"
  shows "PlayfairSPostulate"
proof -
  {
    fix A1 A2 B1 B2 P C1 C2
    assume P1: "¬ Col P A1 A2  A1 A2 Par B1 B2  Col P B1 B2  A1 A2 Par C1 C2  Col P C1 C2"
    have P1A: "¬ Col P A1 A2"
      by (simp add: P1)
    have P2: "A1 A2 Par B1 B2"
      by (simp add: P1)
    have P3: "Col P B1 B2"
      by (simp add: P1)
    have P4: "A1 A2 Par C1 C2"
      by (simp add: P1)
    have P5: "Col P C1 C2"
      by (simp add: P1)
    have P6: "A1 A2 ParStrict B1 B2"
    proof -
      have "A1 A2 Par B1 B2"
        by (simp add: P1)
      moreover have "Col B1 B2 P"
        using P3 not_col_permutation_2 by blast
      moreover have "¬ Col A1 A2 P"
        by (simp add: P1A not_col_permutation_1)
      ultimately show ?thesis
        using par_not_col_strict by auto
    qed
    have P7: "A1 A2 ParStrict C1 C2"
    proof -
      have "A1 A2 Par C1 C2"
        by (simp add: P1)
      moreover have "Col C1 C2 P"
        using Col_cases P1 by blast
      moreover have "¬ Col A1 A2 P"
        by (simp add: P1A not_col_permutation_1)
      ultimately show ?thesis
        using par_not_col_strict by auto
    qed
    {
      assume "¬ Col C1 B1 B2  ¬ Col C2 B1 B2"
      have " C'. Col C1 C2 C'  B1 B2 TS A1 C'"
      proof -
        have T2: "Coplanar A1 A2 P A1"
          using ncop_distincts by auto
        have T3: "Coplanar A1 A2 B1 B2"
          by (simp add: P1 par__coplanar)
        have T4: "Coplanar A1 A2 C1 C2"
          by (simp add: P7 pars__coplanar)
        have T5: "Coplanar A1 A2 P B1"
          using P1 col_trivial_2 ncop_distincts par__coplanar par_col2_par_bis by blast
        then have T6: "Coplanar A1 A2 P B2"
          using P3 T3 col_cop__cop by blast
        have T7: "Coplanar A1 A2 P C1"
          using P1 T4 col_cop__cop coplanar_perm_1 not_col_permutation_2 par_distincts by blast
        then have T8: "Coplanar A1 A2 P C2"
          using P5 T4 col_cop__cop by blast
        {
          assume "¬ Col C1 B1 B2"
          moreover have "C1  C2"
            using P1 par_neq2 by auto
          moreover have "Col B1 B2 P"
            using P1 not_col_permutation_2 by blast
          moreover have "Col C1 C2 P"
            using Col_cases P5 by auto
          moreover have "¬ Col B1 B2 C1"
            using Col_cases calculation(1) by auto
          moreover have "¬ Col B1 B2 A1"
            using P6 par_strict_not_col_3 by auto
          moreover have "Coplanar B1 B2 C1 A1"
            using Col_cases P1A T5 T2 T6 T7 coplanar_pseudo_trans by blast
          ultimately have " C'. Col C1 C2 C'  B1 B2 TS A1 C'"
            using cop_not_par_other_side by blast
        }
        {
          assume "¬ Col C2 B1 B2"
          moreover have "C2  C1"
            using P1 par_neq2 by blast
          moreover have "Col B1 B2 P"
            using Col_cases P3 by auto
          moreover have "Col C2 C1 P"
            using Col_cases P5 by auto
          moreover have "¬ Col B1 B2 C2"
            by (simp add: calculation(1) not_col_permutation_1)
          moreover have "¬ Col B1 B2 A1"
            using P6 par_strict_not_col_3 by auto
          moreover have "Coplanar B1 B2 C2 A1"
            using Col_cases P1A T2 T5 T6 T8 coplanar_pseudo_trans by blast
          ultimately have " C'. Col C1 C2 C'  B1 B2 TS A1 C'" using cop_not_par_other_side
            by (meson not_col_permutation_4)
        }
        then show ?thesis
          using ¬ Col C1 B1 B2  C'. Col C1 C2 C'  B1 B2 TS A1 C' ¬ Col C1 B1 B2  ¬ Col C2 B1 B2 by blast
      qed
      then obtain C' where W1: "Col C1 C2 C'  B1 B2 TS A1 C'" by auto
      then have W2: "¬ Col A1 B1 B2"
        using TS_def by blast
      obtain B where W3: "Col B B1 B2  Bet A1 B C'"
        using TS_def W1 by blast
      obtain C where W4: "P Midpoint C' C"
        using symmetric_point_construction by blast
      then have W4A: "Bet A1 B C'  Bet C P C'"
        using Mid_cases W3 midpoint_bet by blast
      then obtain D where W5: "Bet B D C  Bet P D A1" using inner_pasch by blast
      have W6: "C'  P"
        using P3 TS_def W1 by blast
      then have "A1 A2 Par C' P"
        by (meson P1 W1 not_col_permutation_2 par_col2_par)
      have W9: "A1 A2 ParStrict C' P"
        using Col_cases P5 P7 W1 W6 par_strict_col2_par_strict by blast
      then have W10: "B  P"
        by (metis W6 W4A bet_out_1 out_col par_strict_not_col_3)
      have W11: "P  C"
        using W6 W4 is_midpoint_id_2 by blast
      {
        assume "P = D"
        then have "False"
          by (metis Col_def P3 W1 W3 W4A W5 W10 W11 col_trivial_2 colx l9_18_R1)
      }
      then have "P  D" by auto
      then obtain X Y where W12: "Bet P B X  Bet P C Y  Bet X A1 Y"
        using W5 assms tarski_s_parallel_postulate_def by blast
      then have "P  X"
        using W10 bet_neq12__neq by auto
      then have "A1 A2 ParStrict P X"
        by (metis Col_cases P3 P6 W10 W12 W3 bet_col colx par_strict_col2_par_strict)
      then have W15: "A1 A2 OS P X"
        by (simp add: l12_6)
      have "P  Y"
        using W11 W12 between_identity by blast
      then have "A1 A2 ParStrict P Y"
        by (metis Col_def W11 W12 W4A W9 col_trivial_2 par_strict_col2_par_strict)
      then have W16: "A1 A2 OS P Y"
        using l12_6 by auto
      have "Col A1 X Y"
        by (simp add: W12 bet_col col_permutation_4)
      then have "A1 Out X Y" using col_one_side_out W15 W16
        using one_side_symmetry one_side_transitivity by blast
      then have "False"
        using W12 not_bet_and_out by blast
    }
    then have "Col C1 B1 B2  Col C2 B1 B2"
      by auto
  }
  {
    fix A1 A2 B1 B2 P C1 C2
    assume P1: "Col P A1 A2  A1 A2 Par B1 B2  Col P B1 B2  A1 A2 Par C1 C2  Col P C1 C2"
    have "Col C1 B1 B2"
      by (smt P1 l9_10 not_col_permutation_3 not_strict_par2 par_col2_par par_comm par_id_5 par_symmetry ts_distincts)
    moreover have "Col C2 B1 B2"
      by (smt P1 l9_10 not_col_permutation_3 not_strict_par2 par_col2_par par_id_5 par_left_comm par_symmetry ts_distincts)
    ultimately have "Col C1 B1 B2  Col C2 B1 B2" by auto
  }
  then show ?thesis
    using playfair_s_postulate_def
    by (metis P C2 C1 B2 B1 A2 A1. ¬ Col P A1 A2  A1 A2 Par B1 B2  Col P B1 B2  A1 A2 Par C1 C2  Col P C1 C2  Col C1 B1 B2  Col C2 B1 B2)
qed

lemma tarski_s_euclid_remove_degenerated_cases:
  assumes " A B C D T. A  B  A  C  A  D  
                        A  T  B  C  B  D  B  T  C  D 
                        C  T  D  T  ¬ Col A B C  Bet A D T 
                        Bet B D C  ¬ Col B C T  
     ( x y. (Bet A B x  Bet A C y  Bet x T y))"
  shows " A B C D T. Bet A D T  Bet B D C  A  D  
                         ( x y. (Bet A B x  Bet A C y  Bet x T y))" 
proof -
  {
    fix A B C D T
    assume P1: "Bet A D T  Bet B D C  A  D"
    hence P2: "Bet A D T" 
      by auto
    have P3: "Bet B D C"
      by (simp add: P1)
    have P4: "A  D"
      using P1 by blast 
    have "( x y. (Bet A B x  Bet A C y  Bet x T y))" 
    proof cases
      assume "A = B"
      thus ?thesis
        using between_trivial between_trivial2 by blast 
    next
      assume P5: "A  B"
      thus ?thesis 
      proof cases
        assume "A = C"
        thus ?thesis
          using between_trivial between_trivial2 by auto 
      next
        assume P6: "A  C"
        thus ?thesis 
        proof cases
          assume "A = T"
          thus ?thesis
            using Bet A D T  Bet B D C  A  D between_identity by blast
        next
          assume P7: "A  T"
          thus ?thesis 
          proof cases
            assume "B = C"            
            thus ?thesis
              using Bet A D T  Bet B D C  A  D between_identity 
                between_trivial2 by blast
          next
            assume P8: "B  C"
            thus ?thesis
            proof cases
              assume "B = D"
              thus ?thesis
                using Bet A D T  Bet B D C  A  D between_trivial2 
                  segment_construction by blast
            next
              assume P9: "B  D"
              thus ?thesis
              proof cases
                assume "B = T"
                thus ?thesis
                  using between_trivial between_trivial2 by blast
              next
                assume P10: "B  T"
                thus ?thesis 
                proof cases
                  assume "C = D"
                  thus ?thesis
                    using Bet A D T  Bet B D C  A  D between_trivial by blast
                next
                  assume P11: "C  D"
                  thus ?thesis
                  proof cases
                    assume "C = T"
                    thus ?thesis
                      using between_trivial by blast
                  next
                    assume P12: "C  T"
                    thus ?thesis
                    proof cases
                      assume "D = T"
                      thus ?thesis
                        using Bet A D T  Bet B D C  A  D between_trivial by blast
                    next
                      assume P13: "D  T"
                      {
                        assume "Col A B C"
                        have "Bet A B C  ?thesis" 
                          by (metis Bet A D T Bet B D C between_equality 
                              between_exchange2 between_exchange3 between_exchange4 
                              between_trivial between_trivial2 l5_3) 
                        moreover
                        have "Bet B C A  ?thesis"
                          by (meson Bet_perm P1 between_exchange3 between_exchange4 
                              between_trivial) 
                        moreover
                        have "Bet C A B ?thesis"                       
                          by (metis between_exchange3 Bet_perm P1 
                              between_exchange2 l5_3 
                              between_exchange4 between_trivial 
                              between_trivial2 l5_1)
                        ultimately
                        have "?thesis"
                          using Col_def Col A B C by blast 
                      }
                      moreover
                      {
                        assume P14: "¬ Col A B C"
                        {
                          assume "Col B C T"
                          hence "D = T" 
                            by (meson P1 P14 bet_col col_permutation_2 
                                col_permutation_5 colx)
                          hence False
                            by (simp add: P13)
                        }
                        hence "?thesis" 
                          using assms P14 P13 P2 P3 P4 P5 P6 P7 P8 
                            P9 P10 P11 P12 by blast
                      }
                      ultimately
                      show ?thesis
                        by blast 
                    qed
                  qed
                qed
              qed
            qed
          qed
        qed
      qed
    qed
  }
  thus ?thesis by auto
qed

(* alternate_interior_angles_consecutive_interior_angles.*)
(*
(** This is the converse of l12_21_b.
    The alternate interior angles between two parallel lines are congruent. *)

*)

(** The consecutive interior angles between two parallel lines are supplementary. *)

lemma alternate_interior__consecutive_interior:
  assumes "AlternateInteriorAnglesPostulate"
  shows "ConsecutiveInteriorAnglesPostulate" 
proof -
  {
    fix A B C D
    assume "B C OS A D  A B Par C D"
    hence "A  B"
      using os_distincts by blast 
    obtain A' where P3: "Bet A B A'  Cong B A' B A"
      using segment_construction by blast
    have "¬ Col B C A"
      using B C OS A D  A B Par C D l9_19 not_col_distincts by blast 
    hence "B C TS A A'"
      using P3 A  B bet__ts cong_diff_4 by blast 
    hence "B C TS A' D"
      by (meson l9_8_2 B C OS A D  A B Par C D l9_2)  
    hence "B C D CongA C B A'" 
      by (metis (full_types) P3 Par_cases l9_2 
          B C OS A D  A B Par C D alternate_interior_angles_postulate_def 
          assms bet_col bet_col1 conga_comm invert_two_sides 
          par_col2_par ts_distincts) 
    hence "A B C SuppA B C D"
      using P3 SuppA_def A  B by auto
  }
  thus ?thesis
    using consecutive_interior_angles_postulate_def by blast
qed

(*alter...→playfairbis*)

lemma alternate_interior__playfair_aux_1:
  assumes "A1 A2 Par C1 C2" and
    "Col P C1 C2" and
    "Col P P1 P2" and
    "P1 P2 Perp A1 A2" and
    "Col Q A1 A2" 
  shows "Coplanar P Q A1 C1" 
proof -
  have "Coplanar A1 A2 C1 C1" 
    using ncop_distincts by blast
  moreover have "Coplanar A1 A2 C1 A1" 
    using ncop_distincts by blast
  moreover have "Coplanar A1 A2 C1 Q" 
    using Col_cases assms(5) ncop__ncols by blast
  moreover have "Coplanar A1 A2 C1 P" 
    using assms(1) assms(2) col_cop__cop col_permutation_1 
      par__coplanar par_neq2 by blast
  ultimately show ?thesis 
    by (metis assms(1) assms(5) col_cop__cop col_permutation_1 
        ncoplanar_perm_16 ncoplanar_perm_19 par_neq1)
qed

lemma alternate_interior__playfair_aux_2:
  assumes "A1 A2 Par C1 C2" and
    "Col P C1 C2" and
    "Col Q A1 A2" and
    "Col B1 B2 B3" and 
    "¬ Col A1 A2 P" and
    "Col P B1 B2" and
    "Coplanar A1 A2 B1 B2" and
    "A1 A2 ParStrict B1 B2" 
  shows "Coplanar P Q C1 B3" 
proof -
  have "Coplanar A1 A2 P Q"
    using assms(3) Col_cases ncop__ncols by blast
  moreover have "Coplanar A1 A2 P B3"
    using NCol_perm col2_cop__cop par_strict_neq2 
      assms(4) assms(6) assms(7) assms(8) by blast
  moreover have "Coplanar A1 A2 P P" 
    using ncop_distincts by blast
  moreover have "Coplanar A1 A2 P C1" 
    using assms(1) assms(2) 
    by (metis col_cop__cop coplanar_perm_1 not_col_permutation_2 
        par__coplanar par_neq2)
  ultimately show ?thesis 
    using assms(5) coplanar_pseudo_trans by presburger
qed

lemma alternate_interior__playfair_aux:
  assumes "alternate_interior_angles_postulate"
  shows " A1 A2 B1 B2 C1 C2 P.
   (P Perp2 A1 A2 B1 B2  ¬ Col A1 A2 P  Col P B1 B2  
Coplanar A1 A2 B1 B2 
   A1 A2 Par C1 C2  Col P C1 C2) 
   Col C1 B1 B2"
proof -
  {
    fix A1 A2 B1 B2 C1 C2 P
    assume 1: "P Perp2 A1 A2 B1 B2" and
      2: "¬ Col A1 A2 P" and
      3: "Col P B1 B2" and
      4: "Coplanar A1 A2 B1 B2" and
      5: "A1 A2 Par C1 C2" and
      6: "Col P C1 C2"
    have "Col C1 B1 B2" 
    proof cases
      assume "P = C1"
      thus ?thesis
        using "3" by blast 
    next
      assume "P  C1"
      have "A1 A2 ParStrict B1 B2"
        using "1" "2" "3" "4" col_cop_perp2__pars_bis col_permutation_1 by blast
      have "A1 A2 ParStrict C1 C2"
        using "2" "5" "6" col_permutation_1 par_not_col_strict by blast
      obtain P1 P2 where P1: "Col P P1 P2  P1 P2 Perp A1 A2  P1 P2 Perp B1 B2"
        using 1 Perp2_def by blast 
      hence "Col P P1 P2" 
        by blast
      have P1A: "P1 P2 Perp A1 A2"
        using P1 by blast
      then obtain Q where P1B: "Col Q P1 P2  Col Q A1 A2" 
        using Perp_def by (meson NCol_cases perp_inter_perp_in_n) 
      hence P1C: "Col Q P1 P2" 
        by blast
      have P1D: "Col Q A1 A2" 
        using P1B by blast
      have "P1 P2 Perp B1 B2"
        using P1 by blast
      then obtain P' where P2: "P' PerpAt P1 P2 B1 B2"
        using perp_inter_perp_in_n by blast 
      hence "P = P'"
        using "3" Col P P1 P2 l8_14_2_1b by blast 
      have "P  Q"
        using "2" NCol_cases Col Q P1 P2  Col Q A1 A2 by blast
      hence "A1 A2 Perp P Q"
        using perp_col0 P1A Perp_cases Col P P1 P2 
          Col Q P1 P2  Col Q A1 A2 not_col_permutation_3 by blast 
      have "B1 B2 Perp P Q"
        using perp_col0 
        by (meson P1 Col Q P1 P2  Col Q A1 A2 P  Q 
            col_permutation_3 perp_left_comm) 
      have "¬ Col Q C1 P"
        using "6" A1 A2 ParStrict C1 C2 Col Q P1 P2  Col Q A1 A2 
          P  C1 col_trivial_2 colx par_not_col by blast
      obtain B3 where P4: "Col B1 B2 B3  B3  P"
        using col_trivial_2 diff_col_ex by blast 
      hence P4A: "Col B1 B2 B3"
        by blast
      have "B3  P" 
        using P4 by blast
      have "Q  C1"
        using ¬ Col Q C1 P col_trivial_1 by blast 
      have "A1  A2"
        using "2" col_trivial_1 by blast
      have "A2  P"
        using "2" col_trivial_2 by blast
      have "A1  P"
        using "2" col_trivial_3 by auto
      have "B1  B2"
        using P1 P2 Perp B1 B2 perp_distinct by blast
      have "A1  B1"
        using A1 A2 ParStrict B1 B2 col_trivial_3 par_strict_not_col_1 by blast 
      have "A1  B2"
        using A1 A2 ParStrict B1 B2 col_trivial_1 col_trivial_3 par_not_col by blast
      have "A2  B1"
        using A1 A2 ParStrict B1 B2 col_trivial_2 par_strict_not_col_1 by blast
      have "A2  B2"
        using A1 A2 ParStrict B1 B2 col_trivial_2 par_strict_not_col_4 by blast
      have "A1  C1"
        using A1 A2 ParStrict C1 C2 not_par_strict_id by blast
      have "A1  C2"
        using A1 A2 ParStrict C1 C2 col_trivial_3 par_strict_not_col_4 by blast
      have "A2  C1"
        using Par_strict_cases A1 A2 ParStrict C1 C2 not_par_strict_id by blast
      have "A2  C2"
        using Par_strict_cases A1 A2 ParStrict C1 C2 not_par_strict_id by blast
      have "C1  C2"
        using "5" par_distincts by blast
      have "Col P C1 B3" 
      proof -
        have "Per C1 P Q" 
        proof -
          have " A3. Col A1 A2 A3  P Q TS C1 A3"
          proof cases
            assume "Col P Q A1"
            have "A2  A1"
              using A1  A2 by auto 
            moreover
            have "Col P Q Q"
              by (simp add: col_trivial_2) 
            moreover
            have "Col A2 A1 Q"
              by (simp add: P1D col_permutation_3) 
            moreover
            have "¬ Col P Q A2"
              using "2" Col P Q A1 P  Q col3 col_trivial_3 by blast
            moreover
            have "¬ Col P Q C1"
              using NCol_cases ¬ Col Q C1 P by blast 
            moreover
            have "Coplanar P Q A2 C1"
              by (metis "5" "6" P1D Col P Q A1 P  C1 
                  calculation(2) calculation(4) col_permutation_1 colx 
                  coplanar_perm_18 par__coplanar par_col_par)
            ultimately
            have " Q0. Col A2 A1 Q0  P Q TS C1 Q0" 
              using cop_not_par_other_side by blast
            thus ?thesis
              using col_permutation_4 by blast  
          next
            assume "¬ Col P Q A1"
            have "A1  A2"
              by (simp add: A1  A2) 
            moreover
            have "Col P Q Q"
              using col_trivial_2 by auto 
            moreover
            have "Col A1 A2 Q"
              by (simp add: P1D col_permutation_2) 
            moreover
            {
              assume "Col P' Q A1"
              hence "Col A1 P1 P2" 
                using P = P' ¬ Col P Q A1 by auto
              hence "A1 = Q" 
                using Col P' Q A1 P = P' ¬ Col P Q A1 by auto
              hence "False"
                using ¬ Col P Q A1 col_trivial_2 by blast
            }
            hence "¬ Col P Q A1"
              using P = P' by blast 
            moreover
            have "¬ Col P Q C1"
              using NCol_cases ¬ Col Q C1 P by blast 
            moreover
            have "Coplanar P Q A1 C1"
              using alternate_interior__playfair_aux_1 5 6 P1 P1A P1D by blast
            ultimately
            show ?thesis 
              using cop_not_par_other_side by blast
          qed
          then obtain A3 where "Col A1 A2 A3  P Q TS C1 A3" 
            by blast
          hence "¬ Col A3 P Q"
            using TS_def by blast
          have "A3  P"
            using "2" Col A1 A2 A3  P Q TS C1 A3 by auto 
          have "A3  Q"
            using ¬ Col A3 P Q col_trivial_3 by blast 
          have "C1  A3"
            using Col A1 A2 A3  P Q TS C1 A3 ts_distincts by blast 
          have "Q A3 Perp P Q"
          proof -
            have "A1 A2 Perp P Q"
              using A1 A2 Perp P Q by blast 
            moreover
            have "Q  A3"
              using ¬ Col A3 P Q col_trivial_3 by blast
            moreover
            have "Col A1 A2 Q"
              using NCol_cases P1B by blast
            moreover
            have "Col A1 A2 A3"
              using Col A1 A2 A3  P Q TS C1 A3 by blast 
            ultimately
            show ?thesis
              using perp_col2 by blast 
          qed
          hence "Per A3 Q P"
            by (simp add: perp_per_1) 
          moreover
          have "C1 P Q CongA A3 Q P"
          proof -
            have "P Q TS C1 A3"
              by (simp add: Col A1 A2 A3  P Q TS C1 A3) 
            moreover
            have "P C1 Par Q A3" 
            proof -
              have "P  C1"
                by (simp add: P  C1) 
              moreover 
              have "Q  A3"
                using ¬ Col A3 P Q col_trivial_3 by blast 
              moreover
              have "C1 C2 Par A1 A2"
                by (simp add: "5" par_symmetry) 
              moreover
              have "Col C1 C2 P"
                by (simp add: "6" col_permutation_1) 
              moreover
              have "Col C1 C2 C1"
                by (simp add: col_trivial_3) 
              moreover
              have "Col A1 A2 Q"
                using NCol_cases P1B by blast 
              moreover
              have "Col A1 A2 A3"
                by (simp add: Col A1 A2 A3  P Q TS C1 A3) 
              ultimately
              show ?thesis
                using par_col4__par by blast 
            qed
            ultimately
            show ?thesis 
              using assms(1) alternate_interior_angles_postulate_def by blast 
          qed
          hence "A3 Q P CongA C1 P Q"
            by (simp add: conga_sym) 
          ultimately
          show ?thesis 
            using l11_17 by blast 
        qed
        hence "P C1 Perp P Q"
          using P  C1 P  Q per_perp perp_left_comm by auto 
        moreover
        have "P B3 Perp P Q" 
        proof -
          have "B1 B2 Perp P Q"
            by (simp add: B1 B2 Perp P Q) 
          moreover
          have "P  B3"
            using B3  P by fastforce 
          moreover
          have "Col B1 B2 P"
            using "3" not_col_permutation_2 by blast 
          moreover
          have "Col B1 B2 B3"
            using P4A by auto 
          ultimately
          show ?thesis 
            using perp_col2 by blast
        qed
        moreover
        have "Coplanar P Q C1 B3" 
          using P1D P4A 2 3 4 5 6 alternate_interior__playfair_aux_2 
            A1 A2 ParStrict B1 B2 by blast
        ultimately
        show ?thesis 
          using cop_perp2__col by blast
      qed
      thus ?thesis
        using "3" P4 colx not_col_permutation_1 by blast 
    qed
  }
  thus ?thesis by blast
qed

lemma alternate_interior__playfair_bis:
  assumes "alternate_interior_angles_postulate"
  shows "alternative_playfair_s_postulate" 
proof -
  {
    fix A1 A2 B1 B2 C1 C2 P
    assume 1: "P Perp2 A1 A2 B1 B2" and 
      2: "¬ Col A1 A2 P" and
      3: "Col P B1 B2" and
      4: "Coplanar A1 A2 B1 B2" and
      5: "A1 A2 Par C1 C2" and
      6: "Col P C1 C2"
    have "Col C1 B1 B2" 
      using alternate_interior__playfair_aux assms(1) 1 2 3 4 5 6 
      by blast
    moreover
    have "Col C2 B1 B2" 
      using alternate_interior__playfair_aux assms(1) 1 2 3 4 5 6 
      by (meson col_permutation_5 par_right_comm) 
    ultimately
    have "Col C1 B1 B2  Col C2 B1 B2" 
      by blast
  }
  thus ?thesis
    using alternative_playfair_s_postulate_def by blast 
qed

lemma alternate_interior__proclus_aux:
  assumes "greenberg_s_axiom" and
    "alternate_interior_angles_postulate"
  shows " A C D P Q. (P A ParStrict C D  C D Perp P C  
                         P A OS C Q  P C OS Q A  P C OS Q D)
                        
                        ( Y. Col P Q Y  Col C D Y)"
proof -
  {
    fix A C D P Q
    assume 1: "P A ParStrict C D" and
      2: "C D Perp P C" and 
      3: "P A OS C Q" and
      4: "P C OS Q A" and
      5: "P C OS Q D"
    obtain D' where P1: "Bet D C D'  Cong D C C D'"
      using Cong_perm segment_construction by blast
    hence "Bet D C D'"
      by blast 
    have "Cong D C C D'"
      using P1 by blast 
    have "C  D"
      using "1" par_strict_neq2 by auto 
    have "C  D'"
      using C  D Cong D C C D' cong_identity by blast 
    have "P  Q"
      using "3" col124__nos col_trivial_3 by blast 
    have "P  A"
      using "3" col124__nos not_col_distincts by blast 
    have "¬ Col P A Q"
      using "3" one_side_not_col124 by auto
    have "¬ Col P C Q"
      using "4" one_side_not_col123 by auto
    have "¬ Col P C D"
      using "5" one_side_not_col124 by blast 
    have "A P Q LtA A P C"
      by (meson "3" "4" col_permutation_3 col_permutation_5 
          inangle__lta l9_2 l9_9 one_side_not_col123 os_ts__inangle 
          two_sides_cases)
    have "P C OS D A"
      using "4" "5" one_side_symmetry one_side_transitivity by blast
    have "Per A P C" 
    proof -
      have "Per P C D'"
        using "2" P1 Perp_cases C  D' bet_col bet_col1 
          perp_col2_bis perp_per_2 by blast 
      moreover
      have "P C D' CongA A P C" 
      proof -
        have "P C TS D D'"
          by (simp add: Bet D C D' C  D' ¬ Col P C D 
              bet__ts invert_two_sides not_col_permutation_4) 
        hence "P C TS A D'"
          using P C OS D A l9_8_2 by blast 
        moreover
        have "P A Par C D'"
          by (meson "1" Par_def Bet D C D' C  D' bet_col
              bet_col1 par_strict_col2_par_strict par_strict_right_comm) 
        ultimately
        show ?thesis
          using alternate_interior_angles_postulate_def assms(2) 
            conga_left_comm conga_sym by blast 
      qed
      ultimately
      show ?thesis
        using l11_17 by blast 
    qed
    hence "Acute A P Q" 
      using A P Q LtA A P C Acute_def by blast 
    have "¬ Col A P Q"
      by (simp add: ¬ Col P A Q not_col_permutation_4) 
    have "Per P C D"
      using "2" Perp_perm perp_per_1 by blast 
    then obtain S where P2: "P S C LtA A P Q  C Out S D" 
      using Acute A P Q ¬ Col A P Q C  D assms(1) 
        greenberg_s_axiom_def by blast 
    hence "P S C LtA A P Q" 
      by blast
    have "C Out S D"
      using P2 by blast
    have "P C OS S D"
      using C Out S D ¬ Col P C D col_permutation_4 
        invert_one_side out_one_side by blast
    have "Q InAngle C P S" 
    proof -
      have "P C OS S Q"
        using "5" P C OS S D one_side_symmetry 
          one_side_transitivity by blast 
      moreover
      have "P S OS C Q" 
      proof -
        have "P C OS S A"
          using "4" calculation one_side_transitivity by blast
        hence "P A ParStrict S C"
          by (metis "1" Out_cases C Out S D os_distincts 
              out_col par_strict_col_par_strict par_strict_comm 
              par_strict_left_comm)
        hence "P S TS C A"
          by (simp add: P C OS S A l12_6 l9_31) 
        moreover
        have "A P S CongA C S P"
          using assms(2) alternate_interior_angles_postulate_def 
          by (meson par_strict_par P A ParStrict S C calculation l9_2) 
        have "A P S LtA A P Q" 
          using conga_preserves_lta 
          by (metis A P S CongA C S P P S C LtA A P Q 
              P  A P  Q conga_right_comm conga_sym 
              nlta or_lta2_conga)
        hence P4: "A P S LeA A P Q  ¬ A P S CongA A P Q"
          using lta__lea not_lta_and_conga by auto 
        hence "A P S LeA A P Q"
          by blast
        have "¬ A P S CongA A P Q"
          using P4 by blast
        have "P S TS Q A" 
        proof -
          {
            assume "Col P Q S"
            have "P C OS Q S"
              by (simp add: P C OS S Q one_side_symmetry) 
            hence "P Out Q S"
              using Col P Q S col_one_side_out by blast 
            have "P Out A A"
              using P  A out_trivial by auto 
            hence "False" 
              using out2__conga P Out Q S ¬ A P S CongA A P Q by blast 
          }
          hence "¬ Col P Q S" 
            by auto
          moreover
          have "A P OS Q S"
            using "3" P C OS S A P S TS C A invert_one_side 
              one_side_symmetry one_side_transitivity 
              os_ts1324__os by blast 
          hence "S InAngle Q P A" 
            using l11_24 lea_in_angle A P S LeA A P Q by blast 
          ultimately
          show ?thesis
            by (metis NCol_cases TS_def P S TS C A in_angle_two_sides) 
        qed
        ultimately
        show ?thesis
          using l9_8_1 by blast
      qed
      ultimately
      show ?thesis
        using os2__inangle by blast 
    qed
    then obtain Y where P3: "Bet C Y S  (Y = P  P Out Y Q)"
      using InAngle_def by auto
    hence "Bet C Y S"
      by blast
    have "Y = P  P Out Y Q"
      using P3 by blast
    have P4: "Col P Q Y"
      using Y = P  P Out Y Q col_permutation_5 col_trivial_3 out_col by blast 
    have "Col C D Y"
      by (meson Bet_cases Col_def Out_def Bet C Y S 
          C Out S D bet_col1 between_exchange4) 
    hence " Y. Col P Q Y  Col C D Y" 
      using P4 by blast
  }
  thus ?thesis by blast
qed

lemma alternate_interior__proclus:
  assumes "greenberg_s_axiom" and
    "alternate_interior_angles_postulate"
  shows "proclus_postulate"
proof -
  {
    fix A B C D P Q
    assume 1: "A B Par C D" and
      2: "Col A B P" and
      3: "¬ Col A B Q" and 
      4: "Coplanar C D P Q"
    have "Col C D P  ( Y. Col P Q Y  Col C D Y)"
      using col_trivial_3 by blast 
    moreover
    {
      assume "¬ Col C D P"
      hence "A B ParStrict C D"
        using "1" "2" par_not_col_strict par_strict_symmetry par_symmetry by blast 
      obtain C0 where P4: "Col C D C0  C D Perp P C0" 
        using l8_18_existence ¬ Col C D P by blast 
      have "Col P Q C0  ( Y. Col P Q Y  Col C D Y)"
        using Col C D C0  C D Perp P C0 by blast 
      moreover
      {
        assume "¬ Col P Q C0"
        have " Q1. Col Q P Q1  A B OS C0 Q1" 
        proof -
          have "Q  P"
            using "2" "3" by blast 
          moreover
          have "Col A B P"
            by (simp add: "2") 
          moreover
          have "Col Q P P"
            by (simp add: col_trivial_2) 
          moreover
          have "¬ Col A B Q"
            by (simp add: "3") 
          moreover
          have "¬ Col C0 A B"
          proof -
            have "C D ParStrict A B"
              by (simp add: A B ParStrict C D par_strict_symmetry) 
            moreover
            have "Col C0 C D"
              by (simp add: Col C D C0  C D Perp P C0 col_permutation_2) 
            ultimately
            show ?thesis
              using par_not_col by blast 
          qed
          hence "¬ Col A B C0"
            using col_permutation_2 by blast 
          moreover
          have "Coplanar A B Q C0" 
          proof -
            have "Coplanar C D P A"
              using "1" "2" col_trivial_3 ncop_distincts 
                par__coplanar par_col2_par par_symmetry by blast 
            moreover
            have "Coplanar C D P B"
              using "1" "2" Col_cases Par_cases calculation 
                col_cop__cop par__coplanar by blast
            moreover
            have "Coplanar C D P C0"
              using Col C D C0  C D Perp P C0 ncop__ncols by blast 
            ultimately
            show ?thesis
              using ¬ Col C D P 4 coplanar_pseudo_trans by blast 
          qed
          ultimately
          show ?thesis
            using cop_not_par_same_side by blast 
        qed
        then obtain Q1 where P5: "Col Q P Q1  A B OS C0 Q1"
          by blast
        hence "Col Q P Q1"
          by blast
        have "A B OS C0 Q1"
          using P5 by blast
        have "P  Q1"
          using "2" P5 one_side_not_col124 by blast
        have "¬ Col P C0 Q1"
          by (metis Col Q P Q1 P  Q1 ¬ Col P Q C0 
              col_permutation_1 col_transitivity_1)
        have " A1. Col A B A1  P C0 OS Q1 A1" 
        proof -
          {
            assume "Col P C0 A"
            have "?thesis" 
            proof -
              have "B  A"
                using "3" col_trivial_1 by blast
              moreover
              have "Col P C0 P"
                by (simp add: col_trivial_3) 
              moreover
              have "Col B A P"
                by (simp add: "2" col_permutation_4) 
              moreover
              have "¬ Col P C0 B"
                by (metis P5 Col P C0 A ¬ Col P C0 Q1 
                    col_permutation_4 col_transitivity_1 not_col_distincts 
                    one_side_not_col123) 
              moreover
              have "¬ Col P C0 Q1"
                by (simp add: ¬ Col P C0 Q1) 
              moreover
              have "Coplanar P C0 B Q1"
                by (metis P5 Col P C0 A calculation(2) calculation(3) 
                    calculation(4) calculation(5) col_trivial_2 l6_21 
                    ncoplanar_perm_5 ts__coplanar two_sides_cases) 
              ultimately
              show ?thesis
                using NCol_perm cop_not_par_same_side by blast 
            qed
          }
          moreover
          {
            assume "¬ Col P C0 A"

            have "?thesis" 
            proof -
              have "B  A"
                using "3" col_trivial_1 by blast
              moreover
              have "Col P C0 P"
                by (simp add: col_trivial_3) 
              moreover
              have "Col A B P"
                by (simp add: "2")
              moreover
              have "¬ Col P C0 A"
                by (simp add: ¬ Col P C0 A)
              moreover
              have "¬ Col P C0 Q1"
                using ¬ Col P C0 Q1 by auto
              moreover
              have "Coplanar P C0 A Q1"
                by (metis "2" P5 calculation(4) calculation(5) 
                    col_one_side invert_one_side ncoplanar_perm_5 not_col_distincts
                    ts__coplanar two_sides_cases)
              ultimately
              show ?thesis
                using cop_not_par_same_side by auto
            qed
          }
          ultimately
          show ?thesis
            by blast 
        qed
        then obtain A1 where P6: "Col A B A1  P C0 OS Q1 A1" 
          by blast
        hence "Col A B A1" 
          by blast
        have "P C0 OS Q1 A1"
          using P6 by blast
        have " C1. Col C D C1  P C0 OS Q1 C1"
        proof -
          have "Coplanar C D P Q1"
            using "4" Col Q P Q1 ¬ Col P Q C0 col_cop__cop 
              col_permutation_4 not_col_distincts by blast
          have "P C0 Perp C D"
            using Perp_perm Col C D C0  C D Perp P C0 by blast
          moreover
          {
            assume "¬ Col P C0 C"
            have "C  D"
              using "1" par_neq2 by auto 
            moreover
            have "Col P C0 C0"
              by (simp add: col_trivial_2) 
            moreover
            have "Col C D C0" 
              using P4 by blast
            moreover
            have "¬ Col P C0 C"
              by (simp add: ¬ Col P C0 C) 
            moreover
            have "¬ Col P C0 Q1"
              by (simp add: ¬ Col P C0 Q1) 
            moreover
            have "Coplanar P C0 C Q1"
              using Coplanar C D P Q1 calculation(1) calculation(3) 
                col2_cop__cop col_trivial_3 ncoplanar_perm_17 
                ncoplanar_perm_18 by blast 
            ultimately
            have "?thesis"
              using cop_not_par_same_side by blast 
          }
          moreover
          {
            assume "¬ Col P C0 D"
            have "D  C"
              using "1" par_distinct by blast 
            moreover
            have "Col P C0 C0"
              by (simp add: col_trivial_2)
            moreover
            have "Col D C C0" 
              using P4 Col_perm by blast 
            moreover
            have "¬ Col P C0 D"
              by (simp add: ¬ Col P C0 D) 
            moreover
            have "¬ Col P C0 Q1"
              by (simp add: ¬ Col P C0 Q1) 
            moreover
            have "Coplanar P C0 D Q1"
              using Coplanar C D P Q1 calculation(1) 
                calculation(3) col_cop__cop ncoplanar_perm_22 
                ncoplanar_perm_5 by blast 
            ultimately
            have "?thesis" 
              using NCol_perm cop_not_par_same_side by blast
          }
          ultimately
          show ?thesis
            using perp_not_col2 by blast 
        qed
        then obtain C1 where P7: "Col C D C1  P C0 OS Q1 C1"
          by blast
        hence "Col C D C1" 
          by blast
        have "P C0 OS Q1 C1"
          using P7 by blast
        have "C0  C1"
          using P C0 OS Q1 C1 col_trivial_2 one_side_not_col124 by blast 
        have "P  A1"
          using P C0 OS Q1 A1 col_trivial_3 one_side_not_col124 by blast 
        have " Y. Col P Q Y  Col C D Y"  
        proof -
          have "P A1 ParStrict C0 C1" 
          proof -
            have "P  A1"
              by (simp add: P  A1) 
            moreover
            have "C0  C1"
              using C0  C1 by blast 
            moreover
            have "A B ParStrict C D"
              using A B ParStrict C D by auto 
            moreover
            have "Col A B P"
              by (simp add: "2") 
            moreover
            have "Col A B A1"
              by (simp add: Col A B A1) 
            moreover
            have "Col C D C0" 
              using P4 by blast 
            moreover
            have "Col C D C1"
              by (simp add: Col C D C1) 
            moreover
            have "C0 C1 Perp P C0" 
            proof -
              have "C D Perp P C0"
                by (simp add: P4) 
              moreover
              have "C0  C1"
                by (simp add: C0  C1) 
              moreover
              have "Col C D C0"
                by (simp add: Col C D C0) 
              moreover
              have "Col C D C1"
                by (simp add: Col C D C1) 
              ultimately
              show ?thesis
                by (meson perp_col2) 
            qed
            moreover
            have "P A1 OS C0 Q1"
              using "2" P5 P6 calculation(1) col2_os__os by blast 
            ultimately
            show ?thesis 
              using par_strict_col4__par_strict P6 by blast 
          qed
          moreover
          have "C0 C1 Perp P C0" 
          proof -
            have "C D Perp P C0"
              by (simp add: P4) 
            moreover
            have "C0  C1"
              by (simp add: C0  C1) 
            moreover
            have "Col C D C0"
              using P4 by blast
            moreover
            have "Col C D C1"
              by (simp add: Col C D C1) 
            ultimately
            show ?thesis
              by (meson perp_col2) 
          qed
          moreover
          have "P A1 OS C0 Q1"
            using "2" P5 P6 P  A1 col2_os__os by blast 
          moreover
          have "P C0 OS Q1 A1"
            by (simp add: P C0 OS Q1 A1) 
          moreover
          have "P C0 OS Q1 C1"
            by (simp add: P C0 OS Q1 C1) 
          ultimately
          have " Y. Col P Q1 Y  Col C0 C1 Y"
            using alternate_interior__proclus_aux assms(1) assms(2)
            by blast
          then obtain Y1 where "Col P Q1 Y1" and "Col C0 C1 Y1"
            by blast
          hence "Col P Q1 Y1" 
            by blast
          hence "Col P Q Y1"
            using NCol_cases Col Q P Q1 P  Q1 col_transitivity_1 by blast 
          moreover
          have "Col C D Y1" 
            using P4 C0  C1 Col C D C1 Col C0 C1 Y1 colx by blast
          ultimately show ?thesis  
            by blast
        qed
      }
      ultimately
      have " Y. Col P Q Y  Col C D Y"
        by blast 
    }
    ultimately
    have " Y. Col P Q Y  Col C D Y" 
      by blast
  }
  thus ?thesis
    using proclus_postulate_def by blast 
qed

lemma alternate_interior__triangle:
  assumes "alternate_interior_angles_postulate"
  shows "triangle_postulate" 
proof -
  {
    fix A B C D E F
    assume "A B C TriSumA D E F"
    have "Bet D E F" 
    proof -
      have "Col A B C  ?thesis" 
        using col_trisuma__bet by (simp add: A B C TriSumA D E F) 
      moreover
      {
        assume "¬ Col A B C"
        have " B1. B C A CongA C B B1  C B TS B1 A"
        proof -
          have "¬ Col B C A"
            by (simp add: ¬ Col A B C not_col_permutation_1) 
          moreover
          have "¬ Col C B A"
            by (simp add: ¬ Col A B C not_col_permutation_3) 
          ultimately
          show ?thesis
            by (simp add: ex_conga_ts) 
        qed
        then obtain B1 where P1: "B C A CongA C B B1  C B TS B1 A"
          by blast
        hence "B C A CongA C B B1" 
          by blast
        have "C B TS B1 A"
          using P1 by blast
        have "A C Par B B1"
          using P1 conga_comm l12_21_b l9_2 par_left_comm by blast
        hence "A C ParStrict B B1"
          using NCol_cases ¬ Col A B C col_trivial_3 par_not_col_strict by blast
        have "¬ Col C B B1"
          using A C ParStrict B B1 par_strict_not_col_2 by auto
        have "¬ Col A B B1"
          using A C ParStrict B B1 col_permutation_1 par_strict_not_col_3 by blast
        obtain B2 where P2: "Bet B1 B B2  Cong B1 B B B2"
          using Cong_perm segment_construction by blast
        hence "Bet B1 B B2" 
          by blast
        have "Cong B1 B B B2" 
          using P2 by blast
        have "A  B"
          using ¬ Col A B B1 col_trivial_1 by blast 
        have "B  B1"
          using ¬ Col C B B1 col_trivial_2 by blast
        have "C  B"
          using ¬ Col A B C col_trivial_2 by auto 
        have "B2  B1"
          using B  B1 Bet B1 B B2 between_identity by blast 
        have "B  B2"
          using B2  B1 Cong B1 B B B2 cong_identity by blast 
        have "B A TS B1 B2"
          using B  B2 Bet B1 B B2 ¬ Col A B B1 bet__ts col_permutation_4 by blast
        obtain D1 E1 F1 where P3: "A B C B C A SumA D1 E1 F1  D1 E1 F1 C A B SumA D E F"
          using TriSumA_def A B C TriSumA D E F by blast 
        hence "A B C B C A SumA D1 E1 F1"
          by blast
        have "D1 E1 F1 C A B SumA D E F"
          using P3 by blast
        have "B1 B B2 CongA D E F"
        proof -
          have "D1 E1 F1 C A B SumA B1 B B2" 
          proof -
            have "B1 B A A B B2 SumA B1 B B2"
              by (simp add: B A TS B1 B2 ts__suma_1) 
            moreover
            have "B1 B A CongA D1 E1 F1" 
            proof -
              have "A B C B C A SumA B1 B A" 
              proof -
                have "A B C C B B1 SumA A B B1"
                  by (simp add: C B TS B1 A l9_2 ts__suma) 
                moreover
                have "A B C CongA A B C"
                  by (simp add: A  B C  B conga_refl) 
                moreover
                have "C B B1 CongA B C A" 
                  using B C A CongA C B B1 not_conga_sym by blast
                moreover
                have "A B B1 CongA B1 B A"
                  using A  B B  B1 conga_pseudo_refl by auto 
                ultimately
                show ?thesis
                  using conga3_suma__suma by blast 
              qed
              moreover
              have "A B C B C A SumA D1 E1 F1"
                by (simp add: A B C B C A SumA D1 E1 F1) 
              ultimately
              show ?thesis
                using suma2__conga by blast 
            qed
            moreover
            have "A B B2 CongA C A B" 
            proof -
              have "B A TS B2 C"
                by (metis Par_cases A C Par B B1 B A TS B1 B2 C B TS B1 A 
                    invert_two_sides l9_2 l9_8_2 par_two_sides_two_sides ts_ts_os) 
              moreover
              have "B B2 Par A C"
                by (metis Par_perm A C Par B B1 B  B2 Bet B1 B B2 
                    bet_col bet_col1 par_col2_par) 
              ultimately
              show ?thesis
                using conga_left_comm alternate_interior_angles_postulate_def assms by blast 
            qed
            moreover
            have "B1 B B2 CongA B1 B B2"
              using B  B1 B  B2 conga_refl by auto
            ultimately
            show ?thesis
              using conga3_suma__suma by blast 
          qed
          moreover
          have "D1 E1 F1 C A B SumA D E F"
            by (simp add: P3) 
          ultimately
          show ?thesis
            using suma2__conga by blast 
        qed
        hence ?thesis
          using P2 bet_conga__bet by blast 
      }
      ultimately
      show ?thesis
        by blast 
    qed
  }
  thus ?thesis
    using triangle_postulate_def by blast 
qed

lemma bachmann_s_lotschnittaxiom_aux_R1:
  assumes "bachmann_s_lotschnittaxiom"
  shows " A1 A2 B1 B2 C1 C2 D1 D2 IAB IAC IBD.
 IAB  IAC  IAB  IBD 
  A1 A2 Perp B1 B2  
A1 A2 Perp C1 C2  
B1 B2 Perp D1 D2 
  Col A1 A2 IAB 
 Col B1 B2 IAB  Col A1 A2 IAC 
  Col C1 C2 IAC  Col B1 B2 IBD  Col D1 D2 IBD 
  Coplanar IAB IAC IBD C1  
Coplanar IAB IAC IBD C2 
  Coplanar IAB IAC IBD D1  Coplanar IAB IAC IBD D2 
  ( I. Col C1 C2 I  Col D1 D2 I)" 
proof -
  {
    fix A1 A2 B1 B2 C1 C2 D1 D2 IAB IAC IBD
    assume 1: "IAB  IAC" and
      2: "IAB  IBD" and
      3: "A1 A2 Perp B1 B2" and
      4: "A1 A2 Perp C1 C2" and
      5: "B1 B2 Perp D1 D2" and
      6: "Col A1 A2 IAB" and
      7: "Col B1 B2 IAB" and
      8: "Col A1 A2 IAC" and
      9: "Col C1 C2 IAC" and
      10: "Col B1 B2 IBD" and
      11: "Col D1 D2 IBD" and
      12: "Coplanar IAB IAC IBD C1" and
      13: "Coplanar IAB IAC IBD C2" and
      14: "Coplanar IAB IAC IBD D1" and
      15: "Coplanar IAB IAC IBD D2"
    have "Col IAB IAC A1"
      using "4" "6" "8" col_transitivity_1 not_col_permutation_3 perp_distinct by blast
    have "Col IAB IAC A2"
      using "4" "6" "8" col_permutation_3 col_transitivity_2 perp_distinct by blast
    have "Col IAB IBD B1"
      using "10" "5" "7" col_transitivity_1 not_col_permutation_2 perp_not_eq_1 by blast 
    have "Col IAB IBD B2"
      using "10" "5" "7" Col_perm col_transitivity_2 perp_distinct by blast
    have "Coplanar IAB IAC IBD A1"
      using Col IAB IAC A1 ncop__ncols by blast 
    have "Coplanar IAB IAC IBD A2"
      using Col IAB IAC A2 ncop__ncols by blast
    have "Coplanar IAB IAC IBD B1"
      using Col IAB IBD B1 ncop__ncols by blast
    have "Coplanar IAB IAC IBD B2"
      using Col IAB IBD B2 ncop__ncols by blast
    have "IAB IAC Perp IBD IAB"
      using perp_col4 1 "2" "3" 6 7 8 10 by auto 
    hence H1: "Per IAC IAB IBD" 
      using perp_per_1 "1" l8_8 by blast
    have "¬ Col IAC IAB IBD" 
      using per_not_col "1" "2" Per IAC IAB IBD by auto 
    have "¬ Col A1 A2 IBD"
      using "6" "8" col3 par_neq1 "4" ¬ Col IAC IAB IBD perp_distinct by fastforce 
    have "A1 A2 ParStrict D1 D2"
    proof -
      have "A1 A2 Par D1 D2" 
      proof -
        have "Coplanar B1 B2 A1 D1"
        proof -
          have "Coplanar IAB IAC IBD B1"
            by (simp add: Coplanar IAB IAC IBD B1) 
          moreover
          have "Coplanar IAB IAC IBD B2"
            by (simp add: Coplanar IAB IAC IBD B2) 
          moreover
          have "Coplanar IAB IAC IBD A1"
            using Coplanar IAB IAC IBD A1 by force
          moreover
          have "Coplanar IAB IAC IBD D1"
            using "14" by blast
          ultimately
          show ?thesis
            by (meson ¬ Col IAC IAB IBD coplanar_perm_6 coplanar_pseudo_trans) 
        qed
        moreover
        have "Coplanar B1 B2 A1 D2" 
          using coplanar_pseudo_trans not_par_not_col par_id_1 
          by (meson "15" Coplanar IAB IAC IBD A1 Coplanar IAB IAC IBD B1 
              Coplanar IAB IAC IBD B2 ¬ Col IAC IAB IBD not_col_permutation_4)
        moreover
        have "Coplanar B1 B2 A2 D1"
        proof -
          have "Coplanar IAB IAC IBD B1"
            by (simp add: Coplanar IAB IAC IBD B1) 
          moreover
          have "Coplanar IAB IAC IBD B2"
            by (simp add: Coplanar IAB IAC IBD B2) 
          moreover
          have "Coplanar IAB IAC IBD A2"
            using Coplanar IAB IAC IBD A2 by blast 
          moreover
          have "Coplanar IAB IAC IBD D1"
            using "14" by blast
          ultimately
          show ?thesis
            by (meson ¬ Col IAC IAB IBD coplanar_perm_6 coplanar_pseudo_trans) 
        qed
        moreover
        have "Coplanar B1 B2 A2 D2" 
        proof -
          have "Coplanar IAB IAC IBD B1"
            by (simp add: Coplanar IAB IAC IBD B1) 
          moreover
          have "Coplanar IAB IAC IBD B2"
            by (simp add: Coplanar IAB IAC IBD B2) 
          moreover
          have "Coplanar IAB IAC IBD A2"
            using Coplanar IAB IAC IBD A2 by blast 
          moreover
          have "Coplanar IAB IAC IBD D2"
            using "15" by blast 
          ultimately
          show ?thesis
            by (meson ¬ Col IAC IAB IBD coplanar_perm_6 coplanar_pseudo_trans)
        qed
        moreover 
        have "A1 A2 Perp B1 B2"
          by (simp add: "3") 
        moreover
        have "D1 D2 Perp B1 B2"
          using "5" Perp_perm by blast 
        ultimately
        show ?thesis
          using l12_9 by blast 
      qed
      moreover
      have "Col D1 D2 IBD"
        by (simp add: "11") 
      moreover
      have "¬ Col A1 A2 IBD"
        using "6" "8" ¬ Col IAC IAB IBD calculation(1) col3 par_neq1 by blast 
      ultimately
      show ?thesis
        using par_not_col_strict by blast 
    qed
    have Q1: "B1 B2 ParStrict C1 C2"
    proof -
      have "B1 B2 Par C1 C2" 
      proof -
        have "Coplanar A1 A2 B1 C1"
        proof -
          have "Coplanar IAB IAC IBD A1"
            by (simp add: Coplanar IAB IAC IBD A1)
          moreover
          have "Coplanar IAB IAC IBD A2"
            by (simp add: Coplanar IAB IAC IBD A2)
          moreover
          have "Coplanar IAB IAC IBD B1"
            using Coplanar IAB IAC IBD B1 by blast
          moreover
          have "Coplanar IAB IAC IBD C1"
            using "12" by blast
          ultimately
          show ?thesis
            by (meson ¬ Col IAC IAB IBD coplanar_perm_6 coplanar_pseudo_trans) 
        qed
        moreover
        have "Coplanar A1 A2 B1 C2" 
        proof -
          have "Coplanar IAB IAC IBD A1"
            by (simp add: Coplanar IAB IAC IBD A1)
          moreover
          have "Coplanar IAB IAC IBD A2"
            by (simp add: Coplanar IAB IAC IBD A2)
          moreover
          have "Coplanar IAB IAC IBD B1"
            by (simp add: Coplanar IAB IAC IBD B1)
          moreover
          have "Coplanar IAB IAC IBD C2"
            by (simp add: "13")
          ultimately
          show ?thesis
            by (meson ¬ Col IAC IAB IBD coplanar_perm_6 coplanar_pseudo_trans) 
        qed
        moreover
        have "Coplanar A1 A2 B2 C1"
        proof -
          have "Coplanar IAB IAC IBD A1"
            by (simp add: Coplanar IAB IAC IBD A1)
          moreover
          have "Coplanar IAB IAC IBD A2"
            by (simp add: Coplanar IAB IAC IBD A2)
          moreover
          have "Coplanar IAB IAC IBD B2"
            by (simp add: Coplanar IAB IAC IBD B2)
          moreover
          have "Coplanar IAB IAC IBD C1"
            using "12" by blast
          ultimately
          show ?thesis
            by (meson ¬ Col IAC IAB IBD coplanar_perm_6 coplanar_pseudo_trans) 
        qed
        moreover
        have "Coplanar A1 A2 B2 C2" 
        proof -
          have "Coplanar IAB IAC IBD A1"
            by (simp add: Coplanar IAB IAC IBD A1) 
          moreover
          have "Coplanar IAB IAC IBD A2"
            by (simp add: Coplanar IAB IAC IBD A2) 
          moreover
          have "Coplanar IAB IAC IBD B2"
            using Coplanar IAB IAC IBD B2 by blast 
          moreover
          have "Coplanar IAB IAC IBD C2"
            using Coplanar IAB IAC IBD C2 by blast
          ultimately
          show ?thesis
            by (meson ¬ Col IAC IAB IBD coplanar_perm_6 coplanar_pseudo_trans)
        qed
        moreover 
        have "B1 B2 Perp A1 A2"
          using 3 Perp_perm by blast
        moreover
        have "C1 C2 Perp A1 A2"
          using 4 Perp_perm by blast 
        ultimately
        show ?thesis 
          using l12_9 by blast
      qed
      moreover
      have "Col C1 C2 IAC"
        using 9 by auto
      moreover
      have "¬ Col B1 B2 IAC"
        using "10" "7" ¬ Col IAC IAB IBD calculation(1) col3 par_neq1 by blast 
      ultimately
      show ?thesis
        using par_not_col_strict by blast  
    qed
    have "IAC  IAB"
      using 1 by auto
    have "IAB  IBD"
      using 2 by auto
    have "Col C1 C2 IAC" 
      using 9 by auto
    then obtain P1 where P1: "C1  P1  C2  P1  IAC  P1  Col C1 C2 P1" 
      using diff_col_ex3 by blast
    hence "C1  P1" 
      by blast
    have "C2  P1"
      using P1 by blast
    have "IAC  P1"
      using P1 by blast
    have "Col C1 C2 P1"
      using P1 by blast
    have "Col D1 D2 IBD" 
      by (simp add: "11") 
    then obtain R1 where P2: "D1  R1  D2  R1  IBD  R1  Col D1 D2 R1"
      using diff_col_ex3 by blast
    hence "D1  R1"
      by blast
    have "D2  R1"
      using P2 by blast
    have "IBD  R1"
      using P2 by blast
    have "Col D1 D2 R1"
      using P2 by blast
    have "IAC  IBD"
      using "8" ¬ Col A1 A2 IBD by auto 
    have "D1  D2"
      using A1 A2 ParStrict D1 D2 par_strict_distinct by blast 
    have "C1  C2"
      using Q1 par_strict_neq2 by auto  
    have P3: "C1  Q  Q  D1  Per C1 Q D1  Per Q C1 C2 
 Per Q D1 D2  Coplanar C1 Q D1 C2  Coplanar C1 Q D1 D2 

  ( S. Col C1 C2 S  Col D1 D2 S)"
      using  assms(1) bachmann_s_lotschnittaxiom_def by blast
    have " I. Col IAC P1 I  Col IBD R1 I"
    proof -
      have "IAC  IAB" 
        using 1 by auto
      moreover
      have "IAB  IBD" 
        using 2 by auto
      moreover
      have "Per IAC IAB IBD" 
        using H1 by blast
      moreover
      have "IAC IAB Perp P1 IAC"
      proof -
        have "IAC  IAB" 
          using 1 by blast
        moreover
        have "P1  IAC" 
          using P1 by blast
        ultimately
        show ?thesis 
          using 8 6 P1 9 4 perp_col4 by blast
      qed
      hence "Per IAB IAC P1" 
        using perp_per_1 by blast
      moreover
      have "IBD IAB Perp R1 IBD" 
      proof -
        have "IBD  IAB" 
          using 2 by auto
        moreover
        have "R1  IBD" 
          using P2 by auto
        ultimately
        show ?thesis
          using 10 7 P2 5 11 perp_col4 by blast
      qed
      hence "Per IAB IBD R1" 
        using perp_per_1 by blast
      moreover
      have "Coplanar IAC IAB IBD P1" 
      proof -
        have "C1  C2" 
          using Q1 par_strict_neq2 by auto  
        moreover
        have "Coplanar IAC IAB IBD C1" 
          using 12 coplanar_perm_6 by blast
        moreover
        have "Coplanar IAC IAB IBD C2" 
          using 13 coplanar_perm_6 by blast
        moreover
        have "Col C1 C2 P1" 
          using P1 by blast
        ultimately
        show ?thesis 
          using col_cop2__cop by blast
      qed
      moreover
      have "Coplanar IAC IAB IBD R1"
        using "14" "15" P2 D1  D2 col_cop2__cop coplanar_perm_6 by blast 
      ultimately
      show ?thesis 
        using assms(1) bachmann_s_lotschnittaxiom_def by blast
    qed
    then obtain I where P5: "Col IAC P1 I  Col IBD R1 I"
      by auto
    hence "Col IAC P1 I" 
      by blast
    have "Col IBD R1 I" 
      using P5 by blast
    have "Col C1 C2 I"
      using "9" Col C1 C2 P1 Col IAC P1 I IAC  P1 colx by blast
    moreover
    have "Col D1 D2 I"
      using "11" Col D1 D2 R1 Col IBD R1 I IBD  R1 colx by blast 
    ultimately
    have " I0. (Col C1 C2 I0  Col D1 D2 I0)" 
      by blast
  }
  thus ?thesis by blast
qed

lemma bachmann_s_lotschnittaxiom_aux_R2:
  assumes " A1 A2 B1 B2 C1 C2 D1 D2 IAB IAC IBD.
 IAB  IAC  IAB  IBD 
  A1 A2 Perp B1 B2  
A1 A2 Perp C1 C2  
B1 B2 Perp D1 D2 
  Col A1 A2 IAB 
 Col B1 B2 IAB  Col A1 A2 IAC 
  Col C1 C2 IAC  Col B1 B2 IBD  Col D1 D2 IBD 
  Coplanar IAB IAC IBD C1  
Coplanar IAB IAC IBD C2 
  Coplanar IAB IAC IBD D1  Coplanar IAB IAC IBD D2 
  ( I. Col C1 C2 I  Col D1 D2 I)"
  shows "bachmann_s_lotschnittaxiom"
proof - 
  {
    fix P Q R P1 R1
    assume 1: "P  Q" and
      2: "Q  R" and
      3: "Per P Q R" and
      4: "Per Q P P1" and
      5: "Per Q R R1" and
      6: "Coplanar P Q R P1" and
      7: "Coplanar P Q R R1"
    have " S. Col P P1 S  Col R R1 S"
    proof cases
      assume "P = P1"
      thus ?thesis
        using col_trivial_1 col_trivial_2 by blast
    next
      assume "P  P1"
      thus ?thesis
      proof cases
        assume "R = R1"
        thus ?thesis
          using col_trivial_1 col_trivial_2 by blast
      next
        assume "R  R1"
        have "Q  P"
          using "1" by auto
        moreover
        have "Q  R"
          by (simp add: "2") 
        moreover
        have "P Q Perp Q R"
          by (simp add: "1" "2" "3" per_perp) 
        moreover
        have "P Q Perp P P1"
          using "1" "4" P  P1 per_perp perp_left_comm by auto 
        moreover
        have "Q R Perp R R1"
          by (simp add: "2" "5" R  R1 per_perp) 
        moreover
        have "Col P Q Q"
          by (simp add: col_trivial_2) 
        moreover
        have "Col Q R Q"
          using col_trivial_3 by auto 
        moreover
        have "Col P Q P"
          by (simp add: col_trivial_3) 
        moreover
        have "Col P P1 P"
          by (simp add: col_trivial_3) 
        moreover
        have "Col Q R R"
          by (simp add: col_trivial_2)
        moreover
        have "Col R R1 R"
          by (simp add: col_trivial_3) 
        moreover
        have "Coplanar Q P R P"
          using ncop_distincts by blast 
        moreover
        have "Coplanar Q P R P1"
          using "6" ncoplanar_perm_6 by blast 
        moreover
        have "Coplanar Q P R R"
          using ncop_distincts by blast 
        moreover
        have "Coplanar Q P R R1"
          using "7" ncoplanar_perm_6 by blast 
        ultimately
        show ?thesis 
          using assms(1) by blast
      qed
    qed
  }
  thus ?thesis
    using bachmann_s_lotschnittaxiom_def by blast 
qed

lemma bachmann_s_lotschnittaxiom_aux:
  shows "bachmann_s_lotschnittaxiom 
( A1 A2 B1 B2 C1 C2 D1 D2 IAB IAC IBD.
 IAB  IAC  IAB  IBD 
  A1 A2 Perp B1 B2  
A1 A2 Perp C1 C2  
B1 B2 Perp D1 D2 
  Col A1 A2 IAB 
 Col B1 B2 IAB  Col A1 A2 IAC 
  Col C1 C2 IAC  Col B1 B2 IBD  Col D1 D2 IBD 
  Coplanar IAB IAC IBD C1  
Coplanar IAB IAC IBD C2 
  Coplanar IAB IAC IBD D1  Coplanar IAB IAC IBD D2 
  ( I. Col C1 C2 I  Col D1 D2 I))"
  using bachmann_s_lotschnittaxiom_aux_R2 bachmann_s_lotschnittaxiom_aux_R1 by blast

lemma bachmann_s_lotschnittaxiom__legendre_s_parallel_postulate:
  assumes "bachmann_s_lotschnittaxiom"
  shows "legendre_s_parallel_postulate"
proof -
  have P0: " A1 A2 B1 B2 C1 C2 D1 D2 IAB IAC IBD.
 IAB  IAC  IAB  IBD 
  A1 A2 Perp B1 B2  
A1 A2 Perp C1 C2  
B1 B2 Perp D1 D2 
  Col A1 A2 IAB 
 Col B1 B2 IAB  Col A1 A2 IAC 
  Col C1 C2 IAC  Col B1 B2 IBD  Col D1 D2 IBD 
  Coplanar IAB IAC IBD C1  
Coplanar IAB IAC IBD C2 
  Coplanar IAB IAC IBD D1  Coplanar IAB IAC IBD D2 
  ( I. Col C1 C2 I  Col D1 D2 I)" 
    using assms(1) bachmann_s_lotschnittaxiom_aux_R1 by blast
  {
    assume "( A B C. (¬ Col A B C  Acute A B C 
   ( P Q. B Out A P  P  Q  Per B P Q  Coplanar A B C Q 
 ( Y. B Out C Y  Col P Q Y))))"
    then obtain A B C where P1: "(¬ Col A B C  Acute A B C 
   ( P Q. B Out A P  P  Q  Per B P Q  Coplanar A B C Q 
 ( Y. B Out C Y  Col P Q Y)))" 
      by auto
    hence "¬ Col A B C" 
      by auto
    have "Acute A B C" 
      using P1 by blast
    have Q1: " P Q. B Out A P  P  Q  Per B P Q  Coplanar A B C Q 
 ( Y. B Out C Y  Col P Q Y)"
      using P1 by blast
    {
      fix T
      assume "T InAngle A B C"
      {
        assume "Col A B T"
        have "¬ Col B C T"
          by (metis Col A B T T InAngle A B C ¬ Col A B C col_trivial_3 
              colx inangle_distincts not_col_permutation_2)
        then obtain Y where P2: "Col B C Y  B C Perp T Y"
          using l8_18_existence by blast 
        hence "Col B C Y"
          by auto
        have "B C Perp T Y"
          using P2 by blast
        have "B Out A T"
          using Col_def NCol_perm Col A B T T InAngle A B C ¬ Col A B C 
            col_in_angle_out by blast 
        moreover
        have "T B A A B C SumA T B C" 
        proof -
          have "A B C CongA A B C"
            using ¬ Col A B C conga_refl not_col_distincts by fastforce 
          moreover
          have "¬ B A OS T C"
            using B Out A T one_side_not_col123 out_col by blast 
          moreover
          have "Coplanar T B A C"
            by (simp add: Col A B T col__coplanar col_permutation_3) 
          moreover
          have "T B C CongA T B C"
            using T InAngle A B C conga_refl inangle_distincts by auto 
          ultimately
          show ?thesis
            using SumA_def by blast 
        qed
        hence "A B C CongA T B C"
          by (meson Col A B T T InAngle A B C ¬ Col A B C bet_col 
              col_in_angle_out col_permutation_4 l6_6 out213_suma__conga) 
        hence "Acute T B C"
          using Acute A B C acute_conga__acute by blast 
        hence "B Out C Y"
          using P2 acute_col_perp__out l6_6 by blast 
        moreover
        have "Bet T T Y"
          by (simp add: between_trivial2) 
        ultimately
        have "( X Y. B Out A X  B Out C Y  Bet X T Y)" 
          by blast
      }
      moreover
      {
        assume "¬ Col A B T"
        then obtain X where P3: "Col A B X  A B Perp T X"
          using l8_18_existence by blast 
        hence "Col A B X"
          by auto
        have "A B Perp T X"
          using P3 by blast
        have "B Out A X" 
        proof -
          have "Acute T B A" 
          proof -
            have "Acute A B C"
              by (simp add: Acute A B C) 
            moreover
            have "A B T LeA A B C" 
              by (simp add: T InAngle A B C inangle__lea)
            hence "T B A LeA A B C"
              using lea_left_comm by blast 
            ultimately
            show ?thesis
              using acute_lea_acute by blast 
          qed
          moreover
          have "Col B A X"
            using Col A B X not_col_permutation_4 by blast 
          moreover
          have "B A Perp T X"
            by (simp add: A B Perp T X perp_left_comm) 
          ultimately
          show ?thesis
            using acute_col_perp__out l6_6 by blast 
        qed
        have " Y. B Out C Y  Col X T Y"
        proof -
          have "X  T"
            using P3 ¬ Col A B T by blast 
          moreover
          have "Col A B B"
            by (simp add: col_trivial_2) 
          hence "Per B X T" 
            using Col A B X A B Perp T X Per_perm l8_16_1 by blast 
          moreover
          have "Coplanar A B C T"
            using T InAngle A B C coplanar_perm_9 inangle__coplanar by blast 
          ultimately
          show ?thesis 
            using B Out A X Q1 by blast
        qed
        then obtain Y where P5: "B Out C Y  Col X T Y" 
          by auto
        hence "B Out C Y" 
          by auto
        have "Col X T Y"
          using P5 by blast
        {
          assume "Bet T Y X  Bet Y X T"
          have "Bet X T Y"
          proof cases
            assume "T = Y"
            thus ?thesis
              by (simp add: between_trivial)
          next
            assume "T  Y"
            have "¬ Col B C T"
              by (metis (full_types) P5 B Out A X T  Y 
                  ¬ Col A B C col_trivial_3 colx 
                  not_col_permutation_2 out_col out_distinct) 
            {
              assume "Bet T Y X"
              have "C B OS T A"
                by (simp add: T InAngle A B C ¬ Col A B C 
                    ¬ Col B C T in_angle_one_side 
                    l11_24 not_col_permutation_3) 
              have "C B TS T A" 
              proof -
                have "C B TS X T" 
                proof -
                  have "¬ Col X C B" 
                    by (metis Out_def B Out A X Col A B X 
                        ¬ Col A B C col_permutation_2 col_transitivity_1)
                  moreover have "¬ Col T C B" 
                    using NCol_perm ¬ Col B C T by blast
                  moreover have " Z. Col Z C B  Bet X Z T" 
                    using Col_perm P5 Bet T Y X between_symmetry out_col by blast
                  ultimately show ?thesis 
                    using TS_def by blast
                qed
                moreover
                have "C B OS X A"
                  using B Out A X ¬ Col A B C col_trivial_3 
                    invert_one_side one_side_reflexivity 
                    os_out_os by blast 
                ultimately
                show ?thesis
                  using l9_2 l9_8_2 by blast 
              qed
              hence "Bet X T Y"
                using C B OS T A l9_9 by blast 
            }
            moreover
            {
              assume "Bet Y X T"
              have "A B OS T C"
                by (simp add: NCol_perm T InAngle A B C 
                    ¬ Col A B C ¬ Col A B T in_angle_one_side)
              have "A B TS T C" 
              proof -
                have "A B TS Y T"
                  by (metis (full_types) Bet Y X T Col A B X 
                      Col X T Y ¬ Col A B T between_equality between_trivial 
                      calculation col_permutation_5 colx l9_18 not_col_permutation_2) 
                moreover
                have "A B OS Y C"
                  using A B OS T C B Out C Y col124__nos 
                    invert_one_side l6_6 out_one_side by blast 
                ultimately
                show ?thesis
                  using l9_2 l9_8_2 by blast 
              qed
              hence "Bet X T Y"
                using A B OS T C l9_9 by blast 
            }
            ultimately
            show ?thesis
              using Bet T Y X  Bet Y X T by blast 
          qed
        }
        hence "Bet X T Y"
          using Col_def Col X T Y by blast 
        hence " X Y. B Out A X  B Out C Y  Bet X T Y"
          using B Out A X B Out C Y by blast 
      }
      ultimately
      have "( X Y. B Out A X  B Out C Y  Bet X T Y)"
        by blast
    }
    hence "legendre_s_parallel_postulate"
      using legendre_s_parallel_postulate_def Acute A B C 
        ¬ Col A B C by blast 
  }
  hence "( A B C. (¬ Col A B C  Acute A B C 
   ( P Q. B Out A P  P  Q  Per B P Q  Coplanar A B C Q 
 ( Y. B Out C Y  Col P Q Y)))) 
legendre_s_parallel_postulate" 
    by blast
  moreover
  have " A B C. ( ¬ Col A B C  
                   Acute A B C 
                   ( P Q. B Out A P  P  Q  
                           Per B P Q  
                           Coplanar A B C Q 
                         
                           ( Y. B Out C Y  Col P Q Y)))" 
  proof -
    obtain C E D9 where P6: "¬ (Bet C E D9  Bet E D9 C  Bet D9 C E)"
      using lower_dim by blast
    hence "¬ Col C E D9"
      by (simp add: Col_def)
    then obtain B where P7: "Col D9 E B  D9 E Perp C B" 
      using l8_18_existence NCol_cases by blast 
    hence "Col D9 E B"
      by auto
    have "D9 E Perp C B"
      using P7 by blast
    have " F. Col D9 E F  B  F"
      using Col D9 E B diff_col_ex3 by blast
    then obtain F where P8: "Col D9 E F  B  F" 
      by blast
    hence "Col D9 E F" 
      by auto
    have "B  F"
      using P8 by auto
    then obtain A where P9: "(Bet B F A  Bet B A F)  Cong B A B C"
      using segment_construction_2 by presburger 
    hence "Bet B F A  Bet B A F"
      by auto
    have "Cong B A B C"
      using P9 by auto
    have "Col D9 E A"
      using B  F Bet B F A  Bet B A F Col D9 E B 
        Col D9 E F bet_col1 between_trivial colx by blast 
    have "C B Perp B A" 
    proof -
      have "D9 E Perp C B"
        by (simp add: D9 E Perp C B) 
      moreover
      have "B  A"
        by (metis NCol_cases Col D9 E A Cong B A B C 
            ¬ Col C E D9 cong_diff_3) 
      moreover
      have "Col D9 E B"
        using Col D9 E B by blast
      moreover
      have "Col D9 E A"
        using Col D9 E A by auto 
      ultimately
      show ?thesis
        using perp_col0 by blast 
    qed
    hence "B A Perp C B"
      using Perp_perm by blast 
    have K1: "¬ Col B A C"
      by (simp add: B A Perp C B perp_not_col)
    obtain D where P8B: "D Midpoint A C"
      using midpoint_existence by blast
    have "¬ Col A B D"
      by (metis P8B ¬ Col B A C col_transitivity_2 
          midpoint_col midpoint_distinct_1 
          not_col_permutation_1) 
    moreover
    have "B  A"
      using ¬ Col B A C col_trivial_1 by blast 
    have "A  C"
      using ¬ Col B A C col_trivial_2 by blast 
    have "B  C"
      using ¬ Col B A C col_trivial_3 by blast 
    have "D  A"
      using calculation not_col_distincts by blast 
    have "D  C"
      using P8B A  C midpoint_not_midpoint by blast 
    have "Acute A B D" 
    proof -
      have "D  B"
        using calculation col_trivial_2 by blast
      have "Per A B C"
        using Perp_cases C B Perp B A perp_per_2 by blast 
      moreover
      have "A B D LtA A B C" 
      proof -
        have "A B D LeA A B C" 
        proof -
          have "D InAngle A B C" 
          proof -
            have "Bet A D C"
              using Midpoint_def P8B by blast 
            moreover
            have "D = B  B Out D D"
              using out_trivial by blast 
            ultimately
            show ?thesis
              using InAngle_def B  A B  C D  B by auto 
          qed
          moreover
          have "A B D CongA A B D"
            using B  A D  B conga_refl by auto 
          ultimately
          show ?thesis
            by (simp add: inangle__lea)
        qed
        moreover
        {
          assume "A B D CongA A B C"
          hence "Per A B D"
            using Per A B C conga_sym l11_17 by blast
          have "Per C B D"
            using P8B B  A D  C Per A B C Per A B D 
              col_per2__per l7_2 l8_2 l8_8 midpoint_col by blast
          have "A B D C B D SumA A B C" 
          proof -
            have "D B C CongA C B D"
              using B  C D  B conga_pseudo_refl by auto 
            moreover
            have "¬ B D OS A C"
              by (meson P8B midpoint_bet col_trivial_3 one_side_chara) 
            moreover
            have "Coplanar A B D C" 
            proof -
              have "Bet A D C"
                using P8B by (simp add: midpoint_bet)
              thus ?thesis
                using bet_col ncop__ncols by blast 
            qed
            moreover
            have "A B C CongA A B C"
              using B  A B  C conga_refl by auto 
            ultimately
            show ?thesis
              using SumA_def by blast 
          qed
          hence "Bet A B C" 
            using per2_suma__bet Per A B D Per C B D by blast 
          hence "False"
            using Col_def ¬ Col B A C between_symmetry by blast 
        }
        hence "¬ A B D CongA A B C" 
          by auto
        ultimately
        show ?thesis
          by (simp add: LtA_def)
      qed
      ultimately
      show ?thesis
        using Acute_def by blast 
    qed
    moreover
    { 
      fix P Q
      assume H1: "B Out A P" and
        H2: "P  Q" and
        H3: "Per B P Q" and
        H4: "Coplanar A B D Q"
      have "B  P"
        using H1 Out_def  by auto 
      then obtain P' where H5: "B Out P' C  Cong B P' B P" 
        using B  C l6_11_existence by fastforce 
      hence H5A: "B Out P' C" 
        by auto
      have H5B: "Cong B P' B P"
        using H5 by auto
      obtain Q' where H6: "B C Perp Q' P'  Coplanar B C A Q'" 
        using ex_perp_cop B  C by blast 
      hence H6A: "B C Perp Q' P'" 
        by auto
      have H6B: "Coplanar B C A Q'"
        using H6 by blast
      have "B A Perp Q P"
        by (metis H1 H2 H3 NCol_cases B  A B  P col_per_perp l8_2 out_col)
      have "Coplanar B Q A C" 
      proof -
        have "Coplanar B Q A D"
          by (simp add: H4 coplanar_perm_10) 
        moreover
        have "Col A D A"
          by (simp add: col_trivial_3) 
        moreover
        have "Col A D C" 
          using P8B by (simp add: Midpoint_def bet_col) 
        ultimately
        show ?thesis 
          using D  A col2_cop__cop by blast 
      qed
      have " I. Col P Q I  Col P' Q' I"
      proof -
        have "B  P'"
          using B Out P' C l6_3_1 by blast 
        moreover
        have "B  P"
          using B  P by auto
        moreover
        have "B A Perp B C"
          by (simp add: B A Perp C B perp_right_comm) 
        moreover
        have "B A Perp P Q"
          by (simp add: B A Perp Q P perp_right_comm) 
        moreover
        have "B C Perp P' Q'"
          by (simp add: B C Perp Q' P' perp_right_comm) 
        moreover
        have "Col B A B"
          by (simp add: col_trivial_3) 
        moreover
        have "Col B C B"
          by (simp add: col_trivial_3) 
        moreover  
        have "Col B A P"
          by (simp add: H1 out_col) 
        moreover
        have "Col P Q P"
          by (simp add: col_trivial_3) 
        moreover
        have "Col B C P'"
          using Out_cases B Out P' C out_col by blast 
        moreover
        have "Col P' Q' P'"
          by (simp add: col_trivial_3) 
        moreover
        have "Coplanar B P P' P"
          using ncop_distincts by blast 
        moreover
        have "Coplanar B P P' Q" 
        proof -
          have "Coplanar B A C Q" 
            by (simp add: Coplanar B Q A C coplanar_perm_3)
          moreover have "Coplanar B A C P'" 
            using Col B C P' ncop__ncols by blast
          moreover have "Coplanar B A C P" 
            using Col B A P ncop__ncols by blast
          moreover have "Coplanar B A C B" 
            using ncop_distincts by blast
          ultimately show ?thesis 
            using K1 coplanar_pseudo_trans by presburger
        qed
        moreover  
        have "Coplanar B P P' P'"
          using ncop_distincts by blast
        moreover
        have "Coplanar B P P' Q'" 
          using H6B col2_cop__cop
          by (meson B  A B  C calculation(10) calculation(6) 
              calculation(7) calculation(8) coplanar_perm_16 
              coplanar_perm_21)
        ultimately
        show ?thesis 
          using P0 by blast
      qed
      then obtain I where H7: "Col P Q I  Col P' Q' I"
        by auto
      hence "Col P Q I" 
        by auto
      have "Col P' Q' I"
        using H7 by blast
      have "B  D"
        using ¬ Col A B D col_trivial_2 by blast
      hence "B C ParStrict P I" 
      proof -
        have "P  I"
        proof -
          {
            assume "P = I"
            {
              assume "Col B A C"
              hence "¬ B A Perp C B"
                using K1 by blast 
              hence "False" 
                using perp_not_col using B A Perp C B by blast 
            }
            moreover
            have "Col B A C" 
            proof -
              have "A B Par P' Q'" 
              proof -
                have "Coplanar B C A P'"
                  using H5A ncop__ncols ncoplanar_perm_3 out_col by blast 
                moreover
                have "Coplanar B C A Q'"
                  by (simp add: H6B) 
                moreover
                have "Coplanar B C B P'"
                  using ncop_distincts by blast 
                moreover
                have "Coplanar B C B Q'"
                  using ncop_distincts by blast 
                moreover
                have "A B Perp B C"
                  using Perp_perm B A Perp C B by blast 
                moreover
                have "P' Q' Perp B C"
                  using H6A Perp_perm by blast 
                ultimately
                show ?thesis 
                  using l12_9 by blast
              qed
              moreover
              have "Col A B P"
                using Col_perm H1 out_col by blast 
              moreover
              have "Col P' Q' P"
                by (simp add: Col P' Q' I P = I) 
              ultimately
              show ?thesis 
                using not_strict_par 
                by (metis H5A col_trivial_2 col_trivial_3 
                    colx out_col out_distinct) 
            qed
            ultimately
            have "False" 
              by blast
          }
          thus ?thesis
            by auto 
        qed
        moreover
        have "B C ParStrict P Q" 
        proof -
          have "B C Par P Q" 
          proof -
            have "Coplanar A B B P"
              using ncop_distincts by blast 
            moreover
            have "Coplanar A B B Q"
              using ncop_distincts by blast 
            moreover
            have "Coplanar A B C P"
              using H1 ncop__ncols ncoplanar_perm_14 out_col by blast 
            moreover
            have "Coplanar A B C Q"
              using Coplanar B Q A C ncoplanar_perm_10 by blast 
            moreover
            have "B C Perp A B"
              by (simp add: C B Perp B A perp_comm) 
            moreover
            have "P Q Perp A B"
              using Perp_perm B A Perp Q P by blast 
            ultimately
            show ?thesis
              using l12_9 by blast 
          qed
          moreover
          have"Col P Q P"
            using col_trivial_3 by auto 
          moreover
          have "¬ Col B C P"
            using H1 B  P ¬ Col B A C col_permutation_5 
              col_trivial_3 colx out_col by blast 
          ultimately
          show ?thesis
            using par_not_col_strict by blast 
        qed
        ultimately
        show ?thesis
          using Col P Q I par_strict_col_par_strict by blast 
      qed
      hence "B C OS P I"
        by (simp add: l12_6) 
      have "Col D B I" 
      proof cases
        assume "D = I"
        thus ?thesis
          using col_trivial_3 by blast 
      next
        assume "D  I"
        have "Coplanar A B C I" 
        proof -
          have "P  Q"
            by (simp add: H2) 
          moreover
          have "Coplanar A B C P"
            using H1 ncoplanar_perm_7 out__coplanar by blast 
          moreover
          have "Coplanar A B C Q"
            using Coplanar B Q A C ncoplanar_perm_10 by blast 
          moreover
          have "Col P Q I"
            by (simp add: Col P Q I)
          ultimately 
          show ?thesis
            using col_cop2__cop by blast 
        qed
        moreover
        have "B D PerpBisect A C"
          by (simp add: P8B A  C B  D Cong B A B C 
              cong_commutativity cong_mid_perp_bisect) 
        hence "D B Perp A C"
          using Perp_perm perp_bisect_perp by blast 
        moreover
        have "D I PerpBisect A C"
        proof -
          have "D  I"
            by (simp add: D  I) 
          moreover
          have "A  C"
            using A  C by blast
          moreover
          have "Cong A I C I" 
          proof -
            have "P I Perp B P"
            proof -
              have "A B Perp P I" 
              proof -
                have "P Q Perp A B"
                  using Perp_perm B A Perp Q P by blast 
                moreover
                {
                  assume "P = I"
                  have "B A Par P' Q'" 
                  proof -
                    have "Coplanar B C B P'"
                      using ncop_distincts by blast 
                    moreover
                    have "Coplanar B C B Q'"
                      using ncop_distincts by blast
                    moreover
                    have "Coplanar B C A P'"
                      using H5A coplanar_perm_4 ncop__ncols out_col by blast
                    moreover
                    have "Coplanar B C A Q'"
                      using H6B by blast 
                    moreover
                    have "B A Perp B C"
                      by (simp add: B A Perp C B perp_right_comm) 
                    moreover
                    have "P' Q' Perp B C"
                      using H6A Perp_perm by blast 
                    ultimately
                    show ?thesis using l12_9 by blast
                  qed
                  have "Col B A P"
                    by (simp add: H1 out_col) 
                  have "Col P' Q' P"
                    by (simp add: Col P' Q' I P = I) 
                  hence "Col B A C"
                    using not_strict_par
                    by (metis H5A B A Par P' Q' Col B A P 
                        col_trivial_3 colx out_col out_distinct) 
                  hence "False"
                    using K1 by blast 
                }
                hence "P  I" 
                  by auto
                moreover
                have "Col P Q P"
                  by (simp add: col_trivial_3) 
                moreover
                have "Col P Q I"
                  by (simp add: Col P Q I) 
                ultimately
                show ?thesis
                  using perp_col0 by blast 
              qed
              moreover
              have "B  P"
                by (simp add: B  P) 
              moreover
              have "Col A B B"
                using not_col_distincts by blast 
              moreover
              have "Col A B P"
                using Col_perm H1 out_col by blast 
              ultimately
              show ?thesis
                using perp_col0 by blast 
            qed
            have "P' I Perp B P'" 
            proof -
              have "B C Perp P' I" 
              proof -
                have "P' Q' Perp B C"
                  using H6A Perp_perm by blast
                moreover
                {
                  assume "P' = I"
                  have "B C Par P Q" 
                  proof -
                    have "Coplanar B A B P"
                      using ncop_distincts by blast 
                    moreover
                    have "Coplanar B A B Q"
                      using ncop_distincts by blast
                    moreover
                    have "Coplanar B A C P"
                      using H1 ncop__ncols out_col by blast 
                    moreover
                    have "Coplanar B A C Q"
                      by (simp add: Coplanar B Q A C coplanar_perm_3)
                    moreover
                    have "B C Perp B A"
                      by (simp add: perp_left_comm C B Perp B A) 
                    moreover
                    have "P Q Perp B A"
                      using Perp_cases B A Perp Q P by blast
                    ultimately
                    show ?thesis using l12_9 by blast
                  qed
                  have "Col B C P'"
                    using H5A col_permutation_5 out_col by blast 
                  have "Col P Q P'"
                    by (simp add: Col P Q I P' = I)
                  hence "Col B A C"
                    using not_strict_par not_par_inter_uniqueness 
                    by (metis H1 B C Par P Q B  A B  P 
                        Col B C P' col_trivial_3 out_col) 
                  hence "False"
                    using K1 by blast 
                }
                hence "P'  I" 
                  by auto
                moreover
                have "Col P' Q' P'"
                  by (simp add: col_trivial_3) 
                moreover
                have "Col P' Q' I"
                  by (simp add: Col P' Q' I) 
                ultimately
                show ?thesis
                  using perp_col0 by blast 
              qed
              moreover
              have "B  P'"
                using H5A out_diff1 by blast
              moreover
              have "Col B C B"
                using not_col_distincts by blast 
              moreover
              have "Col B C P'"
                using Col_perm H5A out_col by blast
              ultimately
              show ?thesis
                using perp_col0 by blast 
            qed
            have "P'  I"
              using P' I Perp B P' perp_distinct by blast 
            have "P  I"
              using P I Perp B P perp_distinct by auto 
            have "B P Lt B I"
              using H2 H3 B  P Col P Q I P  I per_col per_lt by presburger
            have "A B I CongA C B I"
            proof -
              have "P B I CongA P' B I" 
              proof -
                have "I P B CongA I P' B"
                  using H5B B  P P I Perp B P P  I 
                    P' I Perp B P' P'  I cong_diff_3 l11_16 
                    perp_per_1 by blast 
                show ?thesis
                  using H5B B  P P I Perp B P P  I 
                    P' I Perp B P' cong2_per2__cong_conga2 cong_4321 
                    cong_reflexivity perp_per_1 by auto 
              qed
              moreover
              have "B Out A P"
                by (simp add: H1) 
              moreover
              have "B  I"
                using B C OS P I os_distincts by blast 
              hence "B Out I I"
                using out_trivial by auto 
              moreover
              have "B Out C P'"
                by (simp add: H5A l6_6) 
              ultimately
              show ?thesis using l11_10 by blast
            qed
            thus ?thesis
              using Cong B A B C cong2_conga_cong 
                cong_reflexivity not_cong_2143 by blast 
          qed
          moreover
          have "D Midpoint A C"
            by (simp add: P8B) 
          ultimately
          show ?thesis
            using cong_mid_perp_bisect perp_bisect_sym_1 by auto
        qed
        ultimately
        show ?thesis
          using cop_perp2__col ncoplanar_perm_2 perp_bisect_perp by blast 
      qed
      moreover
      have "¬ Bet D B I" 
      proof -
        {
          assume "Bet D B I" 
          have "B C TS P I" 
          proof -
            have "¬ Col B C D"
              by (metis NCol_cases P8B midpoint_out A  C 
                  C B Perp B A D  C l6_16_1 out_col perp_not_col2) 
            have "B C TS D I"
            proof -
              have "B C OS I P"
                by (simp add: B C OS P I one_side_symmetry) 
              hence "¬ Col B C I"
                using col123__nos by blast 
              have "Bet D B I"
                by (simp add: Bet D B I) 
              thus ?thesis
                using ¬ Col B C D ¬ Col B C I bet__ts 
                  not_col_distincts by auto 
            qed
            moreover
            have "B C OS D A" 
            proof -
              have "Col B C C"
                by (simp add: col_trivial_2) 
              moreover
              have "Col D A C"
                by (simp add: P8B midpoint_col) 
              moreover
              have "C Out D A" 
                using P8B by (simp add: D  C bet_out_1 midpoint_bet)
              ultimately
              show ?thesis
                using ¬ Col B C D l9_19_R2 by blast 
            qed
            moreover
            have "B C OS A P" 
            proof -
              have "Col B C C"
                by (simp add: col_trivial_2) 
              moreover
              have "Col D A C"  
                by (simp add: P8B midpoint_col) 
              moreover
              have "C Out D A"
                using P8B 
                by (simp add: D  C bet_out_1 midpoint_bet)
              ultimately
              show ?thesis
                using ¬ Col B C D H1 K1 col_trivial_3 
                  not_col_permutation_5 out_one_side_1 by blast 
            qed
            ultimately
            show ?thesis
              using l9_8_2 by blast 
          qed
          hence "¬ Bet D B I"
            using B C OS P I l9_9 by blast 
          hence "False"
            by (simp add: Bet D B I) 
        }
        thus ?thesis 
          by auto
      qed
      ultimately
      have " Y. B Out D Y  Col P Q Y" 
        using l6_4_2 Col P Q I by blast 
    }
    ultimately
    show ?thesis
      by blast 
  qed
  ultimately
  show ?thesis by blast
qed

(** Formalization of a proof from Bachmann's article "Zur Parallelenfrage" *)
lemma bachmann_s_lotschnittaxiom__weak_inverse_projection_postulate:
  assumes "bachmann_s_lotschnittaxiom"
  shows "weak_inverse_projection_postulate"
proof -
  have lotschnitt: " A1 A2 B1 B2 C1 C2 D1 D2 IAB IAC IBD.
                        IAB  IAC  IAB  IBD 
                        A1 A2 Perp B1 B2  A1 A2 Perp C1 C2  
                        B1 B2 Perp D1 D2  Col A1 A2 IAB 
                        Col B1 B2 IAB  Col A1 A2 IAC 
                        Col C1 C2 IAC  Col B1 B2 IBD  
                        Col D1 D2 IBD  Coplanar IAB IAC IBD C1  
                        Coplanar IAB IAC IBD C2  
                        Coplanar IAB IAC IBD D1  
                        Coplanar IAB IAC IBD D2
 
                        ( I. Col C1 C2 I  Col D1 D2 I)" 
    using assms bachmann_s_lotschnittaxiom_aux_R1 by auto 
  {
    fix A B C D E F P Q
    assume 1 :"Acute A B C" and
      2: "Per D E F" and
      3: "A B C A B C SumA D E F" and
      4: "B Out A P" and
      5: "P  Q" and
      6: "Per B P Q" and
      7: "Coplanar A B C Q"
    have "A  B"
      using "4" l6_3_1 by blast 
    have "P  B"
      using "4" l6_3_1 by blast 
    have "B  C"
      using "1" acute_distincts by blast 
    have "D  E"
      using "3" suma_distincts by blast 
    have "E  F"
      using "3" suma_distincts by blast 
    {
      assume "Col A B C"
      hence "Col D E F" using col2_suma__col
        using "3" by blast 
      hence "False"
        using "2" D  E E  F per_col_eq by blast 
    }
    hence "¬ Col A B C" 
      by auto
    have "¬ Col B C P"
      by (metis "4" P  B ¬ Col A B C col_permutation_5 
          col_trivial_2 col_trivial_3 colx out_col) 
    obtain P' where P2: "P P' ReflectL B C" 
      using l10_6_existence_spec by (metis col__refl col_trivial_2) 
    hence "P P' Reflect B C"
      by (simp add: B  C is_image_is_image_spec)
    have "¬ Col B C P'"
      using P2 ¬ Col B C P col_image_spec__eq l10_4_spec by blast
    obtain Q' where P3: "Q Q' ReflectL B C"
      using l10_6_existence_spec by (metis image_spec_triv) 
    hence "Q Q' Reflect B C"
      by (simp add: B  C is_image_is_image_spec) 
    have "B  P'"
      using ¬ Col B C P' col_trivial_3 by blast 
    have "P'  Q'"
      using "5" P2 P3 l10_2_uniqueness_spec by blast
    have "C B P' CongA A B C" 
    proof -
      have "C B P' CongA P B C"
        by (metis P2 B  C P  B conga_left_comm 
            is_image_spec_rev not_conga_sym reflectl__conga) 
      moreover
      have "B Out C C"
        using B  C out_trivial by auto 
      moreover
      have "B Out P' P'"
        using B  P' out_trivial by auto 
      ultimately
      show ?thesis
        using "4" l11_10 by blast
    qed
    obtain X where "X Midpoint P' P  Col B C X"
      using P2 ReflectL_def by blast 
    hence " T. Col T B C  Bet P T P'"
      using Mid_cases col_permutation_2 midpoint_bet by blast 
    hence "B C TS P P'"
      using TS_def ¬ Col B C P' ¬ Col B C P col_permutation_1 by blast 
    have "B Out P A"
      by (simp add: "4" l6_6)
    have "Coplanar P' C A B" 
    proof -
      have "Coplanar P' C P B"
        using B C TS P P' ncoplanar_perm_21 ts__coplanar by blast 
      moreover
      have "P  B"
        by (simp add: P  B) 
      moreover
      have "Col P B A"
        using "4" col_permutation_2 out_col by blast 
      moreover
      have "Col P B B"
        by (simp add: col_trivial_2) 
      ultimately
      show ?thesis
        using col2_cop__cop by blast 
    qed
    have "Coplanar B P P' Q"
    proof -
      have "Coplanar C A B B" 
        using ncop_distincts by blast
      moreover have "Coplanar C A B P" 
        using "4" coplanar_perm_20 out__coplanar by blast
      moreover have "Coplanar C A B P'" 
        using Coplanar P' C A B ncoplanar_perm_18 by blast
      moreover have "Coplanar C A B Q" 
        using "7" ncoplanar_perm_8 by blast
      ultimately show ?thesis 
        using ¬ Col A B C NCol_cases coplanar_pseudo_trans by blast
    qed
    have "A B C A B C SumA A B P'" 
    proof -
      have "A B C C B P' SumA A B P'" 
      proof -
        have "Col B B C"
          by (simp add: col_trivial_1)
        hence "¬ B C OS A P'"
          using l9_5 l9_9 B Out P A B C TS P P' by blast 
        moreover
        have "Coplanar A B C P'"
          by (simp add: Coplanar P' C A B coplanar_perm_17) 
        ultimately
        show ?thesis 
          using conga_refl 
          by (metis SumA_def A  B B  C B  P') 
      qed
      moreover
      have "A B C CongA A B C"
        using A  B B  C conga_refl by auto 
      moreover
      have "C B P' CongA A B C"
        by (simp add: C B P' CongA A B C) 
      moreover
      have "A B P' CongA A B P'"
        using calculation(1) suma2__conga by blast 
      ultimately
      show ?thesis
        using conga3_suma__suma by blast 
    qed
    hence "D E F CongA A B P'" 
      using suma2__conga 3 by blast
    hence "Per A B P'" 
      using l11_17 "2" by blast
    have "¬ Col A B P'" 
      using perp_not_col A  B B  P' Per A B P' 
        per_col_eq by blast 
    have "¬ Col B P' P"
      by (meson B Out P A P  B ¬ Col A B P' 
          col_trivial_3 colx not_col_permutation_1 out_col) 
    have "A B Perp B P'"
      by (simp add: A  B B  P' Per A B P' per_perp) 
    have Q1: "A B Perp P Q"
      by (metis "4" "5" "6" Col_perm Per_cases col_per_perp
          A  B P  B out_col perp_comm) 
    have "B B ReflectL B C"
      by (simp add: col__image_spec col_trivial_3)
    hence "B P' Perp P' Q'"
      using 6 P2 P3 B  P' P'  Q' image_spec_preserves_per 
        per_perp by auto 
    have "¬ Col P' P Q" 
    proof -
      have "B P' Par P Q"
      proof -
        have "Coplanar A B B P"
          using ncop_distincts by blast 
        moreover
        have "Coplanar A B B Q"
          using ncop_distincts by blast 
        moreover
        have "Coplanar A B P' P"
          by (meson B Out P A ncop__ncols 
              ncoplanar_perm_9 out_col) 
        moreover
        have "Coplanar A B P' Q"
          using B Out P A Coplanar B P P' Q 
            P  B col_cop__cop ncoplanar_perm_17 out_col 
            coplanar_perm_16 by blast 
        moreover
        have "B P' Perp A B"
          using Perp_perm A B Perp B P' by blast 
        moreover
        have "P Q Perp A B"
          using Perp_perm A B Perp P Q by blast 
        ultimately
        show ?thesis 
          using l12_9 by blast
      qed
      hence "B P' ParStrict P Q"
        using Par_def ¬ Col B P' P not_col_permutation_2 
          par_strict_symmetry par_symmetry by blast 
      moreover
      have "Col P' B P'"
        by (simp add: col_trivial_3) 
      ultimately
      show ?thesis
        using par_strict_not_col_2 by blast 
    qed
    obtain I where P5: "Col I A B  Col I P Q"
      using Q1 NCol_cases perp_inter_perp_in_n by blast 
    hence "Col I A B"
      by simp
    have "Col I P Q"
      using P5 by simp
    have " Y. Col P' Q' Y  Col P Q Y" 
    proof -
      have "B  P"
        using P  B by blast 
      moreover
      have "B  P'"
        by (simp add: B  P') 
      moreover
      have "A B Perp B P'"
        by (simp add: A B Perp B P')
      moreover
      have "A B Perp P Q"
        by (simp add: Q1) 
      moreover
      have "B P' Perp P' Q'"
        by (simp add: B P' Perp P' Q') 
      moreover
      have "Col A B B"
        by (simp add: col_trivial_2) 
      moreover
      have "Col B P' B"
        by (simp add: col_trivial_3) 
      moreover
      have "Col A B P"
        using "4" not_col_permutation_4 out_col by blast
      moreover
      have "Col P Q P"
        by (simp add: col_trivial_3) 
      moreover
      have "Col B P' P'"
        by (simp add: col_trivial_2) 
      moreover
      have "Col P' Q' P'"
        by (simp add: col_trivial_3) 
      moreover
      have "Coplanar B P P' P"
        using ncop_distincts by blast 
      moreover
      have "Coplanar B P P' Q"
        using Coplanar B P P' Q by blast 
      moreover
      have "Coplanar B P P' P'"
        using ncop_distincts by blast 
      moreover
      have "Coplanar B P P' Q'" 
      proof -
        {
          assume "Col B C Q"
          have "Q = Q'"
            using P3 Col B C Q col_image_spec__eq by blast 
          hence "Coplanar B P P' Q'"
            using calculation(13) by blast 
        }
        moreover
        {
          assume "¬ Col B C Q" 
          moreover
          have "Coplanar B C Q B"
            using ncop_distincts by blast
          moreover
          have "Coplanar B C Q P"
            using "7" A  B Col A B B Col A B P 
              col2_cop__cop ncoplanar_perm_14 
              ncoplanar_perm_17 by blast
          moreover
          have "Coplanar B C Q P'"
            by (metis T. Col T B C  Bet P T P' 
                ¬ Col B C P bet_col calculation(3) col_cop2__cop 
                col_permutation_1 ncop__ncols)
          moreover
          have "Coplanar B C Q Q'"
            using P3 ncoplanar_perm_16 reflectl__coplanar by blast 
          ultimately
          have "?thesis"
            using coplanar_pseudo_trans by blast 
        }
        ultimately
        show ?thesis by auto
      qed
      ultimately
      show ?thesis using lotschnitt by blast
    qed
    then obtain Y where P7: "Col P' Q' Y  Col P Q Y" 
      by auto
    hence "Col P' Q' Y" 
      by simp
    have "Col P Q Y"
      using P7 by simp
    have "B Out C Y" 
    proof -
      have "Col B C Y" 
      proof -
        have "P P' Reflect B C"
          by (simp add: P P' Reflect B C)
        moreover
        have "Q Q' Reflect B C"
          by (simp add: Q Q' Reflect B C) 
        moreover
        have "¬ Col P Q P'"
          using NCol_perm ¬ Col P' P Q by blast 
        moreover
        have "Col P Q Y"
          using Col P Q Y by blast 
        moreover
        have "Col P' Q' Y"
          using Col P' Q' Y by blast 
        ultimately
        show ?thesis 
          using intersection_with_image_gen not_col_permutation_2 by blast 
      qed
      moreover
      have "B A OS C Y" 
      proof -
        have "A B OS C P'" 
        proof -
          have "Coplanar A B C P'"
            by (simp add: Coplanar P' C A B coplanar_perm_17) 
          moreover
          have "¬ Col C A B"
            by (simp add: ¬ Col A B C not_col_permutation_2) 
          moreover
          have "¬ Col P' A B"
            using Col_cases ¬ Col A B P' by blast 
          moreover
          have "¬ A B TS C P'" 
          proof -
            have "SAMS A B C A B C"
              by (simp add: "1" acute__sams) 
            moreover
            have "C B P' CongA A B C"
              using C B P' CongA A B C by blast 
            moreover
            have "¬ B C OS A P'"
            proof -
              have "B C TS P P'"
                using B C TS P P' by blast 
              moreover 
              have "Col B B C"
                by (simp add: col_trivial_1) 
              moreover
              have "B Out P A"
                by (simp add: B Out P A) 
              ultimately
              show ?thesis
                using l9_5 l9_9 by blast 
            qed
            ultimately
            show ?thesis
              using conga_sams_nos__nts by blast  
          qed
          ultimately
          show ?thesis
            using cop_nts__os by blast 
        qed
        moreover
        have "A B OS P' Y" 
        proof -
          have "P'  Y"
            using Col B C Y ¬ Col B C P' by blast 
          moreover
          have "A B ParStrict P' Q'" 
          proof -
            have "A B Par P' Q'" 
            proof -
              have "Coplanar B P' A P'"
                using ncop_distincts by blast 
              moreover
              have "Coplanar B P' A Q'"
              proof -
                {
                  assume "Col B C Q"
                  hence "Q = Q'"
                    using P3 col_image_spec__eq by blast 
                  have  "?thesis" 
                    using P3 Col B C Q B  C Coplanar P' C A B 
                      Q = Q' col2_cop__cop col_trivial_3 coplanar_perm_13 
                      ncoplanar_perm_14 by blast 
                }
                moreover
                {
                  assume "¬ Col B C Q"
                  have "Coplanar B C Q B"
                    using ncop_distincts by blast 
                  moreover
                  have "Coplanar B C Q P'"
                    using "7" Coplanar P' C A B ¬ Col A B C 
                      coplanar_trans_1 ncoplanar_perm_22 by blast 
                  moreover
                  have "Coplanar B C Q A"
                    by (meson "7" ncoplanar_perm_18) 
                  moreover
                  have "Coplanar B C Q Q'"
                  proof -
                    have "Coplanar A B C B" 
                      using ncop_distincts by blast
                    moreover have "Coplanar A B C C" 
                      using ncop_distincts by blast
                    moreover have "Coplanar A B C Q'" 
                      by (meson B  C Col B C Y Col P' Q' Y 
                          Coplanar P' C A B P'  Y calculation(1) 
                          calculation(2) col_cop2__cop 
                          col_permutation_5 coplanar_perm_17)
                    ultimately show ?thesis
                      using ¬ Col A B C "7" coplanar_trans_1 by blast
                  qed
                  ultimately
                  have "Coplanar B P' A Q'"
                    using ¬ Col B C Q coplanar_pseudo_trans by blast 
                }
                ultimately
                show ?thesis 
                  by auto
              qed
              moreover
              have "Coplanar B P' B P'"
                using ncop_distincts by blast 
              moreover
              have "Coplanar B P' B Q'"
                using ncop_distincts by blast 
              moreover
              have "A B Perp B P'"
                by (simp add: A B Perp B P') 
              moreover
              have "P' Q' Perp B P'"
                using Perp_perm B P' Perp P' Q' by blast 
              ultimately
              show ?thesis
                using l12_9 by blast
            qed
            moreover
            have "Col P' Q' P'"
              by (simp add: col_trivial_3) 
            moreover
            have "¬ Col A B P'"
              by (simp add: ¬ Col A B P') 
            ultimately
            show ?thesis
              using par_not_col_strict by blast 
          qed
          moreover
          have "Col P' Q' Y"
            by (simp add: Col P' Q' Y) 
          ultimately
          show ?thesis
            using par_strict_all_one_side by blast 
        qed
        ultimately
        show ?thesis
          using invert_one_side one_side_transitivity by blast 
      qed
      ultimately
      show ?thesis
        using col_one_side_out by blast 
    qed
    hence " Y. B Out C Y  Col P Q Y" 
      using P7 by auto
  }
  thus ?thesis
    using weak_inverse_projection_postulate_def by blast
qed

lemma bachmann_s_lotschnittaxiom__weak_triangle_circumscription_principle:
  assumes "bachmann_s_lotschnittaxiom"
  shows "weak_triangle_circumscription_principle"
proof -
  have P1: " A1 A2 B1 B2 C1 C2 D1 D2 IAB IAC IBD.
              IAB  IAC  IAB  IBD  A1 A2 Perp B1 B2  
              A1 A2 Perp C1 C2  B1 B2 Perp D1 D2 
              Col A1 A2 IAB  Col B1 B2 IAB  
              Col A1 A2 IAC  Col C1 C2 IAC  
              Col B1 B2 IBD  Col D1 D2 IBD 
              Coplanar IAB IAC IBD C1  Coplanar IAB IAC IBD C2 
              Coplanar IAB IAC IBD D1  Coplanar IAB IAC IBD D2
 
              ( I. Col C1 C2 I  Col D1 D2 I)"
    using assms bachmann_s_lotschnittaxiom_aux by auto
  moreover
  {
    fix A B C A1 A2 B1 B2
    assume 1: "¬ Col A B C" and
      2: "Per A C B" and
      3: "A1 A2 PerpBisect B C" and
      4: "B1 B2 PerpBisect A C" and
      5: "Coplanar A B C A1" and
      6: "Coplanar A B C A2" and
      7: "Coplanar A B C B1" and
      8: "Coplanar A B C B2"
    obtain A3 where 9: "A1  A2  Col A3 A1 A2  Col A3 B C" 
      using 3 perp_bisect_perp Perp_def PerpAt_def by blast 
    obtain B3 where 10: "B1  B2  Col B3 B1 B2  Col B3 A C"
      using 4 perp_bisect_perp Perp_def PerpAt_def by blast 
    have "A  B"
      using "1" col_trivial_1 by blast 
    have "B  C"
      using "1" col_trivial_2 by auto 
    have "A  C"
      using "1" col_trivial_3 by blast
    have "C  A3" 
    proof -
      obtain C' where 11: "C' Midpoint C B  Col A1 A2 C'"
        by (metis (full_types) "3" "9" B  C l4_17 
            l7_20_bis not_col_permutation_2 not_cong_4321 
            perp_bisect_cong_1 perp_bisect_cong_2)
      have "C'  C"
        using "11" B  C cong_reverse_identity midpoint_cong by blast 
      have "C'  B"
        using "11" B  C is_midpoint_id_2 by blast
      {
        assume "C = A3"
        {
          assume "¬ Col A1 A2 B"
          have "C = C'"
            by (metis "11" "9" C = A3 ¬ Col A1 A2 B 
                colx midpoint_col not_col_permutation_2) 
        }
        moreover
        {
          assume "¬ Col A1 A2 C"
          have "C = C'"
            using "9" C = A3 ¬ Col A1 A2 C col_permutation_1 by blast 
        }
        ultimately
        have "C = C'" 
          using 3 perp_not_col2 perp_bisect_perp by blast 
        hence "False"
          using C'  C by blast 
      }
      thus ?thesis by auto
    qed
    moreover
    have "C  B3" 
    proof -
      obtain C' where 12: "C' Midpoint C A  Col B1 B2 C'"
        by (metis (full_types) "10" "4" A  C l4_17 
            l7_20_bis not_col_permutation_2 not_cong_4321 
            perp_bisect_cong_1 perp_bisect_cong_2) 
      have "C'  C"
        by (metis "12" A  C midpoint_distinct_1) 
      have "C'  A"
        using "12" A  C is_midpoint_id_2 by force
      {
        assume "C = B3"
        {
          assume "¬ Col B1 B2 A"
          have "C = C'"
            by (metis "10" "12" C = B3 ¬ Col B1 B2 A 
                colx midpoint_col not_col_permutation_2) 
        }
        moreover
        {
          assume "¬ Col B1 B2 C"
          have "C = C'"
            using "10" C = B3 ¬ Col B1 B2 C not_col_permutation_2 by blast 
        }
        ultimately
        have "C = C'" 
          using "4" perp_not_col2 perp_bisect_perp by blast
        hence "False"
          using C'  C by blast 
      }
      thus ?thesis by auto
    qed
    moreover
    have "B C Perp A C"
      by (metis "2" Perp_perm A  C B  C per_perp) 
    moreover
    have "B C Perp A1 A2"
      using "3" Perp_perm perp_bisect_perp by blast 
    moreover
    have "A C Perp B1 B2"
      using "4" Perp_perm perp_bisect_perp by blast 
    moreover
    have "Col B C C"
      by (simp add: col_trivial_2) 
    moreover
    have "Col A C C"
      by (simp add: col_trivial_2) 
    moreover
    have "Col B C A3"
      using "9" not_col_permutation_2 by blast 
    moreover
    have "Col A1 A2 A3"
      using "9" NCol_cases by blast 
    moreover
    have "Col A C B3"
      using "10" Col_perm by blast 
    moreover
    have "Col B1 B2 B3"
      using "10" Col_cases by blast 
    moreover
    have "Coplanar C A3 B3 A1"
    proof -
      have "Coplanar A B C C" 
        using ncop_distincts by blast
      moreover have "Coplanar A B C A3" 
        using Col B C A3 ncop__ncols by blast
      moreover have "Coplanar A B C B3" 
        using Col A C B3 ncop__ncols by auto
      ultimately show ?thesis 
        using "1" "5" coplanar_pseudo_trans by blast
    qed
    moreover
    have "Coplanar C A3 B3 A2"
    proof -
      have "Coplanar A B C C" 
        using ncop_distincts by blast
      moreover have "Coplanar A B C A3" 
        using Col B C A3 ncop__ncols by blast
      moreover have "Coplanar A B C B3" 
        by (meson Col A C B3 ncop__ncols)
      ultimately show ?thesis 
        using "1" "6" coplanar_pseudo_trans by blast
    qed
    moreover
    have "Coplanar C A3 B3 B1" 
    proof -
      have "Coplanar A B C C" 
        using ncop_distincts by blast
      moreover have "Coplanar A B C A3" 
        using Col B C A3 ncop__ncols by blast
      moreover have "Coplanar A B C B3" 
        using Col A C B3 ncop__ncols by blast
      ultimately show ?thesis 
        using "1" "7" coplanar_pseudo_trans by blast
    qed
    moreover
    have "Coplanar C A3 B3 B2" 
    proof -
      have "Coplanar A B C C" 
        using ncop_distincts by blast
      moreover have "Coplanar A B C A3" 
        using Col B C A3 ncop__ncols by blast
      moreover have "Coplanar A B C B3" 
        using Col A C B3 ncop__ncols by blast
      ultimately show ?thesis 
        using "1" coplanar_pseudo_trans "8" by blast
    qed
    ultimately
    have " I. Col A1 A2 I  Col B1 B2 I"
      using P1 by blast
  }
  thus ?thesis using P1 weak_triangle_circumscription_principle_def by auto
qed

lemma consecutive_interior__alternate_interior:
  assumes "consecutive_interior_angles_postulate"
  shows "alternate_interior_angles_postulate" 
proof -
  {
    fix A B C D
    assume 1: "A C TS B D" and
      2: "A B Par C D"
    obtain D' where 3: "Bet D C D'  Cong C D' C D"
      using segment_construction by blast
    have "A C TS D' D"
      by (metis "1" "3" bet__ts bet_col between_trivial 
          cong_reverse_identity invert_two_sides l9_18 l9_2)
    hence "A C OS B D'"
      using "1" l9_8_1 by blast 
    hence "B A C SuppA A C D'"
      by (metis "2" "3" assms bet_col bet_col1 
          consecutive_interior_angles_postulate_def 
          os_distincts par_col2_par par_comm) 
    moreover
    have "D C A SuppA A C D'"
      by (metis "2" "3" A C OS B D' bet__suppa os_distincts par_neq2) 
    ultimately
    have "B A C CongA D C A"
      using suppa2__conga123 by blast 
  }
  thus ?thesis
    by (simp add: alternate_interior_angles_postulate_def) 
qed

lemma existential_playfair__rah_1:
  "postulate_of_right_saccheri_quadrilaterals  
   hypothesis_of_right_saccheri_quadrilaterals" 
proof -
  {
    assume "postulate_of_right_saccheri_quadrilaterals"
    {
      fix A B C D
      assume "Saccheri A B C D"
      have "Per A B C"
        using PostulateRightSaccheriQuadrilaterals 
          Saccheri A B C D postulate_of_right_saccheri_quadrilaterals_def 
        by blast 
    }
    hence "hypothesis_of_right_saccheri_quadrilaterals"
      by (simp add: hypothesis_of_right_saccheri_quadrilaterals_def) 
  }
  moreover
  {
    assume "hypothesis_of_right_saccheri_quadrilaterals"
    {
      fix A B C D
      assume "Saccheri A B C D"
      have "Per A B C"
        using HypothesisRightSaccheriQuadrilaterals 
          Saccheri A B C D hypothesis_of_right_saccheri_quadrilaterals_def 
        by blast
    }
    hence "postulate_of_right_saccheri_quadrilaterals"
      by (simp add: postulate_of_right_saccheri_quadrilaterals_def) 
  }
  ultimately
  show ?thesis by auto
qed

lemma existential_playfair__rah:
  assumes "existential_playfair_s_postulate"
  shows "postulate_of_right_saccheri_quadrilaterals" 
proof -
  obtain A1 A2 P where 1: "¬ Col A1 A2 P 
             ( B1 B2 C1 C2.
                (A1 A2 Par B1 B2  Col P B1 B2 
                 A1 A2 Par C1 C2  Col P C1 C2) 
                (Col C1 B1 B2  Col C2 B1 B2))"
    using assms existential_playfair_s_postulate_def by blast
  have "¬ Col A1 A2 P"
    using 1 by blast
  have " B1 B2 C1 C2.
                (A1 A2 Par B1 B2  Col P B1 B2 
                 A1 A2 Par C1 C2  Col P C1 C2) 
                (Col C1 B1 B2  Col C2 B1 B2)"
    using 1 by blast
  obtain Q where "Col A1 A2 Q  A1 A2 Perp P Q"
    using ¬ Col A1 A2 P l8_18_existence by presburger
  have " A3. Col A1 A2 A3  A3  Q"
    by (metis col_trivial_2 diff_col_ex) 
  then obtain A3 where "Col A1 A2 A3  A3  Q" 
    by auto
  have "P  Q"
    using Col A1 A2 Q  A1 A2 Perp P Q ¬ Col A1 A2 P by auto 
  then obtain R where "P Q Perp R P  Coplanar P Q A3 R"
    using ex_perp_cop by presburger
  have "P Q Perp R P"
    by (simp add: P Q Perp R P  Coplanar P Q A3 R) 
  have "Coplanar P Q A3 R"
    by (simp add: P Q Perp R P  Coplanar P Q A3 R)
  have "A1  A2"
    using ¬ Col A1 A2 P col_trivial_1 by blast 
  have "Q  P"
    using P  Q by auto 
  have "R  P"
    using P Q Perp R P perp_distinct by auto
  have "A1 A2 Par P R" 
  proof -
    have "Coplanar P Q A1 P"
      using ncop_distincts by blast 
    moreover
    have "Coplanar P R Q A1" 
    proof -
      have "Coplanar P R Q A3"
        by (simp add: P Q Perp R P  Coplanar P Q A3 R coplanar_perm_4) 
      moreover
      have "Q  A3"
        using Col A1 A2 A3  A3  Q by auto 
      moreover
      have "Col Q A3 A1"
        by (meson A1  A2 Col A1 A2 A3  A3  Q 
            Col A1 A2 Q  A1 A2 Perp P Q col3 col_trivial_3) 
      ultimately
      show ?thesis
        using col_cop__cop by blast 
    qed
    hence "Coplanar P Q A1 R"
      using ncoplanar_perm_4 by blast 
    moreover
    have "Coplanar P Q A2 P"
      using ncop_distincts by blast 
    moreover
    have "Coplanar P R Q A2" 
    proof -
      have "Coplanar P R Q A3"
        by (simp add: P Q Perp R P  Coplanar P Q A3 R coplanar_perm_4) 
      moreover
      have "Q  A3"
        using Col A1 A2 A3  A3  Q by auto 
      moreover
      have "Col Q A3 A2"
        by (meson A1  A2 Col A1 A2 A3  A3  Q 
            Col A1 A2 Q  A1 A2 Perp P Q col3 col_trivial_2) 
      ultimately
      show ?thesis
        using col_cop__cop by blast 
    qed
    hence "Coplanar P Q A2 R"
      by (simp add: coplanar_perm_3) 
    moreover
    have "A1 A2 Perp P Q"
      by (simp add: Col A1 A2 Q  A1 A2 Perp P Q)
    moreover
    have "P R Perp P Q"
      using Perp_perm P Q Perp R P  Coplanar P Q A3 R by blast 
    ultimately
    show ?thesis
      using l12_9 by blast 
  qed
  have "Coplanar A1 A2 P R"
    by (simp add: A1 A2 Par P R par__coplanar)
  have "A1 A2 ParStrict P R"
    using A1 A2 Par P R ¬ Col A1 A2 P col_trivial_3 
      par_not_col_strict by blast
  have "¬ Col A1 A2 R"
    using A1 A2 ParStrict P R par_strict_not_col_4 by auto
  obtain S where "Col A1 A2 S  A1 A2 Perp R S"
    using ¬ Col A1 A2 R l8_18_existence by blast
  hence "Col A1 A2 S"
    by auto
  have "A1 A2 Perp R S"
    by (simp add: Col A1 A2 S  A1 A2 Perp R S)
  have "P Q Par R S" 
  proof -
    have "Coplanar A1 A2 P R"
      by (simp add: Coplanar A1 A2 P R) 
    moreover
    have "Coplanar A1 A2 P S"
      using Col A1 A2 S  A1 A2 Perp R S ncop__ncols by blast 
    moreover
    have "Coplanar A1 A2 Q R"
      using Col A1 A2 Q  A1 A2 Perp P Q ncop__ncols by blast 
    moreover
    have "Coplanar A1 A2 Q S"
      by (meson ¬ Col A1 A2 P ¬ Col A1 A2 R calculation(1) 
          calculation(2) calculation(3) l9_30 ncop_distincts) 
    moreover
    have "P Q Perp A1 A2"
      using Perp_perm Col A1 A2 Q  A1 A2 Perp P Q by blast 
    moreover
    have "R S Perp A1 A2"
      using Perp_perm Col A1 A2 S  A1 A2 Perp R S by blast 
    ultimately
    show ?thesis
      using l12_9 by blast 
  qed
  have "¬ Col P Q R"
    by (simp add: P Q Perp R P  Coplanar P Q A3 R perp_not_col) 
  hence "P Q ParStrict R S"
    using P Q Par R S col_trivial_3 par_not_col_strict by blast 
  hence "¬ Col R S P"
    by (meson par_strict_not_col_3) 
  then obtain R' where "Col R S R'  R S Perp P R'"
    using l8_18_existence by blast 
  hence "Col R S R'" 
    by auto
  have "R S Perp P R'"
    by (simp add: Col R S R'  R S Perp P R') 
  have "A1 A2 Par P R'" 
  proof -
    have "Coplanar R P A1 A2"
      using Coplanar A1 A2 P R ncoplanar_perm_17 by blast 
    hence "Coplanar R S A1 P" 
      using Col A1 A2 S A1  A2 col_cop__cop coplanar_perm_5 by blast 
    moreover
    have "Coplanar R S A1 R'"
      using Col R S R' ncop__ncols by blast 
    moreover
    have "Coplanar R S A2 P"
      by (metis Col A1 A2 S Coplanar R P A1 A2 
          calculation(1) col_cop__cop coplanar_perm_4 
          not_col_permutation_1) 
    moreover
    have "Coplanar R S A2 R'"
      using Col R S R' ncop__ncols by blast 
    moreover
    have "A1 A2 Perp R S"
      by (simp add: Col A1 A2 S  A1 A2 Perp R S) 
    moreover
    have "P R' Perp R S"
      using Perp_perm R S Perp P R' by blast 
    ultimately
    show ?thesis
      using l12_9 by blast
  qed
  have "Col R' P R" 
    using 1 A1 A2 Par P R' A1 A2 Par P R col_trivial_1 by blast 
  hence "R = R'" 
    using l6_21
    by (metis Perp_perm Col R S R'  R S Perp P R' 
        perp_col perp_not_col) 
  have "P Q ParStrict R S"
    by (simp add: P Q ParStrict R S) 
  have "Per Q S R" 
  proof -
    have "Q S Perp R S" 
    proof -
      have "Q  S"
        using P Q ParStrict R S col_trivial_2 
          par_strict_not_col_4 by blast 
      moreover
      have "Col A1 A2 Q" 
        using Col A1 A2 Q  A1 A2 Perp P Q by auto
      ultimately
      show ?thesis
        using A1 A2 Perp R S Col A1 A2 S perp_col2 by blast 
    qed
    moreover
    have "Col S Q S"
      using col_trivial_3 by blast 
    moreover
    have "Col S R S"
      by (simp add: col_trivial_3) 
    ultimately
    show ?thesis
      using perp_comm perp_per_2 by blast 
  qed
  moreover
  have "Lambert P Q S R"
  proof -
    have "Q  S"
      using P Q ParStrict R S col_trivial_3 
        par_strict_not_col_2 by blast 
    moreover
    have "S  R"
      using ¬ Col R S P col_trivial_1 by blast 
    moreover
    have "Per Q P R"
      by (simp add: P Q Perp R P perp_per_1) 
    moreover 
    have "Per P R S"
      using R = R' R S Perp P R' l8_2 perp_per_1 by blast 
    moreover
    have "Per P Q S" 
    proof -
      have "A1 A2 Perp P Q"
        by (simp add: Col A1 A2 Q  A1 A2 Perp P Q) 
      moreover
      have "Col A1 A2 Q" 
        using Col A1 A2 Q  A1 A2 Perp P Q by auto
      ultimately
      show ?thesis
        using Q  S Col A1 A2 S l8_16_1 by blast 
    qed
    moreover
    have "Coplanar P Q S R"
      using P Q Par R S coplanar_perm_1 par__coplanar by blast 
    ultimately
    show ?thesis
      using Lambert_def Q  P R  P by blast 
  qed
  ultimately 
  have "hypothesis_of_right_saccheri_quadrilaterals"
    using lam_per__rah_1 by blast 
  show ?thesis
    by (simp add: HypothesisRightSaccheriQuadrilaterals 
        existential_playfair__rah_1) 
qed

lemma existential_saccheri__rah:
  assumes "postulate_of_existence_of_a_right_saccheri_quadrilateral"
  shows "postulate_of_right_saccheri_quadrilaterals" 
  using per_sac__rah assms existential_playfair__rah_1 
    postulate_of_existence_of_a_right_saccheri_quadrilateral_def by blast 

lemma existential_triangle__rah:
  assumes "postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights"
  shows "postulate_of_right_saccheri_quadrilaterals" 
  using t22_14__rah assms 
    existential_playfair__rah_1 
    postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights_def 
  by blast 

lemma inverse_projection_postulate__proclus_bis:
  assumes "inverse_projection_postulate"
  shows "alternative_proclus_postulate" 
proof -
  {
    fix A B C D P Q
    assume 1: "P Perp2 A B C D  ¬ Col C D P  Coplanar A B C D 
  Col A B P  ¬ Col A B Q  Coplanar C D P Q"
    hence "P Perp2 A B C D"
      by auto
    have "¬ Col C D P"
      using 1 by auto
    have "Coplanar A B C D"
      using 1 by auto
    have "Col A B P"
      using 1 by auto
    have "¬ Col A B Q"
      using 1 by auto
    have "Coplanar C D P Q"
      using 1 by auto
    have "C D ParStrict A B" 
    proof -
      have "Coplanar C D A B"
        by (simp add: Coplanar A B C D coplanar_perm_16) 
      moreover
      have "P Perp2 C D A B"
        using "1" perp2_sym by blast 
      ultimately
      show ?thesis 
        using Col A B P ¬ Col C D P col_cop_perp2__pars_bis by blast 
    qed
    obtain P1 P2 where 2: "Col P P1 P2  P1 P2 Perp A B  P1 P2 Perp C D"
      using Perp2_def P Perp2 A B C D by blast
    have "Col P P1 P2"
      using 2 by blast
    have "P1 P2 Perp A B"
      using 2 by blast
    have "P1 P2 Perp C D"
      using 2 by blast
    then obtain C0 where "C0 PerpAt P1 P2 C D"
      using perp_inter_perp_in_n by blast 
    hence "Col C0 P1 P2  Col C0 C D"
      using Col_cases perp_in_col by blast 
    hence "Col C0 P1 P2"
      by blast
    have "Col C0 C D"
      using Col C0 P1 P2  Col C0 C D by auto
    obtain P' where "P' PerpAt P1 P2 A B"
      using P1 P2 Perp A B perp_inter_perp_in_n by blast
    have "Col P A B"
      using Col_perm Col A B P by blast
    hence "P = P'"
      using Col P P1 P2 P' PerpAt P1 P2 A B l8_14_2_1b by blast 
    have "P  C0"
    proof -
      {
        assume "P = C0"
        hence "Col P C D"
          by (simp add: Col C0 C D) 
        hence "False"
          using ¬ Col C D P col_permutation_1 by blast 
      }
      thus ?thesis 
        by auto
    qed
    have "A B Perp P C0" 
    proof -
      have "Col P1 P2 P"
        by (simp add: Col P P1 P2 col_permutation_1) 
      moreover
      have "Col P1 P2 C0"
        by (simp add: Col C0 P1 P2 col_permutation_1) 
      ultimately
      show ?thesis
        using P  C0 P1 P2 Perp A B perp_col0 by blast 
    qed
    have "C D Perp P C0"
    proof -
      have "Col P1 P2 P"
        by (simp add: Col P P1 P2 col_permutation_1) 
      moreover
      have "Col P1 P2 C0"
        by (simp add: Col C0 P1 P2 col_permutation_1) 
      ultimately
      show ?thesis
        using P  C0 P1 P2 Perp C D perp_col0 by blast
    qed
    have "P  Q"
      using Col A B P ¬ Col A B Q by auto
    have " Y. (Col P Q Y  Col C D Y)" 
    proof (cases "Col P Q C0")
      case True
      thus ?thesis
        using Col C0 C D col_permutation_1 by blast 
    next
      case False
      have "¬ Col C0 A B" 
        using C D ParStrict A B Col C0 C D par_not_col by blast 
      have " Q0. Col Q P Q0  A B OS C0 Q0" 
      proof -
        have "Q  P"
          using P  Q by auto 
        moreover
        have "Col Q P P"
          by (simp add: col_trivial_2) 
        moreover
        have "¬ Col A B C0"
          using NCol_perm ¬ Col C0 A B by blast 
        moreover
        have "Coplanar A B Q C0" 
        proof -
          have "Coplanar C D P A" 
            by (metis Col A B P Coplanar A B C D ¬ Col C0 A B 
                col_cop__cop coplanar_perm_1 coplanar_perm_16
                not_col_distincts)
          moreover have "Coplanar C D P B" 
            using Col P A B Coplanar A B C D calculation 
              col_cop__cop coplanar_perm_16 by blast
          moreover have "Coplanar C D P C0" 
            using Col_cases Col C0 C D ncop__ncols by blast
          ultimately show ?thesis 
            using ¬ Col C D P Coplanar C D P Q 
              coplanar_pseudo_trans by blast
        qed
        ultimately
        show ?thesis
          using ¬ Col A B Q Col A B P cop_not_par_same_side by blast 
      qed
      then obtain Q0 where "Col Q P Q0  A B OS C0 Q0" 
        by auto
      hence "Col Q P Q0" 
        by auto
      have "A B OS C0 Q0"
        by (simp add: Col Q P Q0  A B OS C0 Q0) 
      have "¬ Col A B Q0"
        using Col Q P Q0  A B OS C0 Q0 one_side_not_col124 by blast
      {
        assume "P = Q0" 
        hence "Col A B P"
          using Col A B P by auto 
        hence "False"
          by (simp add: P = Q0 ¬ Col A B Q0) 
      }
      hence "P  Q0"
        by auto
      have "¬ Col P C0 Q0"
        by (metis False Col Q P Q0 P  Q0 col_transitivity_1 
            not_col_permutation_2)
      have " C1. Col C D C1  C1  C0"
        by (metis col_trivial_3 diff_col_ex)
      then obtain C1 where "Col C D C1  C1  C0"
        by auto
      hence "Col C D C1"
        by auto
      have "C1  C0"
        by (simp add: Col C D C1  C1  C0)
      have " A0. Col A B A0  P C0 OS Q0 A0" 
      proof (cases "Col P C0 A")
        case True
        have "¬ Col P C0 B"
          using True P  C0 ¬ Col C0 A B col_transitivity_2 by blast
        have " Q. Col B A Q  P C0 OS Q0 Q" 
        proof -
          have "B  A"
            using ¬ Col C0 A B col_trivial_2 by auto 
          moreover
          have "Col P C0 P"
            by (simp add: col_trivial_3) 
          moreover
          have "Col B A P"
            using Col_cases Col A B P by blast 
          moreover
          have "¬ Col P C0 B"
            by (simp add: ¬ Col P C0 B) 
          moreover
          have "¬ Col P C0 Q0"
            by (simp add: ¬ Col P C0 Q0) 
          moreover
          have "Coplanar P C0 B Q0"
            by (metis True Col P A B Col Q P Q0  A B OS C0 Q0 
                calculation(2) calculation(4) colx 
                coplanar_perm_2 os__coplanar) 
          ultimately
          show ?thesis
            using cop_not_par_same_side by blast 
        qed
        thus ?thesis
          using not_col_permutation_4 by blast 
      next
        case False
        have "Coplanar P C0 A Q0"
          by (metis False Col A B P Col Q P Q0  A B OS C0 Q0 
              col2_os__os col_trivial_3 coplanar_perm_2 os__coplanar) 
        thus ?thesis
          by (metis False Col A B P ¬ Col C0 A B ¬ Col P C0 Q0 
              col_trivial_2 col_trivial_3 cop_not_par_same_side) 
      qed
      then obtain A0 where "Col A B A0  P C0 OS Q0 A0"
        by auto
      hence "Col A B A0" 
        by auto
      have "P C0 OS Q0 A0"
        by (simp add: Col A B A0  P C0 OS Q0 A0)
      have "¬ Col P C0 A0"
        using P C0 OS Q0 A0 one_side_not_col124 by blast 
      have " Y. P Out Q0 Y  Col C0 C1 Y" 
      proof -
        have "Acute C0 P Q0" 
        proof -
          have "A B Perp C0 P"
            by (simp add: A B Perp P C0 perp_right_comm) 
          hence "Per C0 P A0" 
            using Col A B P Col A B A0 l8_16_1 by blast
          moreover
          have "C0 P Q0 LtA C0 P A0" 
          proof -
            have "P A0 OS C0 Q0"
              by (metis Col A B A0  P C0 OS Q0 A0 Col A B P 
                  Col Q P Q0  A B OS C0 Q0 ¬ Col P C0 A0 
                  col2_os__os col_trivial_3) 
            hence "Q0 InAngle C0 P A0"
              by (simp add: P C0 OS Q0 A0 one_side_symmetry os2__inangle) 
            hence "C0 P Q0 LeA C0 P A0"
              using inangle__lea by force 
            moreover
            {
              assume "C0 P Q0 CongA C0 P A0"
              have "C0 P OS Q0 A0"
                by (meson P C0 OS Q0 A0 invert_one_side) 
              hence "P Out Q0 A0" 
                using conga_os__out
                using C0 P Q0 CongA C0 P A0 by blast 
              hence "Col A B Q0"
                using P A0 OS C0 Q0 os_distincts out_out_one_side by blast 
              hence "False"
                using ¬ Col A B Q0 by auto 
            }
            hence "¬ C0 P Q0 CongA C0 P A0" 
              by auto
            ultimately
            show ?thesis
              using LtA_def by blast 
          qed
          ultimately
          show ?thesis
            using Acute_def by blast 
        qed
        moreover
        have "P Out C0 C0"
          using P  C0 out_trivial by auto 
        moreover
        have "C0  C1"
          using C1  C0 by blast 
        moreover
        have "Col C D C0"
          by (simp add: Col C0 C D col_permutation_1) 
        hence "Per P C0 C1" 
          using l8_16_1 C D Perp P C0 Col C D C1 by blast
        moreover
        have "Coplanar C0 P Q0 C1" 
        proof -
          have "Coplanar C D P C0" 
            using Col C D C0 ncop__ncols by blast
          moreover have "Coplanar C D P P" 
            using ncop_distincts by auto
          moreover have "Coplanar C D P Q0" 
            by (metis Col Q P Q0 Coplanar C D P Q 
                P  Q calculation(2) col_cop2__cop)
          moreover have "Coplanar C D P C1" 
            using Col C D C1 ncop__ncols by blast
          ultimately show ?thesis
            using ¬ Col C D P coplanar_pseudo_trans by blast
        qed
        ultimately
        show ?thesis 
          using assms inverse_projection_postulate_def by blast
      qed
      then obtain Y where "P Out Q0 Y" and "Col C0 C1 Y" 
        by blast
      have "Col P Q Y" 
        by (meson Col Q P Q0 P Out Q0 Y P  Q0 
            col_permutation_1 l6_16_1 out_col)
      have "Col C D Y" 
        by (metis Col C D C1  C1  C0 Col C0 C D 
            Col C0 C1 Y colx not_col_permutation_2)
      thus ?thesis 
        using Col P Q Y by blast
    qed
  }
  thus ?thesis
    using alternative_proclus_postulate_def by fastforce 
qed

(** Given a non-degenerated parallelogram PRQS and a point U not on line PR,
    the lines PU and SQ intersect. *)

lemma strong_parallel_postulate_implies_inter_dec:
  (*  assumes "strong_parallel_postulate"*)
  shows "decidability_of_intersection" 
proof -
  {
    fix P Q S U
    have "( I. Col I S Q  Col I P U)  ¬ ( I. Col I S Q   Col I P U)"
      by blast
  }
  thus ?thesis
    using decidability_of_intersection_def by blast 
qed

lemma impossible_case_1:
  assumes "Bet A B x" and
    "Bet C y A" and
    "B C ParStrict x y"
  shows "False" 
proof -
  have "Bet x B A"
    using Bet_cases assms(1) by blast
  then obtain I where "Bet B I C  Bet y I x"
    using assms(2) inner_pasch by presburger 
  thus ?thesis
    by (meson assms(3) bet_col col_permutation_1 col_permutation_4 par_not_col) 
qed

lemma impossible_case_2:
  assumes "A  D" and
    "B  D" and
    (*  "C ≠ D" and  
  "D ≠ T" and  *)
    "¬ Col A B C" and
    "Col A B x" and
    "Bet A D T" and
    (*  "¬ Col B C T" and *)
    "Bet B D C" and
    "Bet y A C" and
    "Bet x T y"
  shows "False" 
proof -
  {
    assume "A = y" 
    hence "Col A B C" 
      by (metis NCol_perm assms(2) assms(4) assms(5) assms(6) 
          assms(8) bet_col between_identity col_trivial_2 colx)
    hence False 
      using assms(3) by auto
  }
  hence "A  y" 
    by blast
  have "A B TS y T"
  proof -
    have "A B TS C y"
      by (simp add: A  y assms(7) assms(3) bet__ts between_symmetry) 
    moreover
    have "A B OS C T"
      using bet_out calculation invert_one_side l9_8_1 
        one_side_not_col124 one_side_symmetry out_one_side 
        out_out_one_side by (metis assms(1) assms(2) assms(5) assms(6)) 
    ultimately
    show ?thesis
      using l9_2 l9_8_2 by blast 
  qed
  hence "A B OS T x"
    using Bet_cases assms(8) bet_ts__os by blast 
  thus ?thesis
    using assms(4) col124__nos by auto 
qed

lemma impossible_case_3:
  assumes (* "A ≠ D" and
  "B ≠ D" and
  "C ≠ D" and
  "D ≠ T" and
"¬ Col A B C" and*)
    "Bet A D T" and
    "¬ Col B C T" and
    "Bet B D C" and
    "Bet B x A" and
    "Bet x T y" and
    "B C ParStrict x y"
  shows "False"
proof -
  have "B C OS x y"
    using assms(6) l12_6 by blast
  hence "B C TS x T"
    by (metis (full_types) Col_cases B C OS x y 
        assms(1) assms(2) assms(3) assms(4) bet_col bet_out 
        between_trivial l9_18 l9_8_2 one_side_not_col124 
        one_side_symmetry out_out_one_side) 
  hence "B C TS x y"
    by (meson assms(5) bet_ts__ts) 
  thus ?thesis
    using B C OS x y l9_9 by blast 
qed

lemma impossible_case_4_1:
  assumes "A  D" and
    "C  D" and
    "¬ Col A B C" and
    "Col A C y" and
    "Bet A D T" and
    (*  "¬ Col B C T" and*)
    "Bet B D C" and
    "A Out B x" and
    "Bet T y x"
  shows "False" 
proof -
  have "A C OS B D"
    by (metis assms(2) assms(3) assms(6) bet_col 
        between_equality_2 col_permutation_4 col_trivial_2 
        cop_nos__ts l6_21 l9_18 ncop__ncols not_col_permutation_5) 
  hence "A C OS T x "
    by (metis assms(1) assms(5) assms(7) bet_out 
        col_trivial_3 one_side_symmetry os_out_os)
  hence "A C OS T y"
    using assms(8) l9_17 by blast 
  thus ?thesis
    using assms(4) one_side_not_col124 by auto 
qed

lemma impossible_case_4_2:
  assumes "¬ Col A B C" and
    "Col A C y" and
    "Bet A D T" and
    "¬ Col B C T" and
    "Bet B D C" and
    "Bet B A x" and
    "Bet T y x" and
    "B C ParStrict x y"
  shows "False"
proof -
  have "B C TS A T"
    by (metis Col_cases TS_def assms(1) assms(3) assms(4) 
        assms(5) bet_out_1 not_col_distincts out_col) 
  have "B C OS A x"
    by (metis assms(1) assms(6) bet_out not_col_distincts 
        one_side_reflexivity out_out_one_side) 
  hence "B C TS x T"
    using B C TS A T l9_8_2 by blast 
  hence "T  x"
    using ts_distincts by blast 
  have "B C ParStrict x T"
    by (metis B C TS x T assms(7) assms(8) bet_col 
        between_symmetry par_strict_col_par_strict ts_distincts)
  thus ?thesis
    by (meson B C TS x T l12_6 l9_9) 
qed

lemma impossible_case_4:
  assumes "A  D" and
    (* "B ≠ D" and*)
    "C  D" and
    "D  T" and
    "¬ Col A B C" and
    "Col A C y" and
    "Bet A D T" and
    "¬ Col B C T" and
    "Bet B D C" and
    "Col A B x" and
    "Bet T y x" and
    "B C ParStrict x y"
  shows "False" 
proof -
  have "Bet A B x  A Out B x  B Out x A"
    using assms(9) l6_6 or_bet_out by blast
  moreover
  have "¬ Bet A B x"
    by (metis assms(1) assms(10) assms(2) assms(4) assms(5) 
        assms(6) assms(8) bet_out impossible_case_4_1 not_col_distincts) 
  moreover
  have "¬ A Out B x "
    using assms(1) assms(10) assms(2) assms(4) assms(5) 
      assms(6) assms(8) impossible_case_4_1 by blast
  moreover
  have "¬ B Out x A" 
    using calculation(3) impossible_case_4_2 
    by (meson assms(9) assms(10) assms(11) assms(4) 
        assms(5) assms(6) assms(7) assms(8) 
        col_permutation_4 or_bet_out)  
  ultimately
  show ?thesis by blast
qed

lemma impossible_two_sides_not_col:
  assumes "A  D" and
    (* "B ≠ D" and*)
    "C  D" and
    (* "D ≠ T" and*)
    "¬ Col A B C" and
    "Bet A D T" and
    (*"¬ Col B C T" and*)
    "Bet B D C" and
    "Bet B Y T" 
  shows "¬ Col A C Y" 
proof -
  have "A C OS B D"
    by (metis Col_perm assms(2) assms(3) assms(5) 
        bet_col between_equality_2 invert_one_side l6_4_1 
        out_one_side out_to_bet)
  have "A C OS D T"
    by (metis A C OS B D assms(1) assms(4) bet_out 
        col124__nos out_one_side) 
  hence "A C OS B T"
    using A C OS B D one_side_transitivity by blast 
  hence "A C OS B Y"
    using assms(6) l9_17 by blast 
  thus ?thesis
    using one_side_not_col124 by auto 
qed

(** Non degenerated triangles can be circumscribed. *)
lemma triangle_circumscription_implies_tarski_s_euclid_aux1:
  assumes "triangle_circumscription_principle" and
    "B  D" and
    "C  D" and
    "D  T" and
    "T  X" and 
    "¬ Col A B C" and
    "Col A B M1" and
    "Bet A D T" and
    "¬ Col B C T" and
    "Bet B D C" and
    "Col T Y Z" and
    "Bet Y T X" and
    "Bet Y M1 Z1" and
    "Cong Y T T X" and
    "Cong Y M1 M1 Z1" and
    "B C Perp T Z" and
    "A B Perp Y Z1"
  shows "x. Col A B x  B C ParStrict x T  Cong X x Y x" 
proof -
  have "A  D"
    using Bet_cases Col_def assms(10) assms(6) by blast
  have "B  C"
    using assms(6) col_trivial_2 by blast 
  have "A  B"
    using assms(6) col_trivial_1 by auto 
  have "A  C"
    using assms(6) col_trivial_3 by blast 
  have "X  Y"
    using assms(12) assms(5) between_identity by blast 
  have "Y  T"
    using assms(14) assms(5) cong_reverse_identity by blast 
  have "Y  Z1"
    using assms(17) perp_not_eq_2 by auto 
  have "T  Z"
    using assms(16) perp_not_eq_2 by blast
  have "Coplanar B C T A"
    by (metis assms(10) assms(8) bet__coplanar bet_cop__tsp 
        coplanar_perm_1 coplanar_perm_5 tsp_distincts)
  have "Coplanar B C T B"
    using ncop_distincts by blast 
  have "Coplanar B C T C"
    using ncop_distincts by blast 
  have "Coplanar B C T T"
    using ncop_distincts by auto 
  have "Coplanar B C T Z"
    by (simp add: assms(16) perp__coplanar)
  have "Coplanar B C T Y"
    by (meson Coplanar B C T Z T  Z assms(11) 
        col_cop__cop not_col_permutation_5) 
  have "Coplanar B C T X"
    using Coplanar B C T T Coplanar B C T Y Y  T 
      assms(12) bet_col col_cop2__cop by blast
  {
    assume "Col X Y Z1"
    hence "Col T Z Z1" 
      by (metis Col_perm Y  T assms(11) assms(12) bet_col 
          between_identity col_transitivity_1)
    have "Coplanar B C Y Z1"
      by (metis Col_cases Col T Z Z1 Coplanar B C T Y 
          T  Z Y  T assms(11) col_cop__cop col_trivial_3 
          colx coplanar_perm_1)
    have "B A Par B C" 
    proof -
      have "Coplanar Y Z1 A C"
      proof -
        have "Coplanar B C T Z1" 
          using Col T Z Z1 Coplanar B C T Z T  Z col_cop__cop by blast
        moreover have "Coplanar B C T C" 
          using Coplanar B C T C by auto
        ultimately show ?thesis 
          using assms(9) Coplanar B C T A 
            Coplanar B C T Y coplanar_pseudo_trans by presburger
      qed
      moreover
      have "B C Perp Y Z1" 
      proof -
        have "T Z Perp B C"
          using Perp_perm assms(16) by blast 
        moreover
        have "Col T Z Y"
          using Col_cases assms(11) by blast 
        ultimately
        show ?thesis
          using Y  Z1 Col T Z Z1 perp_col0 by blast 
      qed
      ultimately
      show ?thesis
        by (metis A  B B  C assms(17) cop_perp2__col 
            not_par_not_col perp_comm perp_right_comm) 
    qed
    hence "False"
      using assms(6) par_id_1 by auto 
  }
  hence "¬ Col X Y Z1"
    by blast 
  obtain x where "Cong X x Y x  Cong X x Z1 x  Coplanar X Y Z1 x" 
    using triangle_circumscription_principle_def 
      ¬ Col X Y Z1 assms(1) by blast 
  have "Cong X x Y x"
    by (simp add: Cong X x Y x  Cong X x Z1 x  Coplanar X Y Z1 x) 
  have "Cong X x Z1 x"
    by (simp add: Cong X x Y x  Cong X x Z1 x  Coplanar X Y Z1 x)
  have "Coplanar X Y Z1 x"
    by (simp add: Cong X x Y x  Cong X x Z1 x  Coplanar X Y Z1 x)
  have "Y  M1"
    using Y  Z1 assms(15) cong_reverse_identity by blast
  have "Coplanar B C T Z1"
    by (meson A  B Coplanar B C T A Coplanar B C T B 
        Coplanar B C T Y Y  M1 assms(13) assms(7) 
        bet_col col_cop2__cop)
  have "Coplanar B C T x"
    by (meson Coplanar B C T X Coplanar B C T Y 
        Coplanar B C T Z1 Coplanar X Y Z1 x ¬ Col X Y Z1 
        l9_30 ncop_distincts)
  have "Col A B x"
  proof -
    have "Coplanar A x Y Z1"
      using assms(9) Coplanar B C T A Coplanar B C T Y 
        Coplanar B C T Z1 Coplanar B C T x 
        coplanar_pseudo_trans by blast 
    moreover
    have "Coplanar B x Y Z1" 
      using assms(9) 
      by (meson Coplanar B C T B Coplanar B C T Y 
          Coplanar B C T Z1 Coplanar B C T x coplanar_pseudo_trans) 
    moreover
    have "Cong x Y x Z1" 
    proof -
      have "Cong x Y X x"
        using Cong X x Y x not_cong_3421 by blast 
      moreover
      have "Cong X x x Z1"
        using Cong X x Z1 x not_cong_1243 by blast 
      ultimately
      show ?thesis
        by (meson cong_transitivity) 
    qed
    moreover
    have "A B PerpBisect Y Z1"
    proof -
      have "M1 Midpoint Y Z1" 
        by (simp add: Midpoint_def assms(13) assms(15))
      hence "( X. X Midpoint Y Z1  Col A B X)  (A B Perp Y Z1  Y = Z1)" 
        using assms(7) assms(17) by blast
      hence "Y Z1 ReflectL A B" 
        using ReflectL_def l10_4_spec by presburger 
      thus ?thesis  
        using Y  Z1 Perp_bisect_def by auto
    qed
    ultimately
    show ?thesis
      using cong_cop2_perp_bisect_col by blast 
  qed
  have "B C ParStrict x T" 
  proof -
    have "B C Par x T" 
    proof -
      have "Coplanar X Y B x"
        by (meson Coplanar B C T B Coplanar B C T X 
            Coplanar B C T Y Coplanar B C T x assms(9) 
            coplanar_pseudo_trans) 
      moreover
      have "Coplanar X Y B T"
        by (meson Coplanar B C T B Coplanar B C T T 
            Coplanar B C T X Coplanar B C T Y assms(9) 
            coplanar_pseudo_trans) 
      moreover
      have "Coplanar X Y C x"
        by (meson Coplanar B C T C Coplanar B C T X 
            Coplanar B C T Y Coplanar B C T x assms(9) 
            coplanar_pseudo_trans) 
      moreover
      have "Coplanar X Y C T"
        by (meson Coplanar B C T C Coplanar B C T T 
            Coplanar B C T X Coplanar B C T Y assms(9) 
            coplanar_pseudo_trans) 
      moreover
      have "B C Perp X Y" 
      proof -
        have "T Z Perp B C"
          using Perp_cases assms(16) by blast 
        moreover
        have "Col T Z X"
          by (meson Y  T assms(11) assms(12) bet_col 
              bet_col1 col3 not_col_permutation_4) 
        moreover
        have "Col T Z Y"
          by (simp add: assms(11) col_permutation_5) 
        ultimately
        show ?thesis
          using X  Y perp_col0 by blast 
      qed
      moreover
      have "x T PerpBisect X Y" 
      proof -
        have "x  T"
          using A  D Col A B x assms(10) assms(2) 
            assms(6) assms(8) between_trivial2 
            impossible_case_2 by blast 
        moreover
        have "Coplanar x T X Y"
          by (meson assms(12) bet_col ncop__ncol ncoplanar_perm_21) 
        moreover
        have "Cong X T Y T"
          by (meson assms(14) not_cong_3421) 
        ultimately
        show ?thesis
          using Cong X x Y x X  Y cong_cop_perp_bisect by presburger 
      qed
      hence "x T Perp X Y"
        by (simp add: perp_bisect_perp) 
      ultimately
      show ?thesis
        using l12_9 by blast
    qed
    moreover
    have "Col x T T"
      by (simp add: col_trivial_2) 
    moreover
    have "¬ Col B C T"
      by (simp add: assms(9)) 
    ultimately
    show ?thesis
      using par_not_col_strict by blast 
  qed
  thus ?thesis
    using Col A B x Cong X x Y x by blast 
qed

lemma triangle_circumscription_implies_tarski_s_euclid_aux:
  assumes "triangle_circumscription_principle" and
    "B  D" and
    "C  D" and
    "D  T" and
    "T  X" and
    "¬ Col A B C" and
    "Col A B M1" and
    "Col A C M2" and
    "Bet A D T" and
    "¬ Col B C T" and
    "Bet B D C" and
    "Col T Y Z" and
    "Bet Y T X" and
    "Bet Y M1 Z1" and
    "Bet Y M2 Z2" and
    "Cong Y T T X" and
    "Cong Y M1 M1 Z1" and
    "Cong Y M2 M2 Z2" and
    "B C Perp T Z" and
    "A B Perp Y Z1" and
    "A C Perp Y Z2"
  shows " x y. Bet A B x  Bet A C y  Bet x T y" 
proof -
  have "x. Col A B x  B C ParStrict x T  Cong X x Y x" 
    using triangle_circumscription_implies_tarski_s_euclid_aux1 
      assms(1) assms(2) assms(3) assms(4) assms(5) 
      assms(6) assms(7) assms(9) assms(10)  
      assms(11) assms(12) assms(13) assms(14)   
      assms(16) assms(17) assms(19) assms(20)  
    by blast  
  then obtain x where "Col A B x  B C ParStrict x T  Cong X x Y x" 
    by auto
  hence "Col A B x" 
    by auto
  have "B C ParStrict x T"
    by (simp add: Col A B x  B C ParStrict x T  Cong X x Y x) 
  have "Cong X x Y x" 
    by (simp add: Col A B x  B C ParStrict x T  Cong X x Y x) 
  have " y. Col A C y  C B ParStrict y T  Cong X y Y y" 
  proof -
    have "¬ Col A C B"
      using assms(6) col_permutation_5 by blast 
    moreover
    have "Col A C M2"
      by (simp add: assms(8)) 
    moreover
    have "Bet A D T"
      by (simp add: assms(9)) 
    moreover
    have "¬ Col C B T"
      using NCol_cases assms(10) by blast 
    moreover
    have "Bet C D B"
      using Bet_cases assms(11) by blast 
    moreover
    have "C B Perp T Z"
      by (simp add: assms(19) perp_left_comm) 
    ultimately
    show ?thesis 
      using triangle_circumscription_implies_tarski_s_euclid_aux1 
        assms(1) assms(2) assms(3) assms(4) assms(5) 
        assms(8) assms(9) assms(12) assms(13)  assms(15)  
        assms(16)  assms(18) assms(21) by blast
  qed
  then obtain y where "Col A C y  C B ParStrict y T  Cong X y Y y" 
    by auto
  hence "Col A C y" 
    by auto
  have "C B ParStrict y T" 
    by (simp add: Col A C y  C B ParStrict y T  Cong X y Y y) 
  have "Cong X y Y y"
    by (simp add: Col A C y  C B ParStrict y T  Cong X y Y y) 
  have "Col x T y" 
  proof (cases "x = T")
    case True
    thus ?thesis
      by (simp add: col_trivial_1) 
  next
    case False
    thus ?thesis 
    proof (cases "y = T")
      case True
      thus ?thesis
        using col_trivial_2 by auto 
    next
      case False
      thus ?thesis
      proof -
        have "X  Y"
          using assms(13) assms(5) between_identity by blast 
        have "Y  T"
          using assms(16) assms(5) cong_reverse_identity by blast 
        have "T  Z"
          using assms(19) perp_not_eq_2 by auto 
        have "Coplanar X Y x y"
        proof -
          have "Coplanar B C T Y" 
          proof -
            have "Coplanar B C T Z"
              using assms(19) perp__coplanar by auto 
            moreover
            have "Col T Z Y"
              by (simp add: assms(12) col_permutation_5)
            ultimately
            show ?thesis
              using T  Z col_cop__cop by blast 
          qed
          moreover
          have "Coplanar B C T X"
            by (meson Coplanar B C T Y Y  T assms(13) 
                bet_col bet_col1 col2_cop__cop ncoplanar_perm_7) 
          moreover 
          have "Coplanar B C T x"
            by (meson B C ParStrict x T par_strict_right_comm 
                pars__coplanar) 
          moreover
          have "Coplanar B C T y"
            by (simp add: C B ParStrict y T par_strict_comm 
                pars__coplanar) 
          ultimately
          show ?thesis
            by (meson assms(10) coplanar_pseudo_trans) 
        qed
        moreover
        have "T x PerpBisect X Y" 
        proof -
          have "T  x"
            using B C ParStrict x T par_strict_distinct by blast 
          moreover
          have "Coplanar T x X Y"
            by (meson assms(13) assms(16) midpoint__coplanar 
                midpoint_def ncoplanar_perm_5) 
          moreover
          have "Cong X T Y T"
            using Cong_perm assms(16) by blast 
          ultimately
          show ?thesis
            using X  Y Cong X x Y x cong_cop_perp_bisect by auto
        qed
        hence "T x Perp X Y" 
          using perp_bisect_perp by auto
        moreover
        have "T y PerpBisect X Y" 
        proof -
          have "T  y"
            using False by auto 
          moreover
          have "Coplanar T y X Y"
            by (meson assms(13) bet__coplanar between_symmetry 
                ncoplanar_perm_13) 
          moreover
          have "Cong X T Y T"
            using assms(16) cong_4312 by blast
          ultimately
          show ?thesis
            by (simp add: Cong X y Y y X  Y cong_cop_perp_bisect) 
        qed
        hence "T y Perp X Y"
          by (simp add: perp_bisect_perp) 
        ultimately
        show ?thesis
          using col_permutation_4 cop_perp2__col by blast 
      qed
    qed
  qed
  have "B C ParStrict x y" 
  proof -
    {
      assume "x = y"
      hence "A  C" 
        using assms(6) col_trivial_3 by force
      hence "A = x" 
        using NCol_perm Col A B x Col A C y x = y assms(6) 
          col_trivial_3 colx by blast
      hence " X0. Col X0 B C  Col X0 x T" 
        using Bet_cases Col_def assms(11) assms(9) by blast
      hence False 
        using B C ParStrict x T par_not_col by blast
    }
    moreover have "B C ParStrict x T" 
      using B C ParStrict x T by blast
    moreover have "Col x T y" 
      by (simp add: Col x T y)
    ultimately show ?thesis 
      using par_strict_col_par_strict by blast
  qed
  have "A  D"
    using Col_cases assms(11) assms(6) bet_col by blast 
  {
    assume "Bet x T y"
    {
      assume "Bet A B x"
      hence " x y. Bet A B x  Bet A C y  Bet x T y"
        using Col_def A  D B C ParStrict x y Bet x T y 
          Col A B x Col A C y assms(11) assms(2) assms(6) assms(9) 
          impossible_case_1 impossible_case_2 by blast 
    }
    moreover
    {
      assume "Bet B x A"
      hence " x y. Bet A B x  Bet A C y  Bet x T y"
        using B C ParStrict x y Bet x T y assms(10) 
          assms(11) assms(9) impossible_case_3 by blast 
    }
    moreover
    {
      assume "Bet x A B"
      hence " x y. Bet A B x  Bet A C y  Bet x T y"
        by (meson A  D Bet x T y Col A C y assms(11) 
            assms(3) assms(6) assms(9) between_symmetry 
            col_permutation_5 impossible_case_2) 
    }
    ultimately
    have " x y. Bet A B x  Bet A C y  Bet x T y"
      using Col_def Col A B x by blast 
  }
  moreover
  {
    assume "Bet T y x"
    {
      assume "Bet A B x"
      hence " x y. Bet A B x  Bet A C y  Bet x T y"
        using A  D B C ParStrict x y Bet T y x 
          Col A B x Col A C y assms(10) assms(11) assms(3) 
          assms(4) assms(6) assms(9) impossible_case_4 by blast 
    }
    moreover
    {
      assume "Bet B x A"
      hence " x y. Bet A B x  Bet A C y  Bet x T y"
        using A  D B C ParStrict x y Bet T y x Col A B x 
          Col A C y assms(10) assms(11) assms(3) assms(4) assms(6) 
          assms(9) impossible_case_4 by blast 
    }
    moreover
    {
      assume "Bet x A B"
      hence " x y. Bet A B x  Bet A C y  Bet x T y"
        using A  D B C ParStrict x y Bet T y x 
          Col A B x Col A C y assms(10) assms(11) assms(3) assms(4) 
          assms(6) assms(9) impossible_case_4 by blast 
    }
    ultimately
    have " x y. Bet A B x  Bet A C y  Bet x T y"
      using Col_def Col A B x by blast 
  }
  moreover
  {
    assume "Bet y x T"
    {
      assume "Bet A B x"
      hence " x y. Bet A B x  Bet A C y  Bet x T y"
        by (meson A  D B C ParStrict x y Bet y x T 
            Col A B x Col A C y assms(10) assms(11) assms(2) 
            assms(4) assms(6) assms(9) between_symmetry 
            col_permutation_5 impossible_case_4 
            not_col_permutation_3 par_strict_comm) 
    }
    moreover
    {
      assume "Bet B x A"
      hence " x y. Bet A B x  Bet A C y  Bet x T y"
        using B C ParStrict x T assms(10) assms(11) 
          assms(9) between_trivial impossible_case_3 by blast 
    }
    moreover
    {
      assume "Bet x A B"
      hence " x y. Bet A B x  Bet A C y  Bet x T y"
        by (meson Par_strict_cases A  D B C ParStrict x y 
            Bet y x T Col A B x Col A C y assms(10) assms(11) 
            assms(2) assms(4) assms(6) assms(9) between_symmetry 
            col_permutation_5 impossible_case_4 not_col_permutation_2) 
    }
    ultimately
    have " x y. Bet A B x  Bet A C y  Bet x T y"
      using Col_def Col A B x by blast 
  }
  ultimately
  show ?thesis
    using Col_def Col x T y by blast 
qed

(*NOTE ROLAND: REVOIR LA STRUCTURE DE CETTTE DEMO ⋀ B B' B'' B''' *)
lemma triangle_circumscription_implies_tarski_s_euclid:
  assumes "triangle_circumscription_principle"
  shows "tarski_s_parallel_postulate"
proof -
  {
    fix A B C D T
    assume "Bet A D T  Bet B D C  A  D"
    have " X Y. Bet A B X  Bet A C Y  Bet X T Y"
    proof -
      {
        fix A' B' C' D' T'
        assume H1: "A'  B'  A'  C'  A'  D'  A'  T'  
                    B'  C'  B'  D'  B'  T'  C'  D'  
                    C'  T'  D'  T'  ¬ Col A' B' C'  
                    Bet A' D' T'  Bet B' D' C'  ¬ Col B' C' T'"
        have "A'  B'"
          using H1 by blast
        have "A'  C'"
          using H1 by blast
        have "A'  D'"
          using H1 by blast
        have "B'  C'"
          using H1 by blast
        have "B'  D'"
          using H1 by blast
        have "C'  D'"
          using H1 by blast
        have "D'  T'"
          using H1 by blast
        have "¬ Col A' B' C'"
          using H1 by blast
        have "Bet A' D' T'"
          using H1 by blast
        have "Bet B' D' C'"
          using H1 by blast
        have "¬ Col B' C' T'"
          using H1 by blast
        obtain Y' where "Col B' C' Y'  B' C' Perp T' Y'"
          using ¬ Col B' C' T' l8_18_existence by presburger
        {
          fix B'' C''
          assume H2: "A'  B''  A'  C''  B''  C''  
                      B''  D'  C''  D'  ¬ Col A' B'' C''  
                      Bet B'' D' C''  ¬ Col B'' C'' T'  
                      Col B'' C'' Y'  B'' C'' Perp T' Y'"
          {
            fix B''' C'''
            assume A1: "A'  C'''  B'''  C'''  B'''  D'  
                        C'''  D'  ¬ Col A' B''' C'''  
                        Bet B''' D' C'''  ¬ Col B''' C''' T'  
                        Col B''' C''' Y'  B''' C''' Perp T' Y'  
                        B'''  Y'"
            have " x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y)" 
            proof - 
              {
                assume "C''' = Y'"
                have "C'''  T'"
                  using A1 col_trivial_2 by blast 
                obtain Y1 where "Y1 Midpoint C''' T'"
                  using midpoint_existence by fastforce
                have "¬ Col A' B''' C'''" 
                  using A1 by blast
                {
                  have "A'  C'''  B'''  C'''  B'''  D'  
                        C'''  D'  ¬ Col A' B''' C'''  
                        Bet B''' D' C'''  ¬ Col B''' C''' T'  
                        Col B''' C''' Y'  B''' C''' Perp T' Y'  
                        B'''  Y'" using A1 by blast
                  {
                    assume "Y1 = A'"
                    have "C'''  D'" using A1 by blast
                    have "Bet B''' D' C'''" using A1 by blast
                    have "Col A' C''' T'" 
                      using A1 
                      using Y1 = A' Y1 Midpoint C''' T' midpoint_col by blast
                    hence "Col A' B''' C'''" 
                      using A'  D' Bet A' D' T' Bet B''' D' C''' 
                        C'''  D' between_trivial 
                        impossible_two_sides_not_col by blast                    
                    hence False 
                      using ¬ Col A' B''' C''' by blast
                  }
                  hence "Y1  A'" 
                    by blast
                  have "C'''  Y1" 
                    using C'''  T' Y1 Midpoint C''' T' 
                      midpoint_distinct_1 by blast 
                  have "B'''  Y1"
                    by (metis A1 midpoint_col Y1 Midpoint C''' T')
                  have "Bet C''' Y1 T'"
                    by (simp add: Y1 Midpoint C''' T' midpoint_bet)
                  have "Cong C''' Y1 Y1 T'"
                    by (simp add: Y1 Midpoint C''' T' midpoint_cong) 
                  have "¬ Col A' B''' Y1"
                    using impossible_two_sides_not_col A1 
                    by (meson A'  D' Bet A' D' T' 
                        Bet C''' Y1 T' between_symmetry 
                        not_col_permutation_5) 
                  obtain X where "T' Midpoint Y1 X"
                    using symmetric_point_construction by auto
                  hence "X  Y1"
                    by (metis C'''  Y1 Y1 Midpoint C''' T' l7_9_bis l8_20_2) 
                  hence "T'  X"
                    using T' Midpoint Y1 X is_midpoint_id_2 by blast
                  have "Bet Y1 T' X"
                    by (simp add: T' Midpoint Y1 X midpoint_bet)
                  have "Cong Y1 T' T' X"
                    by (simp add: T' Midpoint Y1 X midpoint_cong) 
                  obtain Z1 where "Z1 Y1 Reflect A' B'''"
                    using l10_2_existence by blast
                  hence "Z1 Y1 ReflectL A' B'''"
                    using ¬ Col A' B''' Y1 is_image_is_image_spec 
                      not_col_distincts by blast 
                  then obtain M1 where HH1: "Bet Y1 M1 Z1  Cong Y1 M1 M1 Z1  
                                      Col A' B''' M1  
                                      (A' B''' Perp Y1 Z1  Y1 = Z1)" 
                    using ReflectL_def midpoint_bet midpoint_cong by blast 
                  obtain Z2 where "Z2 Y1 Reflect A' C'''"
                    using l10_2_existence by blast
                  hence "Z2 Y1 ReflectL A' C'''"
                    using ¬ Col A' B''' C''' is_image_is_image_spec 
                      not_col_distincts by blast
                  then obtain M2 where HH2: "Bet Y1 M2 Z2  Cong Y1 M2 M2 Z2  
                                      Col A' C''' M2  
                                      (A' C''' Perp Y1 Z2  Y1 = Z2)" 
                    using ReflectL_def midpoint_bet midpoint_cong by blast 
                  have "Bet Y1 M2 Z2" 
                    using HH2 by blast
                  have "Cong Y1 M2 M2 Z2"
                    using HH2 by blast
                  have "Col A' C''' M2"
                    using HH2 by blast
                  have "A' C''' Perp Y1 Z2  Y1 = Z2"
                    using HH2 by blast

                  {
                    assume "Y1 = Z2"
                    hence "Y1 = M2"
                      using HH2 between_identity by blast 
                    hence "Col A' C''' Y1"
                      using HH2 by blast 
                    have "Col A' B''' C'''" 
                    proof -
                      have "Bet A' D' T'" 
                        using Bet A' D' T' by auto
                      moreover have "Bet C''' Y1 T'" 
                        using Bet C''' Y1 T' by blast
                      moreover have "C'''  Y1" 
                        using C'''  Y1 by auto
                      moreover have "Col A' C''' Y1" 
                        using Col A' C''' Y1 by blast
                      moreover 
                      {
                        assume "¬ Col B''' C''' Y1"
                        have "A'  C'''" 
                          using A1 by blast
                        have "B'''  C'''"
                          using A1 by blast
                        have "C'''  D'"                
                          using A1 by blast
                        have "Bet B''' D' C'''"        
                          using A1 by blast
                        have "¬ Col B''' C''' T'"       
                          using A1 by blast
                        have "B'''  Y'"        
                          using A1 by blast
                        hence "A' = D'" 
                          by (metis (no_types, lifting) NCol_perm 
                              calculation(3) col_transitivity_1
                              A'  C''' B'''  C''' C'''  D' 
                              Bet B''' D' C''' ¬ Col B''' C''' T' 
                              bet_col between_identity calculation(1) 
                              calculation(2) not_col_distincts                       
                              calculation(4))
                        hence False 
                          using A'  D' by blast
                      }
                      hence "Col B''' C''' Y1" 
                        by blast
                      ultimately show ?thesis using l6_16_1 
                        using col_permutation_2 by blast
                    qed
                    hence "False" 
                      using A1 by blast
                    hence " x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y)" 
                      by auto
                  }
                  moreover
                  {
                    assume "A' C''' Perp Y1 Z2"
                    hence " x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y)" 
                    proof -
                      have "B'''  D'"
                        using A1 by blast 
                      moreover
                      have "C'''  D'"
                        using A1 by blast 
                      moreover
                      have "D'  T'"
                        using D'  T' by auto
                      moreover
                      have "T'  X"
                        by (simp add: T'  X) 
                      moreover
                      have "¬ Col A' B''' C'''"  
                        using A1 by blast 
                      moreover
                      have "Col A' B''' M1" 
                        using HH1 by blast
                      moreover
                      have "Col A' C''' M2" 
                        using HH2 by blast
                      moreover
                      have "Bet A' D' T'"
                        by (simp add: Bet A' D' T') 
                      moreover
                      have "¬ Col B''' C''' T'"
                        using A1 by blast 
                      moreover
                      have "Bet B''' D' C'''" 
                        using A1 by blast 
                      moreover
                      have "Col T' Y1 C'''"
                        by (simp add: Bet C''' Y1 T' bet_col between_symmetry) 
                      moreover
                      have "Bet Y1 T' X"
                        by (simp add: Bet Y1 T' X) 
                      moreover
                      have "Bet Y1 M1 Z1" 
                        using HH1 by blast
                      moreover
                      have "Bet Y1 M2 Z2" 
                        using HH2 by blast
                      moreover
                      have "Cong Y1 T' T' X"
                        by (simp add: Cong Y1 T' T' X) 
                      moreover
                      have "Cong Y1 M1 M1 Z1" 
                        using HH1 by blast
                      moreover
                      have "Cong Y1 M2 M2 Z2"
                        using HH2 by blast
                      moreover
                      have "B''' C''' Perp T' C'''" 
                        using A1 C''' = Y' by blast 
                      moreover
                      have "A' B''' Perp Y1 Z1"
                        using HH1 ¬ Col A' B''' Y1 bet_neq12__neq by blast
                      moreover
                      have "A' C''' Perp Y1 Z2"
                        by (simp add: A' C''' Perp Y1 Z2) 
                      ultimately
                      show ?thesis 
                        using assms(1) 
                          triangle_circumscription_implies_tarski_s_euclid_aux 
                        by blast
                    qed
                  }
                  ultimately
                  have " x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y)"
                    using HH2 by blast
                }
              }
              moreover
              {
                assume "C'''  Y'"
                obtain X where "T' Midpoint Y' X"
                  using symmetric_point_construction by blast
                have "T'  Y'"
                  using A1 by blast
                hence "X  Y'"
                  using T' Midpoint Y' X l7_3 by blast
                have "T'  X"
                  using T' Midpoint Y' X T'  Y' is_midpoint_id_2 by blast
                have "Bet Y' T' X"
                  by (simp add: T' Midpoint Y' X midpoint_bet)
                have "Cong Y' T' T' X"
                  by (simp add: T' Midpoint Y' X midpoint_cong)
                obtain Z1 where "Z1 Y' Reflect A' B'''"
                  using l10_2_existence by blast 
                have "¬ (A' = B'''  A' Midpoint Y' Z1)"  
                  using A1 not_col_distincts by blast 
                hence "Z1 Y' ReflectL A' B'''"
                  using Reflect_def Z1 Y' Reflect A' B''' by force 
                then obtain M1 where HH3: "Bet Y' M1 Z1  Cong Y' M1 M1 Z1  
                                             Col A' B''' M1  
                                             (A' B''' Perp Y' Z1  Y' = Z1)" 
                  using ReflectL_def midpoint_bet midpoint_cong by blast 
                obtain Z2 where "Z2 Y' Reflect A' C'''"
                  using l10_2_existence by blast 
                have "¬ (A' = C'''  A' Midpoint Y' Z2)"  
                  using A1 not_col_distincts by blast 
                hence "Z2 Y' ReflectL A' C'''"
                  using Reflect_def Z2 Y' Reflect A' C''' by force 
                then obtain M2 where HH4: "Bet Y' M2 Z2  Cong Y' M2 M2 Z2  
                                             Col A' C''' M2  
                                             (A' C''' Perp Y' Z2  Y' = Z2)" 
                  using ReflectL_def midpoint_bet midpoint_cong by blast 
                have "¬ Col A' B''' Y'" 
                proof -
                  {
                    assume "Col A' B''' Y'"
                    have "False"
                    proof -
                      have "¬ Col A' B''' C'''" 
                        using A1 by blast
                      moreover
                      have "C'''  B'''" 
                        using A1 by blast
                      moreover
                      have "Col A' B''' B'''"
                        by (simp add: col_trivial_2) 
                      moreover
                      have "Col A' B''' Y'"
                        using Col A' B''' Y' by blast 
                      moreover
                      have "Col C''' B''' B'''"
                        by (simp add: col_trivial_2) 
                      moreover
                      have "Col C''' B''' Y'" 
                        using A1 Col_cases by blast 
                      ultimately
                      show ?thesis 
                        using A1 l6_21 by blast
                    qed
                  }
                  thus ?thesis 
                    by blast qed
                have "¬ Col A' C''' Y'" 
                proof -
                  {
                    assume "Col A' C''' Y'"
                    have "False"
                    proof -
                      have "¬ Col A' C''' B'''" 
                        using A1 Col_cases by blast 
                      moreover
                      have "B'''  C'''" 
                        using A1 by blast
                      moreover
                      have "Col A' C''' C'''"
                        by (simp add: col_trivial_2) 
                      moreover
                      have "Col A' C''' Y'"
                        using Col A' C''' Y' by blast 
                      moreover
                      have "Col B''' C''' C'''"
                        by (simp add: col_trivial_2) 
                      moreover
                      have "Col B''' C''' Y'" 
                        using A1 by blast 
                      ultimately
                      show ?thesis 
                        using A1 l6_21 by (meson C'''  Y') 
                    qed
                  }
                  thus ?thesis 
                    by blast 
                qed
                have " x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y)" 
                proof-
                  {
                    assume "A' B''' Perp Y' Z1  A' C''' Perp Y' Z2"
                    have " x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y)" 
                    proof -
                      have "B'''  D'" 
                        using A1 by blast
                      moreover
                      have "C'''  D'" 
                        using A1 by blast
                      moreover
                      have "D'  T'"
                        by (simp add: D'  T') 
                      moreover
                      have "T'  X"
                        by (simp add: T'  X)
                      moreover
                      have "¬ Col A' B''' C'''" 
                        using A1 by blast
                      moreover
                      have "Col A' B''' M1"
                        using HH3 by blast
                      moreover
                      have "Col A' C''' M2"
                        using HH4 by blast
                      moreover
                      have "Bet A' D' T'" 
                        using Bet A' D' T' by blast 
                      moreover
                      have "¬ Col B''' C''' T'" 
                        using A1 by blast
                      moreover
                      have "Bet B''' D' C'''"
                        using A1 by blast
                      moreover
                      have "Col T' Y' Y'" 
                        using col_trivial_2 by presburger 
                      moreover
                      have "Bet Y' T' X" 
                        using Bet Y' T' X by blast 
                      moreover
                      have "Bet Y' M1 Z1" 
                        using HH3 by blast
                      moreover
                      have "Bet Y' M2 Z2" 
                        using HH4 by blast
                      moreover
                      have "Cong Y' T' T' X" 
                        using Cong Y' T' T' X by blast 
                      moreover
                      have "Cong Y' M1 M1 Z1" 
                        using HH3 by blast
                      moreover
                      have "Cong Y' M2 M2 Z2" 
                        using HH4 by blast
                      moreover
                      have "B''' C''' Perp T' Y'"
                        using A1 by blast
                      moreover
                      have "A' B''' Perp Y' Z1" 
                        using A' B''' Perp Y' Z1  A' C''' Perp Y' Z2 by blast
                      moreover
                      have "A' C''' Perp Y' Z2" 
                        using A' B''' Perp Y' Z1  A' C''' Perp Y' Z2 by blast
                      ultimately
                      show ?thesis
                        using assms(1) 
                          triangle_circumscription_implies_tarski_s_euclid_aux 
                        by blast
                    qed
                  }
                  moreover
                  {
                    assume "Y' = Z1"
                    hence " x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y)"
                      using HH3 ¬ Col A' B''' Y' bet_neq12__neq by blast 
                  }
                  moreover
                  {
                    assume "Y' = Z2"
                    hence " x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y)"
                      using Z2 Y' Reflect A' C''' ¬ Col A' C''' Y' 
                        col_permutation_1 l10_8 by blast
                  }
                  ultimately
                  show ?thesis
                    using HH3 HH4 by blast
                qed
              }
              ultimately
              show ?thesis 
                by blast
            qed
          }
          hence Haux: "  B''' C'''. (A'  C'''  B'''  C'''  
                                        B'''  D'  C'''  D'  
                                        ¬ Col A' B''' C'''  
                                        Bet B''' D' C'''  
                                        ¬ Col B''' C''' T'  
                                        Col B''' C''' Y'  
                                        B''' C''' Perp T' Y'  B'''  Y') 
                               
                           ( x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y))" 
            by auto
          moreover
          {
            fix B''' C'''
            assume A2: "A'  C'''  B'''  C'''  B'''  D'  
                        C'''  D'  ¬ Col A' B''' C'''  
                        Bet B''' D' C'''  ¬ Col B''' C''' T'  
                        Col B''' C''' Y'  B''' C''' Perp T' Y'  
                        B''' = Y'"
            have " x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y)" 
            proof -
              {
                assume "C''' = Y'"
                hence " x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y)"
                  using A2 by fastforce 
              }
              moreover
              {
                assume "C'''  Y'"
                have " x y. (Bet A' B''' x  Bet A' C''' y  Bet x T' y)" 
                proof -
                  have "A'  C'''"
                    using A2 by blast 
                  moreover
                  have "A'  B'''" 
                    using A2 not_col_distincts by blast 
                  moreover
                  have "C'''  B'''" 
                    using A2 by blast 
                  moreover
                  have "C'''  D'"
                    using A2 by blast 
                  moreover
                  have "B'''  D'" 
                    using A2 by blast 
                  moreover
                  have "¬ Col A' C''' B'''" 
                    using A2 Col_cases by blast 
                  moreover
                  have "Bet C''' D' B'''" 
                    using A2 between_symmetry by blast 
                  moreover
                  have "¬ Col C''' B''' T'" 
                    using A2 Col_cases by blast 
                  moreover
                  have "Col C''' B''' Y'" 
                    using A2 Col_cases by blast 
                  moreover
                  have "C''' B''' Perp T' Y'" 
                    using A2 by (metis col_trivial_2 perp_col2) 
                  moreover
                  have "C'''  Y'" 
                    using A2 by blast 
                  ultimately
                  have "( x y. (Bet A' C''' x  Bet A' B''' y  Bet x T' y))"
                    using Haux by blast
                  thus ?thesis
                    using Bet_cases by blast 
                qed
              }
              ultimately
              show ?thesis 
                by auto
            qed
          }
          ultimately
          have " x y. (Bet A' B'' x  Bet A' C'' y  Bet x T' y)" 
            using H2 by blast         
        }
        hence " x y. (Bet A' B' x  Bet A' C' y  Bet x T' y)"
          using H1 Col B' C' Y'  B' C' Perp T' Y' by presburger 
      }
      hence " A B C D T. Bet A D T  Bet B D C  A  D  
                          ( x y. (Bet A B x  Bet A C y  Bet x T y))" 
        using tarski_s_euclid_remove_degenerated_cases by blast
      thus ?thesis
        using Bet A D T  Bet B D C  A  D by blast 
    qed
  }
  thus ?thesis 
    using tarski_s_parallel_postulate_def by blast
qed

(** The circumcenter of a right triangle is the midpoint of the hypotenuse. *)


(** There exists a right triangle whose circumcenter is the midpoint of the hypotenuse. *)

lemma thales_converse_postulate__thales_existence: 
  assumes "thales_converse_postulate"
  shows "existential_thales_postulate"
proof -
  obtain A B C where "¬ (Bet A B C  Bet B C A  Bet C A B)"
    using lower_dim by blast
  hence "¬ Col C A B"
    using Col_def by auto 
  have "Col C A C"
    by (simp add: col_trivial_3) 
  then obtain B' where "C A Perp B' C  C A OS B B'" 
    using l10_15 ¬ Col C A B by blast
  have "C A Perp B' C"
    by (simp add: C A Perp B' C  C A OS B B')
  have "C A OS B B'"
    by (simp add: C A Perp B' C  C A OS B B')
  have "¬ Col C A B'"
    by (simp add: C A Perp B' C  C A OS B B' perp_not_col)
  hence "¬ Col A B' C"
    using Col_cases by blast
  moreover
  have "Per A C B'"
    by (simp add: C A Perp B' C perp_per_1)
  moreover
  obtain M where "M Midpoint A B'"
    using midpoint_existence by blast
  moreover
  have "Cong M A M C"
    using assms thales_converse_postulate_def calculation(2) calculation(3) by blast 
  ultimately
  show ?thesis
    using existential_thales_postulate_def by blast 
qed

lemma thales_converse_postulate__weak_triangle_circumscription_principle:
  assumes "thales_converse_postulate"
  shows "weak_triangle_circumscription_principle"
proof -
  {
    fix A B C A1 A2 B1 B2
    assume 1: "¬ Col A B C" and 
      2: "Per A C B" and
      3: "A1 A2 PerpBisect B C" and
      4: "B1 B2 PerpBisect A C" and
      5: "Coplanar A B C A1" and
      6: "Coplanar A B C A2" and
      7: "Coplanar A B C B1" and
      8: "Coplanar A B C B2"
    obtain M where "M Midpoint A B"
      using midpoint_existence by blast
    hence "Cong M A M C" 
      using thales_converse_postulate_def "2" assms by blast 
    have "Bet A M B"
      by (simp add: M Midpoint A B midpoint_bet) 
    have "A  B"
      using "1" col_trivial_1 by auto
    have "Col A1 A2 M" 
    proof -
      have "Coplanar A1 M B C" 
      proof -
        have "Coplanar A1 C A B"
          using "5" ncoplanar_perm_17 by blast 
        moreover
        have "Col A B M"
          using Bet A M B bet_col not_col_permutation_5 by blast 
        moreover
        have "Col A B B"
          using col_trivial_2 by blast 
        ultimately
        show ?thesis
          by (metis A  B col_cop__cop col_permutation_4 
              coplanar_perm_1 coplanar_perm_5) 
      qed
      moreover
      have "Coplanar A2 M B C" 
      proof -
        have "Coplanar A2 C A B"
          using "6" ncoplanar_perm_17 by blast 
        moreover
        have "Col A B M"
          using Bet A M B bet_col not_col_permutation_5 by blast 
        moreover
        have "Col A B B"
          using col_trivial_2 by blast 
        ultimately
        show ?thesis
          by (metis A  B col_cop__cop col_permutation_4 
              coplanar_perm_1 coplanar_perm_5) 
      qed
      moreover
      have "Cong M B M C"
        by (meson Cong M A M C M Midpoint A B 
            cong_inner_transitivity cong_left_commutativity midpoint_cong) 
      ultimately
      show ?thesis
        using "3" cong_cop2_perp_bisect_col by blast
    qed
    moreover
    have "Col B1 B2 M" 
    proof -
      have "Coplanar B1 M A C" 
      proof -
        have "Coplanar B1 C A B"
          using "7" ncoplanar_perm_17 by blast 
        moreover
        have "Col A B M"
          using Bet A M B bet_col not_col_permutation_5 by blast 
        moreover
        have "Col A B A"
          by (simp add: col_trivial_3)
        ultimately
        show ?thesis
          by (metis A  B col_cop__cop coplanar_perm_5) 
      qed
      moreover
      have "Coplanar B2 M A C" 
      proof -
        have "Coplanar B2 C A B"
          using "8" ncoplanar_perm_17 by blast 
        moreover
        have "Col A B M"
          using Bet A M B bet_col not_col_permutation_5 by blast 
        moreover
        have "Col A B A"
          by (simp add: col_trivial_3)
        ultimately
        show ?thesis
          by (metis A  B col_cop__cop coplanar_perm_5) 
      qed
      ultimately
      show ?thesis
        using Cong M A M C "4" cong_cop2_perp_bisect_col by blast
    qed
    ultimately
    have " I. Col A1 A2 I  Col B1 B2 I" 
      by blast
  }
  thus ?thesis
    using weak_triangle_circumscription_principle_def by blast 
qed

lemma thales_existence__rah:
  assumes "existential_thales_postulate"
  shows "postulate_of_right_saccheri_quadrilaterals"
proof -
  {
    fix A B C D
    assume "Saccheri A B C D"
    hence "Per A B C" 
      using t22_17__rah assms existential_thales_postulate_def
        existential_playfair__rah_1 
        postulate_of_right_saccheri_quadrilaterals_def by fastforce
  }
  thus ?thesis
    using postulate_of_right_saccheri_quadrilaterals_def by blast 
qed

(** If A, B and C are points on a circle where the line AB is a diameter of the circle,
    then the angle ACB is a right angle. *)

(** This comes from the proof of Martin's Theorem 23.7 (N -> O) *)

lemma thales_postulate__thales_converse_postulate:
  assumes "thales_postulate"
  shows "thales_converse_postulate"
proof -
  {
    fix A B C M
    assume "M Midpoint A B" and "Per A C B"
    hence "Bet A M B"
      by (simp add: midpoint_bet) 
    have "Cong M A M C"
    proof (cases "Col A B C")
      case True
      thus ?thesis
        using M Midpoint A B Per A C B cong_left_commutativity 
          cong_reflexivity l8_9 midpoint_cong not_col_permutation_5 by blast 
    next
      case False
      hence "¬ Col A B C"
        by simp
      have "A  B"
        using False col_trivial_1 by auto 
      have "C  B"
        using False col_trivial_2 by blast 
      have "A  M"
        using False M Midpoint A B is_midpoint_id not_col_distincts by blast 
      have "A  C" 
        using False col_trivial_3 by blast
      have "M  C"
        using Col_def False M Midpoint A B l7_2 midpoint_bet by blast
      then obtain C' where "M Out C C'" and "Cong M C' M A" 
        using segment_construction_3 A  M by metis 
      hence "Cong M A M C'"
        by (meson cong_symmetry) 
      show ?thesis
      proof (cases "C = C'")
        case True
        thus ?thesis
          using Cong M A M C' by auto 
      next
        case False 
        hence "C  C'" by simp
        {
          assume "¬ Cong M A M C"
          have "M  C'"
            using A  M Cong M C' M A cong_reverse_identity by blast 
          {
            assume "Col A B C'"
            hence "¬ Per A C B"
              by (metis Col_cases midpoint_col
                  M Midpoint A B M Out C C' M  C'
                  ¬ Col A B C colx out_col)
            hence False
              by (simp add: Per A C B) 
          }
          hence "¬ Col A B C'" 
            by auto
          {
            assume "Col A C C'"
            hence "Col A C B" 
              by (meson False A  M Bet A M B M Out C C' 
                  bet_col l6_16_1 not_col_permutation_3 
                  not_col_permutation_5 out_col)
            hence False 
              using ¬ Col A B C not_col_permutation_5 by blast
          }
          hence "¬ Col A C C'" 
            by auto
          {
            assume "Col B C C'"
            hence "¬ Per A C B"
              by (metis Col_cases False midpoint_col 
                  M Midpoint A B M Out C C' ¬ Col A B C 
                  col_trivial_2 l6_21 midpoint_distinct_2 
                  out_col)
            hence False
              by (simp add: Per A C B) 
          }
          hence "¬ Col B C C'"
            by auto
          have "B  C'"
            using ¬ Col A B C' col_trivial_2 by auto 
          have "A  C'"
            using ¬ Col A B C' col_trivial_3 by blast 
          have "Per A C' B"
            using Cong M A M C' M Midpoint A B 
              assms thales_postulate_def by blast 
          hence "A C B CongA A C' B" 
            using Per A C B A  C' A  C 
              B  C' C  B l11_16 by force 
          have "Col A B M"
            using Col_perm Bet A M B bet_col by blast 
          hence "A B OS C C'"
            using ¬ Col A B C M Out C C' l9_19_R2 by blast
          {
            assume "Bet M C C'"
            have "A C' B LtA A C B" 
            proof -
              have "C' A OS B C" 
              proof -
                have "C' A OS B M"
                  by (metis NCol_cases out_one_side
                      A  B A  M Bet A M B ¬ Col A B C' 
                      bet2__out invert_one_side l5_1) 
                moreover
                have "C' A OS M C"
                  by (metis False bet_out_1 out_one_side 
                      Bet M C C' ¬ Col A C C' 
                      not_col_permutation_2 one_side_symmetry) 
                ultimately
                show ?thesis
                  using one_side_transitivity by blast 
              qed
              moreover
              have "A B OS C' C"
                by (simp add: A B OS C C' one_side_symmetry) 
              moreover
              have "C' B OS A C" 
              proof -
                have "C' B OS A M"
                  by (meson out_one_side  A  B M Midpoint A B 
                      ¬ Col A B C' invert_one_side midpoint_out_1 
                      not_col_permutation_1)
                moreover
                have "C' B OS M C"
                  by (meson False Bet M C C' ¬ Col B C C' 
                      bet_out_1 l6_6 not_col_permutation_2 
                      out_one_side) 
                ultimately
                show ?thesis
                  using one_side_transitivity by blast 
              qed
              ultimately
              show ?thesis
                by (simp add: os3__lta) 
            qed
            hence False 
              using A C B CongA A C' B
              by (meson conga_sym lta_not_conga) 
          }
          moreover
          {
            assume "Bet M C' C"
            have "A C B LtA A C' B" 
            proof -
              have "C A OS B C'" 
              proof -
                have "C A OS B M"
                  by (metis A  M Bet A M B ¬ Col A B C 
                      bet2__out col_trivial_3 invert_one_side l5_1 
                      not_col_permutation_5 out_one_side_1) 
                moreover
                have "C A OS M C'"
                  by (metis Bet M C C'  False M Out C C' 
                      calculation col_trivial_3 l9_19_R2 
                      one_side_not_col124 or_bet_out out_col)
                ultimately
                show ?thesis
                  using one_side_transitivity by blast 
              qed
              moreover
              have "C B OS A C'" 
              proof -
                have "C B OS A M"
                  by (meson out_one_side A  B M Midpoint A B 
                      ¬ Col A B C invert_one_side midpoint_out_1 
                      not_col_permutation_1) 
                moreover
                have "C B OS M C'"
                  by (meson Bet M C C'  False M Out C C' 
                      calculation col_trivial_3 l6_4_2 l9_19_R2 
                      one_side_not_col124 out_col) 
                ultimately
                show ?thesis
                  using one_side_transitivity by blast 
              qed
              ultimately
              show ?thesis
                by (simp add: A B OS C C' os3__lta) 
            qed
            hence False 
              using A C B CongA A C' B
              by (meson lta_not_conga)
          }
          ultimately
          have "False"
            using Out_def M Out C C' by presburger 
        }
        thus ?thesis 
          by auto
      qed
    qed
  }
  thus ?thesis
    using thales_converse_postulate_def by blast 
qed

lemma triangle__existential_triangle:
  assumes "triangle_postulate"
  shows "postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights"
proof -
  obtain A B C where "¬ (Bet A B C  Bet B C A  Bet C A B)"
    using lower_dim_ex by blast
  hence "¬ Col A B C"
    by (simp add: Col_def)
  moreover
  have "A  B"
    using calculation col_trivial_1 by blast
  have "B  C" 
    using calculation col_trivial_2 by blast
  have "A  C" 
    using calculation col_trivial_3 by blast
  obtain D E F where "A B C TriSumA D E F" 
    using ex_trisuma A  B B  CA  C by blast
  have "Bet D E F" 
    using triangle_postulate_def assms A B C TriSumA D E F by blast 
  hence " A B C D E F. (¬ Col A B C  A B C TriSumA D E F  Bet D E F)" 
    using A B C TriSumA D E F ¬ Col A B C by blast
  thus ?thesis
    using postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights_def 
    by presburger 
qed

(* RENAME legendre_aux → legendre_aux_tr *)
lemma legendre_aux_tr:
  assumes "greenberg_s_axiom" and
    "triangle_postulate"
  shows " ( A B C P Q. ¬(
    Q A Perp P Q  P B Perp P Q  Q A ParStrict P B 
    Q A ParStrict P C  P B OS Q C  P Q OS C A  P Q OS C B))"
proof -
  {
    fix A B C P Q
    assume  "Q A Perp P Q" and 
      "P B Perp P Q" and
      "Q A ParStrict P B" and
      "Q A ParStrict P C" and
      "P B OS Q C" and
      "P Q OS C A" and 
      "P Q OS C B"
    obtain B' where "P Midpoint B B'"
      using symmetric_point_construction by blast
    have "C InAngle Q P B"
      by (meson P B OS Q C P Q OS C B col123__nos l11_24 
          l9_2 l9_9_bis os_ts__inangle two_sides_cases) 
    have "¬ Col P B C"
      using P B OS Q C col124__nos by blast
    have "¬ Col P Q C"
      by (meson P Q OS C A col123__nos)
    have "¬ Col P Q A"
      using P Q OS C A col124__nos by blast
    have "B P C LtA B P Q" 
    proof -
      have "¬ Col C P Q"
        by (simp add: ¬ Col P Q C not_col_permutation_2) 
      moreover
      have "C InAngle B P Q"
        by (simp add: C InAngle Q P B l11_24) 
      ultimately
      show ?thesis
        by (simp add: inangle__lta)
    qed
    have "Per B P Q"
      by (simp add: P B Perp P Q perp_per_2) 
    hence "Acute B P C" 
      using B P C LtA B P Q Acute_def by blast 
    have "P  Q"
      using ¬ Col P Q C col_trivial_1 by auto 
    have "A  Q"
      using ¬ Col P Q A col_trivial_2 by fastforce 
    have "P  A"
      using ¬ Col P Q A col_trivial_3 by auto 
    have "P  C"
      using ¬ Col P Q C col_trivial_3 by blast 
    have "P  B"
      using ¬ Col P B C col_trivial_1 by auto 
    have "B  B'"
      using P Midpoint B B' P  B l8_20_2 by blast 
    hence "P  B'"
      using P Midpoint B B' midpoint_not_midpoint by blast 
    have " R. (P R Q LtA B P C  Q Out R A)"
    proof -
      have "¬ Col B P C"
        by (simp add: ¬ Col P B C not_col_permutation_4) 
      moreover
      have "Q  A"
        using A  Q by auto 
      moreover
      have "Per P Q A"
        by (meson Q A Perp P Q l8_2 perp_per_1) 
      ultimately
      show ?thesis
        using Acute B P C greenberg_s_axiom_def assms by blast
    qed
    then obtain R where "P R Q LtA B P C" and "Q Out R A"
      by blast
    have "R  Q"
      using Q Out R A l6_3_1 by auto
    have "R  P"
      using P R Q LtA B P C lta_distincts by blast 
    have "P Q OS R A"
      by (meson Out_cases Q Out R A ¬ Col P Q A col_trivial_2 
          one_side_symmetry out_one_side_1)
    have "¬ Col Q P R  ¬ Col Q P A"
      using ¬ Col P Q A col_permutation_4 by blast 
    hence "P C OS Q R"
      by (meson  Q Out R A Q A ParStrict P C col_permutation_5 
          out_col par_strict_one_side par_strict_symmetry) 
    obtain D E F where "B' P R P R Q SumA D E F"
      using ex_suma P  B' R  P R  Q by presburger 
    have "R Q P Q P R SumA B' P R"
    proof -
      have "B' P Q Q P R SumA B' P R" 
      proof -
        have "Q P R CongA Q P R"
          using P  Q R  P conga_refl by auto 
        moreover
        have "P Q TS R B'" 
        proof -
          have "P Q TS B B'" 
          proof -
            have "¬ Col P Q B"
              using P Q OS C B col124__nos by blast 
            moreover
            have "Bet B P B'"
              using P Midpoint B B' midpoint_bet by blast 
            ultimately
            show ?thesis
              by (simp add: P  B' bet__ts) 
          qed
          moreover
          have "P Q OS B R"
            by (meson P Q OS C A P Q OS C B P Q OS R A 
                one_side_symmetry one_side_transitivity) 
          ultimately
          show ?thesis
            using l9_8_2 by blast 
        qed
        hence "¬ P Q OS B' R"
          by (meson l9_2 l9_9_bis) 
        moreover
        have "Coplanar B' P Q R"
          by (meson P Q TS R B' coplanar_perm_18 ts__coplanar) 
        moreover
        have "B' P R CongA B' P R"
          using P  B' R  P conga_refl by auto 
        ultimately
        show ?thesis
          using SumA_def by blast 
      qed
      moreover
      have "B' P Q CongA R Q P" 
      proof -
        have "Per B' P Q"
          by (meson P Midpoint B B' Per B P Q l8_2 l8_4) 
        moreover
        have "Per P Q R" 
        proof -
          have "Per P Q A"
            using Q A Perp P Q l8_2 perp_per_1 by blast 
          moreover
          have "Col Q A R"
            by (metis Col_def Out_def Q Out R A col_permutation_3) 
          ultimately
          show ?thesis
            by (metis A  Q per_col) 
        qed
        hence "Per R Q P"
          by (meson l8_2) 
        ultimately
        show ?thesis
          using P  B' P  Q R  Q l11_16 by blast 
      qed
      moreover
      have "Q P R CongA Q P R"
        using P  Q R  P conga_refl by force 
      moreover
      have "B' P R CongA B' P R"
        using P  B' R  P conga_refl by auto 
      ultimately
      show ?thesis
        by (meson conga3_suma__suma) 
    qed
    hence "R Q P TriSumA D E F"
      using TriSumA_def B' P R P R Q SumA D E F by blast
    obtain I J K where "B' P R C P B SumA I J K" 
      using ex_suma P  B' R  P P  C P  B by presburger 
    have "¬ Col R P B'" 
    proof -
      have "Bet B P B'"
        using P Midpoint B B' midpoint_bet by blast 
      hence "Col P B B'"
        using bet_col not_col_permutation_4 by blast 
      hence "Q A ParStrict P B'" 
        using Q A ParStrict P B P  B' par_strict_col_par_strict by blast 
      moreover
      have "Col R Q A"
        by (metis Col_def Out_def Q Out R A col_permutation_3) 
      ultimately
      show ?thesis
        using par_not_col by blast 
    qed
    have "B' P R R P B SumA B' P B"
      by (metis Bet_cases P Midpoint B B' P  B' P  B 
          R  P bet__suma midpoint_bet) 
    have "SAMS B' P R R P B"
      by (meson Mid_cases B' P R R P B SumA B' P B 
          P Midpoint B B' bet_suma__sams midpoint_bet)
    have "C P B LeA R P B" 
    proof -
      have "P C TS Q B"
        by (simp add: P B OS Q C P Q OS C B l9_31 one_side_symmetry) 
      hence "P C TS B R" 
        using P C OS Q R l9_2 l9_8_2 by blast 
      moreover
      have "P B OS R Q"
        by (metis Out_def Par_strict_cases Q A ParStrict P B 
            Q Out R A bet_col l9_17 one_side_symmetry 
            par_strict_one_side pars__os3412) 
      hence "P B OS R C" 
        using P B OS Q C  one_side_transitivity by blast 
      ultimately
      show ?thesis
        by (simp add: inangle__lea lea_comm os_ts__inangle) 
    qed
    have "D E F LtA B' P B"
    proof -
      have "D E F LtA I J K" 
      proof -
        have "B' P R LeA B' P R"
          using P  B' R  P lea_refl by auto 
        moreover
        have "P R Q LtA C P B"
          by (simp add: P R Q LtA B P C lta_right_comm) 
        moreover
        have "SAMS B' P R C P B"
          by (meson C P B LeA R P B SAMS B' P R R P B 
              calculation(1) sams_lea2__sams) 
        ultimately
        show ?thesis
          by (meson B' P R P R Q SumA D E F 
              B' P R C P B SumA I J K sams_lea_lta456_suma2__lta) 
      qed
      moreover
      have  "I J K LeA B' P B"
        using  B' P R C P B SumA I J K 
          B' P R R P B SumA B' P B C P B LeA R P B 
          SAMS B' P R R P B sams_lea456_suma2__lea by blast 
      ultimately
      show ?thesis
        using  lea456789_lta__lta by blast 
    qed
    have "Bet D E F" 
      using R Q P TriSumA D E F triangle_postulate_def assms(2) by blast 
    hence "D E F CongA B' P B"
      by (metis D E F LtA B' P B P Midpoint B B' 
          conga_line conga_right_comm lta_distincts 
          midpoint_bet) 
    hence False
      using D E F LtA B' P B lta_not_conga by blast 
  }
  thus ?thesis by blast
qed

(*triangle_playfair_bis*)
(* RENAME legendre_aux1 → legendre_aux1_tr *)

lemma legendre_aux1_tr:
  assumes "greenberg_s_axiom" and
    "triangle_postulate"
  shows " A1 A2 B1 B2 C1 C2 P.
             (P Perp2 A1 A2 B1 B2  ¬ Col A1 A2 P  
              Col P B1 B2  Coplanar A1 A2 B1 B2 
              A1 A2 Par C1 C2  Col P C1 C2  
              ¬ B1 B2 TS A1 C1) 

              Col C1 B1 B2"
proof -
  {
    fix A1 A2 B1 B2 C1 C2 P
    assume "P Perp2 A1 A2 B1 B2" and 
      "¬ Col A1 A2 P" and
      "Col P B1 B2" and
      "Coplanar A1 A2 B1 B2" and
      "A1 A2 Par C1 C2" and
      "Col P C1 C2" and
      "¬ B1 B2 TS A1 C1"
    have "Col B1 B2 P"
      using Col_cases Col P B1 B2 by blast
    hence "A1 A2 ParStrict B1 B2"
      using  P Perp2 A1 A2 B1 B2 Coplanar A1 A2 B1 B2 
        ¬ Col A1 A2 P Coplanar A1 A2 B1 B2 P Perp2 A1 A2 B1 B2 
        col_cop_perp2__pars_bis by blast 
    have "A1 A2 ParStrict C1 C2" 
      using Col_cases A1 A2 Par C1 C2 Col P C1 C2 
        ¬ Col A1 A2 P par_not_col_strict by blast
    {
      assume "¬ Col C1 B1 B2"
      have "P  C1" 
        using Col P B1 B2 ¬ Col C1 B1 B2 by auto
      obtain P1 P2 where "Col P P1 P2" and 
        "P1 P2 Perp A1 A2" and
        "P1 P2 Perp B1 B2" 
        using P Perp2 A1 A2 B1 B2 Perp2_def by blast 
      obtain Q where "Col Q P1 P2" and "Col Q A1 A2"
        using P1 P2 Perp A1 A2 col_permutation_2 
          perp_inter_perp_in_n by blast 
      have "P  Q" 
        using NCol_perm Col Q A1 A2 ¬ Col A1 A2 P by blast
      have "A1 A2 Perp P Q" 
        by (meson Col P P1 P2 Col Q P1 P2 P  Q 
            P1 P2 Perp A1 A2 col_permutation_1 perp_col0)
      have "B1 B2 Perp P Q"
        by (meson Col P P1 P2 Col Q P1 P2 P  Q 
            P1 P2 Perp B1 B2 col_permutation_3 perp_col0 
            perp_left_comm)
      have "P  Q"
        using P  Q by auto
      have "C1  B1" 
        using ¬ Col C1 B1 B2 col_trivial_1 by blast
      have "B1  B2" 
        using ¬ Col C1 B1 B2 not_col_distincts by blast
      have "C1  B2"
        using ¬ Col C1 B1 B2 not_col_distincts by blast
      have "A1  A2" 
        using ¬ Col A1 A2 P col_trivial_1 by auto
      have "P  A2" 
        using ¬ Col A1 A2 P col_trivial_2 by blast
      have "P  A1" 
        using ¬ Col A1 A2 P col_trivial_3 by blast
      have "A1  B1" 
        using A1 A2 ParStrict B1 B2 not_par_strict_id by blast
      have "A1  B2" 
        using A1 A2 ParStrict B1 B2 col_trivial_2 
          par_strict_not_col_3 by blast
      have "A2  B1" 
        using A1 A2 ParStrict B1 B2 not_col_distincts 
          par_strict_not_col_2 by blast
      have "A2  B2" 
        using A1 A2 ParStrict B1 B2 not_col_distincts 
          par_strict_not_col_4 by blast
      have "A1  C1" 
        using A1 A2 ParStrict C1 C2 not_par_strict_id by blast
      have "A1  C2" 
        using A1 A2 ParStrict C1 C2 col_trivial_3 
          par_strict_not_col_4 by blast
      have "A2  C1"
        by (metis A1 A2 ParStrict C1 C2 Col P C1 C2 
            col3 col_trivial_2 par_strict_not_col_2)
      have "A2  C2" 
        using A1 A2 ParStrict C1 C2 col_trivial_2 
          par_strict_not_col_4 by blast
      have "C2  C1" 
        using A1 A2 Par C1 C2 par_neq2 by blast
      have "B1 B2 OS Q C1" 
      proof -
        have "B1 B2 OS Q A1" 
        proof (cases "A1 = Q")
          case True
          thus ?thesis 
            using A1 A2 ParStrict B1 B2 not_col_distincts 
              par_strict_one_side par_strict_symmetry by blast
        next
          case False
          have "B1 B2 ParStrict A1 A2" 
            using A1 A2 ParStrict B1 B2 par_strict_symmetry by blast
          moreover
          have "Col A1 A2 Q" 
            using Col Q A1 A2 not_col_permutation_2 by blast
          ultimately
          show ?thesis
            using one_side_symmetry par_strict_one_side by blast
        qed
        moreover
        have "B1 B2 OS A1 C1"
        proof -
          have "Coplanar B1 B2 A1 C1" 
          proof -
            have "¬ Col A1 A2 P" 
              by (simp add: ¬ Col A1 A2 P)
            moreover
            have "Coplanar A1 A2 P B1" 
              by (meson B1  B2 Col B1 B2 P 
                  Coplanar A1 A2 B1 B2 col2_cop__cop col_trivial_3)
            moreover
            have "Coplanar A1 A2 P B2" 
              using B1  B2 Col B1 B2 P Coplanar A1 A2 B1 B2 
                col2_cop__cop col_trivial_2 by blast
            moreover
            have "Coplanar A1 A2 P A1" 
              using ncop_distincts by blast
            moreover
            have "Coplanar A1 A2 P C1" 
              using A1 A2 Par C1 C2 C2  C1 Col P C1 C2 
                col_cop__cop coplanar_perm_1 not_col_permutation_2 
                par__coplanar by blast
            ultimately
            show ?thesis
              by (meson coplanar_pseudo_trans) 
          qed
          moreover
          have "¬ Col A1 B1 B2" 
            using A1 A2 ParStrict B1 B2 not_col_permutation_2 
              par_strict_not_col_3 by blast
          ultimately
          show ?thesis
            using ¬ Col C1 B1 B2 ¬ B1 B2 TS A1 C1 cop_nts__os by blast
        qed
        ultimately
        show ?thesis
          using one_side_transitivity by blast
      qed
      have "¬ Col Q C1 P"
        by (metis Col_cases A1 A2 ParStrict C1 C2 
            Col P C1 C2 Col Q A1 A2 P  C1 
            col_transitivity_2 par_not_col)
      have "¬ Col B1 B2 Q"
        using B1 B2 OS Q C1 col123__nos by blast
      have " B3. Col B1 B2 B3  P Q OS C1 B3" 
      proof (cases "Col P Q B1")
        case True
        hence "P = B1" 
          by (meson Col P B1 B2 ¬ Col B1 B2 Q 
              col_transitivity_2 not_col_permutation_5)
        have " B3. Col B2 P B3  P Q OS C1 B3"
        proof -
          have "B2  P"
            using B1  B2 P = B1 by blast
          moreover
          have "Col P Q P" 
            using True P = B1 by auto
          moreover
          have "Col B2 P P" 
            using not_col_distincts by auto
          moreover
          have "¬ Col P Q B2" 
            using Col_cases P = B1 ¬ Col B1 B2 Q by blast
          moreover
          have "¬ Col P Q C1"
            using Col_cases ¬ Col Q C1 P by blast
          moreover
          have "Coplanar P Q B2 C1" 
            using B1 B2 OS Q C1 P = B1 coplanar_perm_2 
              os__coplanar by blast
          ultimately
          show ?thesis
            using cop_not_par_same_side by blast
        qed
        then obtain B3 where "Col B2 P B3" and "P Q OS C1 B3"
          by blast
        thus ?thesis
          using P = B1 not_col_permutation_4 by blast 
      next
        case False
        have "Col P Q P" 
          by (meson not_col_distincts)
        moreover
        have "Coplanar P Q B1 C1" 
        proof -
          have "¬ Col B2 Q B1" 
            using Col_cases ¬ Col B1 B2 Q by blast
          moreover
          have "Coplanar B2 Q B1 P" 
            using NCol_perm Col P B1 B2 ncop__ncols by blast
          moreover
          have "Coplanar B2 Q B1 C1"
            using B1 B2 OS Q C1 ncoplanar_perm_12 
              os__coplanar by blast 
          ultimately
          show ?thesis
            by (meson coplanar_trans_1 ncoplanar_perm_8) 
        qed
        ultimately
        show ?thesis
          using B1  B2 Col B1 B2 P False 
            ¬ Col Q C1 P cop_not_par_same_side 
            Col_cases by blast  
      qed
      then obtain B3 where "Col B1 B2 B3" and "P Q OS C1 B3" 
        by blast
      have "¬ Col P Q B3"
        using P Q OS C1 B3 one_side_not_col124 by auto
      have "Coplanar A1 A2 C1 P"
        using Col_cases A1 A2 Par C1 C2 C2  C1 
          Col P C1 C2 col_cop__cop par__coplanar by blast
      have " A3. Col A1 A2 A3  P Q OS C1 A3"
      proof (cases "Col P Q A1")
        case True
        have "Q = A1"
          by (meson True Col Q A1 A2 ¬ Col A1 A2 P 
              col_permutation_1 col_trivial_2 colx)
        have " A3. Col A2 Q A3  P Q OS C1 A3"
        proof -
          have "A2  Q" 
            using A1  A2 Q = A1 by auto
          moreover
          have "Col P Q Q" 
            by (simp add: col_trivial_2)
          moreover
          have "Col A2 Q Q" 
            by (simp add: col_trivial_2)
          moreover
          have "¬ Col P Q A2" 
            using Col_cases Q = A1 ¬ Col A1 A2 P by blast
          moreover
          have "¬ Col P Q C1" 
            using Col_cases ¬ Col Q C1 P by blast
          moreover
          have "Coplanar P Q A2 C1" 
            using Coplanar A1 A2 C1 P Q = A1 ncoplanar_perm_9 by blast
          ultimately
          show ?thesis 
            using cop_not_par_same_side by blast
        qed
        then obtain A3 where "Col A2 Q A3" and "P Q OS C1 A3"
          by blast
        thus ?thesis
          using Q = A1 not_col_permutation_4 by blast 
      next
        case False
        have "Col P Q Q" 
          by (simp add: col_trivial_2)
        moreover
        have "Col A1 A2 Q"
          using NCol_cases Col Q A1 A2 by blast 
        moreover
        have "¬ Col P Q C1" 
          using Col_cases ¬ Col Q C1 P by blast
        moreover
        have "Coplanar P Q A1 C1"
          using A1  A2 Coplanar A1 A2 C1 P 
            calculation(2) col_cop__cop coplanar_perm_16 
            ncoplanar_perm_19 by blast 
        ultimately
        show ?thesis 
          using False A1  A2 cop_not_par_same_side by blast 
      qed
      then obtain A3 where "Col A1 A2 A3" and "P Q OS C1 A3" 
        by blast
      have "Q  B3" 
        using Col B1 B2 B3 ¬ Col B1 B2 Q by blast
      have "P  B3" 
        using ¬ Col P Q B3 col_trivial_3 by auto
      have "B2  Q" 
        using ¬ Col B1 B2 Q col_trivial_2 by auto
      have "Q  B1" 
        using ¬ Col B1 B2 Q col_trivial_3 by blast
      have "Q  C1" 
        using ¬ Col Q C1 P not_col_distincts by blast
      have "P  A3" 
        using Col A1 A2 A3 ¬ Col A1 A2 P by auto
      have "Q  A3" 
        using P Q OS C1 A3 os_distincts by blast
      have False 
      proof -
        have H1: "Q A3 Perp P Q  P B3 Perp P Q  Q A3 ParStrict P B3 
              Q A3 ParStrict P C1  P B3 OS Q C1  
              P Q OS C1 A3  P Q OS C1 B3"
        proof -
          have "Col A1 A2 Q"
            using Col_cases Col Q A1 A2 by blast
          hence "Q A3 Perp P Q"
            using A1 A2 Perp P Q Q  A3 Col A1 A2 A3 perp_col2 by blast
          moreover
          have "Col B1 B2 P" 
            by (simp add: Col B1 B2 P) 
          hence "P B3 Perp P Q" 
            using perp_col2 B1 B2 Perp P Q Col B1 B2 B3 P  B3 by blast
          moreover
          have "Q A3 ParStrict P B3"
            using Q  A3 P  B3 A1 A2 ParStrict B1 B2 
              Col A1 A2 Q Col A1 A2 A3 Col B1 B2 P 
              Col B1 B2 B3 par_strict_col4__par_strict by blast 
          moreover
          have "Q A3 ParStrict P C1" 
          proof -
            have "Col C1 C2 P"
              using Col_cases Col P C1 C2 by auto
            moreover
            have "Col C1 C2 C1" 
              using not_col_distincts by blast
            ultimately
            show ?thesis
              using Q  A3 P  C1 A1 A2 ParStrict C1 C2 
                Col A1 A2 Q Col A1 A2 A3 
                par_strict_col4__par_strict by blast
          qed
          moreover
          have "P B3 OS Q C1" 
            using P  B3 Col B1 B2 P Col B1 B2 B3 
              B1 B2 OS Q C1 col2_os__os by blast 
          ultimately
          show ?thesis by (simp add: P Q OS C1 A3 P Q OS C1 B3)
        qed
        thus ?thesis 
          using legendre_aux_tr assms(1) assms(2) by blast
      qed
    }
    hence "Col C1 B1 B2" 
      by auto
  }
  thus ?thesis by blast
qed

(* RENAME legendre_aux2 → legendre_aux2_tr *)

lemma legendre_aux2_tr:
  assumes "greenberg_s_axiom" and
    "triangle_postulate"
  shows " A1 A2 B1 B2 C1 C2 P. 
              (P Perp2 A1 A2 B1 B2  ¬ Col A1 A2 P  
               Col P B1 B2  Coplanar A1 A2 B1 B2  
               A1 A2 Par C1 C2  Col P C1 C2) 
 
               Col C1 B1 B2"
proof -
  {
    fix A1 A2 B1 B2 C1 C2 P
    assume 1: "P Perp2 A1 A2 B1 B2" and
      2: "¬ Col A1 A2 P" and
      3: "Col P B1 B2" and
      4: "Coplanar A1 A2 B1 B2" and
      5: "A1 A2 Par C1 C2" and
      6: "Col P C1 C2"
    have "A1 A2 ParStrict B1 B2" 
      using Col_cases Col P B1 B2 Coplanar A1 A2 B1 B2 
        P Perp2 A1 A2 B1 B2 ¬ Col A1 A2 P 
        col_cop_perp2__pars_bis by blast
    {
      assume "B1 B2 TS A1 C1" 
      hence "¬ Col C1 B1 B2" 
        using TS_def by blast
      have "C1  P"
        using "3" ¬ Col C1 B1 B2 by auto
      obtain C3 where "P Midpoint C1 C3"
        using symmetric_point_construction by blast
      hence "C1  C3" 
        by (metis C1  P midpoint_distinct_2)
      have "¬ Col C3 B1 B2" 
        by (metis "3" P Midpoint C1 C3 ¬ Col C1 B1 B2 
            col_trivial_2 l6_21 midpoint_col midpoint_distinct_2 
            not_col_permutation_3 not_col_permutation_4)
      moreover
      have "Col C3 B1 B2"
      proof -
        have "P Perp2 A1 A2 B1 B2"
          by (simp add: "1") 
        moreover
        have "¬ Col A1 A2 P"
          by (simp add: "2") 
        moreover
        have "Col P B1 B2"
          by (simp add: "3") 
        moreover
        have "Coplanar A1 A2 B1 B2"
          by (simp add: "4") 
        moreover
        have "A1 A2 Par C1 P"
          by (metis "5" "6" C1  P col_trivial_2 
              par_col2_par_bis par_right_comm) 
        hence "A1 A2 Par C1 C3" 
          using Col_def Midpoint_def C1  C3 
            P Midpoint C1 C3 par_col_par by blast
        hence "A1 A2 Par C3 C1"
          using Par_perm by blast 
        moreover
        have "Col P C3 C1"
          using P Midpoint C1 C3 
          by (meson Mid_cases midpoint_col) 
        moreover
        have "Bet C3 P C1" 
          using P Midpoint C1 C3 
          by (metis midpoint_bet between_symmetry) 
        hence "B1 B2 TS C3 C1" 
          using 3 TS_def ¬ Col C1 B1 B2 ¬ Col C3 B1 B2 by blast 
        hence "B1 B2 OS A1 C3" 
          using B1 B2 TS A1 C1 l9_8_1 by blast 
        hence "¬ B1 B2 TS A1 C3"
          using l9_9_bis by auto 
        ultimately
        show ?thesis 
          using legendre_aux1_tr greenberg_s_axiom_def 
            triangle_postulate_def assms(1) assms(2) by blast
      qed
      ultimately
      have "False"
        using ¬ Col C3 B1 B2Col C3 B1 B2 by blast
    }
    hence "¬ B1 B2 TS A1 C1" 
      by blast
    hence "Col C1 B1 B2"
      using legendre_aux1_tr greenberg_s_axiom_def 
        assms(1) assms(2) 1 2 3 4 5 6 by blast
  }
  thus ?thesis 
    by blast
qed

lemma triangle__playfair_bis:
  assumes "greenberg_s_axiom" and
    "triangle_postulate"
  shows "alternative_playfair_s_postulate"
proof -
  {
    fix A1 A2 B1 B2 C1 C2 P
    assume 1: "P Perp2 A1 A2 B1 B2" and
      2: "¬ Col A1 A2 P" and
      3: "Col P B1 B2" and
      4: "Coplanar A1 A2 B1 B2" and
      5: "A1 A2 Par C1 C2" and
      6: "Col P C1 C2"
    have "Col C1 B1 B2" 
      using 1 2 3 4 5 6 legendre_aux2_tr 
        greenberg_s_axiom_def assms(1) assms(2)
      by blast
    moreover
    have "Col C2 B1 B2" 
    proof -
      have "A1 A2 Par C2 C1"
        by (simp add: "5" par_right_comm) 
      moreover 
      have "Col P C2 C1"
        by (simp add: "6" col_permutation_5) 
      ultimately
      show ?thesis
        using 1 2 3 4 legendre_aux2_tr greenberg_s_axiom_def 
          assms(1) assms(2) by blast
    qed
    ultimately
    have "Col C1 B1 B2  Col C2 B1 B2" 
      by simp
  }
  thus ?thesis
    using alternative_playfair_s_postulate_def by blast 
qed

lemma rah__existential_saccheri:
  assumes "postulate_of_right_saccheri_quadrilaterals"
  shows "postulate_of_existence_of_a_right_saccheri_quadrilateral"
proof -
  obtain A B C D where "Saccheri A B C D"
    using ex_saccheri by blast
  moreover
  have "Per A B C" 
    using assms 
      calculation postulate_of_right_saccheri_quadrilaterals_def 
    by blast 
  ultimately
  show ?thesis
    using postulate_of_existence_of_a_right_saccheri_quadrilateral_def 
    by blast 
qed

lemma rah__posidonius_aux:
  assumes "postulate_of_right_saccheri_quadrilaterals"
  shows " A1 A2 A3 B1 B2 B3.
                (Per A2 A1 B1  Per A1 A2 B2  
                 Cong A1 B1 A2 B2  A1 A2 OS B1 B2  
                 Col A1 A2 A3  Col B1 B2 B3  
                 A1 A2 Perp A3 B3) 
 
                Cong A3 B3 A1 B1"
proof -
  {
    fix A1 A2 A3 B1 B2 B3
    assume 1: "Per A2 A1 B1" and
      2: "Per A1 A2 B2" and
      3: "Cong A1 B1 A2 B2" and
      4: "A1 A2 OS B1 B2" and
      5: "Col A1 A2 A3" and
      6: "Col B1 B2 B3" and
      7: "A1 A2 Perp A3 B3"
    have "A1  B1"
      using A1 A2 OS B1 B2 Cong A1 B1 A2 B2 
        col_trivial_2 cong_reverse_identity 
        one_side_not_col124 by blast
    have "B2  B1" 
      using A1 A2 Perp A3 B3 Cong A1 B1 A2 B2 
        Per A1 A2 B2 Per A2 A1 B1 diff_per_diff 
        perp_not_eq_1 by blast
    have "A2  B2" 
      using A1  B1 Cong A1 B1 A2 B2 cong_identity_inv by blast
    have "A1  A2" 
      using A1 A2 OS B1 B2 os_distincts by auto
    have "A1  B2" 
      using A2  B2 Per A1 A2 B2 per_distinct_1 by blast
    have "A2  B1" 
      using A1  A2 Per A2 A1 B1 per_distinct_1 by blast
    have "Cong A3 B3 A1 B1" 
    proof (cases "A1 = A3")
      case True
      hence "A1 = A3" 
        by blast
      have "B1 = B3" 
      proof -
        have "¬ Col B1 B2 A1" 
          using 1 2 A1  A2 A1  B1 A2  B2
            col_permutation_5 per_not_colp by blast 
        moreover
        have "Col B1 B2 B1"
          using not_col_distincts by blast 
        moreover
        have "Col A1 B1 B1"
          using not_col_distincts by blast 
        moreover
        have "Col A1 B1 B3" 
        proof -
          {
            assume "¬ Col A1 B1 B3"
            have "Per A2 A1 B3" 
              using perp_per_2 "7" A1 = A3 by blast
            hence "¬ Col A1 A2 B3" 
              by (meson "5" "7" l8_16_1)
            have "Per A1 A2 B3"
            proof -
              have f2: "Per B2 A2 A1" 
                by (simp add: "2" l8_2)
              have f3: "Per B1 A1 A2"  
                by (simp add: "1" l8_2)
              have "Col B3 B1 B2" 
                by (simp add: "6" col_permutation_2)
              then show ?thesis 
                by (metis col_per2__per l8_2 l8_7 not_col_distincts 
                    Per A2 A1 B3 ¬ Col A1 B1 B3 
                    Per B2 A2 A1 Per B1 A1 A2)
            qed
            hence "A1 = A2" 
              using Per A2 A1 B3 l8_2 l8_7 by blast
            hence False  
              by (simp add: A1  A2)
          }
          thus ?thesis 
            by blast
        qed
        ultimately
        show ?thesis
          using 6 A1  B1 l6_21 by blast 
      qed
      thus ?thesis
        using True cong_reflexivity by auto 
    next
      case False
      have "A3  B3"
        using "7" perp_not_eq_2 by auto 
      then obtain B'3 where "A3 Out B3 B'3" and "Cong A3 B'3 A1 B1" 
        using segment_construction_3 A1  B1 by blast
      hence "A3  B'3"
        using out_distinct by blast
      have "B3 = B'3" 
      proof -
        have "Saccheri A1 B1 B2 A2"
          by (meson "1" "2" "3" "4" Per_cases Saccheri_def not_cong_1243) 
        hence "A1 A2 ParStrict B1 B2"
          using sac__pars1423 by auto 
        hence "B1 B2 ParStrict A1 A2"
          by (simp add: par_strict_symmetry) 
        hence "B1 B2 ParStrict A1 A3"
          using 5 False par_strict_col_par_strict by blast 
        have "¬ Col B1 B2 A3"
          using B1 B2 ParStrict A1 A3 par_strict_not_col_4 by auto 
        moreover
        have "A3  B3"
          using A3  B3 by auto
        moreover
        have "Col B1 B2 B3"
          using "6" by auto 
        moreover
        have "Col B2 B'3 B1" 
        proof -
          have "Coplanar A1 B2 B'3 B1"
          proof -
            have "¬ Col A3 B1 B2"
              using NCol_cases calculation(1) by blast 
            moreover
            have "Coplanar A3 B1 B2 A1"
              using B1 B2 ParStrict A1 A3 ncoplanar_perm_9 
                pars__coplanar by blast 
            moreover
            have "Coplanar A3 B1 B2 B'3"
              using "6" Coplanar_def Out_cases A3 Out B3 B'3 
                out_col by blast 
            ultimately
            show ?thesis
              by (meson coplanar_trans_1 ncoplanar_perm_20) 
          qed
          moreover
          have "Per B2 B1 A1"
            using Saccheri A1 B1 B2 A2 Per_perm assms 
              postulate_of_right_saccheri_quadrilaterals_def by blast 
          moreover
          have "Saccheri A1 B1 B'3 A3" 
          proof -
            {
              assume "B1 = B3"
              have "A1 = A3" 
              proof -
                have "¬ Col A1 A2 B1"
                  using "4" col123__nos by blast
                moreover
                have "Col A1 A2 A1"
                  by (simp add: col_trivial_3) 
                moreover
                have "A1 A2 Perp B1 A1"
                  using "1" A1  A2 A1  B1 per_perp 
                    perp_comm by presburger 
                moreover
                have "A1 A2 Perp B1 A3"
                  by (simp add: "7" B1 = B3 perp_right_comm) 
                ultimately
                show ?thesis
                  using 5 l8_18_uniqueness by blast 
              qed
              hence False
                using False by auto 
            }
            hence "B1  B3" 
              by blast
            have "Per A1 A3 B'3"
              by (metis "5" "7" A3 Out B3 B'3 col_trivial_3 
                  l8_16_1 l8_2 l8_3 out_col perp_right_comm) 
            moreover
            have "Per B1 A1 A3"
              using "1" "5" A1  A2 l8_2 l8_3 by blast 
            moreover
            have "Cong A1 B1 B'3 A3"
              using Cong_cases Cong A3 B'3 A1 B1 by blast 
            moreover
            have "A1 A3 OS B1 B'3" 
            proof -
              have "A1 A3 OS B1 B3"
                by (meson "5" "6" False B1 B2 ParStrict A1 A2
                    B1  B3 col_trivial_3 par_strict_col4__par_strict 
                    pars__os3412) 
              moreover
              have "A1 A3 OS B3 B'3"
                using A3 Out B3 B'3 calculation col_trivial_2 
                  one_side_not_col124 out_one_side_1 by blast 
              ultimately
              show ?thesis
                using one_side_transitivity by blast 
            qed
            ultimately
            show ?thesis
              using Saccheri_def by blast 
          qed
          hence "Per B'3 B1 A1"
            using Per_perm assms 
              postulate_of_right_saccheri_quadrilaterals_def by blast 
          ultimately
          show ?thesis
            using A1  B1 cop_per2__col by blast 
        qed
        hence "Col B1 B2 B'3"
          using Col_cases by blast 
        moreover
        have "Col A3 B3 B3"
          by (metis not_col_distincts) 
        moreover  
        have "Col A3 B3 B'3"
          using A3 Out B3 B'3 out_col by auto 
        ultimately
        show ?thesis
          using l6_21 by blast 
      qed
      thus ?thesis
        using Cong A3 B'3 A1 B1 by auto 
    qed
  }
  thus ?thesis by blast
qed

(** There exists two lines which are everywhere equidistant. *)

lemma rah__posidonius:
  assumes "postulate_of_right_saccheri_quadrilaterals"
  shows "posidonius_postulate"
proof -
  obtain A1 B1 B2 A2 where "Saccheri A1 B1 B2 A2"
    using ex_saccheri by presburger
  hence H1: "Per B1 A1 A2  Per A1 A2 B2  
             Cong A1 B1 B2 A2  A1 A2 OS B1 B2" 
    using Saccheri_def by blast
  hence "Per B1 A1 A2" by blast
  have "Per A1 A2 B2"
    by (simp add: H1) 
  have "Cong A1 B1 B2 A2" 
    by (simp add: H1) 
  have "A1 A2 OS B1 B2" 
    by (simp add: H1) 
  have "¬ Col A1 A2 B1"
    using A1 A2 OS B1 B2 col123__nos by blast 
  moreover
  have "B1  B2"
    using Saccheri A1 B1 B2 A2 sac_distincts by blast 
  moreover
  have "Coplanar A1 A2 B1 B2"
    using Saccheri A1 B1 B2 A2 ncoplanar_perm_3 
      sac__coplanar by blast 
  moreover
  {
    fix A3 A4 B3 B4
    assume "Col A1 A2 A3" and
      "Col B1 B2 B3" and
      "A1 A2 Perp A3 B3" and
      "Col A1 A2 A4" and
      "Col B1 B2 B4" and
      "A1 A2 Perp A4 B4"
    have "(Per A2 A1 B1  Per A1 A2 B2  Cong A1 B1 A2 B2 
           A1 A2 OS B1 B2  Col A1 A2 A3  Col B1 B2 B3  
           A1 A2 Perp A3 B3)  Cong A3 B3 A1 B1" 
      using rah__posidonius_aux assms by blast 
    hence "Cong A3 B3 A1 B1" 
      using Cong_cases A1 A2 OS B1 B2 A1 A2 Perp A3 B3 
        Col A1 A2 A3 Col B1 B2 B3 Cong A1 B1 B2 A2 
        Per A1 A2 B2 Per B1 A1 A2 l8_2 by blast
    hence "Cong A1 B1 A3 B3"
      using not_cong_3412 by blast 
    moreover
    have "(Per A2 A1 B1  Per A1 A2 B2  Cong A1 B1 A2 B2 
          A1 A2 OS B1 B2  Col A1 A2 A4  Col B1 B2 B4  
          A1 A2 Perp A4 B4)   Cong A4 B4 A1 B1"
      using rah__posidonius_aux assms by blast 
    hence "Cong A4 B4 A1 B1" 
      using Cong_cases A1 A2 OS B1 B2 A1 A2 Perp A4 B4 
        Col A1 A2 A4 Col B1 B2 B4 Cong A1 B1 B2 A2
        Per A1 A2 B2 Per B1 A1 A2 l8_2 by blast 
    hence"Cong A1 B1 A4 B4"
      by (simp add: cong_symmetry) 
    ultimately
    have "Cong A3 B3 A4 B4"
      using cong_inner_transitivity by blast 
  }
  ultimately
  show ?thesis 
    using posidonius_postulate_def by blast
qed

(** The angles of a any Lambert quadrilateral are right, i.e
    if in a quadrilateral three angles are right, so is the fourth. *)

lemma rah__rectangle_principle:
  assumes "postulate_of_right_saccheri_quadrilaterals"
  shows "postulate_of_right_lambert_quadrilaterals" 
proof -
  {
    fix A B C D
    assume "Lambert A B C D"
    hence "Per B C D" 
      using lam_per__rah assms existential_playfair__rah_1 by blast 
  }
  thus ?thesis
    by (simp add: postulate_of_right_lambert_quadrilaterals_def) 
qed

(** There exists two non congruent similar triangles. *)


lemma rah__similar:
  assumes "postulate_of_right_saccheri_quadrilaterals"
  shows "postulate_of_existence_of_similar_triangles"
proof -
  obtain A B0 C where "¬ (Bet A B0 C  Bet B0 C A  Bet C A B0)"
    using lower_dim_ex by blast
  hence "¬ Col A B0 C"
    by (simp add: Col_def)
  then obtain B where "C A Perp B C" and "C A OS B0 B" 
    using l10_15 by (metis Col_cases col_trivial_3) 
  hence "¬ Col C A B"
    using col124__nos by blast
  have "Per A C B"
    by (simp add: C A Perp B C perp_per_1)
  obtain B' where "B Midpoint A B'"
    using symmetric_point_construction by blast
  have "C  A"
    using ¬ Col A B0 C col_trivial_3 by blast 
  have "B  A"
    using ¬ Col C A B col_trivial_2 by blast 
  have "C  B"
    using ¬ Col C A B col_trivial_3 by auto 
  have "B0  A"
    using ¬ Col A B0 C col_trivial_1 by force 
  have "B'  A"
    using B Midpoint A B' B  A l7_3 by blast 
  have "B  B'"
    by (metis B Midpoint A B' B'  A midpoint_not_midpoint) 
  have "¬ Col A C B'"
    using B Midpoint A B' B'  A ¬ Col C A B
      col2__eq midpoint_col not_col_permutation_4 by blast
  hence "¬ Col B B' C"
    by (metis B Midpoint A B' B  B' col2__eq 
        col_permutation_1 midpoint_col)
  obtain C' where "Col A C C'" and "A C Perp B' C'"
    using ¬ Col A C B' l8_18_existence by blast
  have"¬ Col A B C"
    using ¬ Col C A B col_permutation_2 by blast 
  moreover
  have "¬ Cong A B A B'"
    by (metis midpoint_bet B Midpoint A B' 
        B  B' between_cong) 
  moreover
  have "B C ParStrict B' C'" 
  proof -
    have "B C Par B' C'" 
    proof -
      have "Bet A B B'"
        by (simp add: B Midpoint A B' midpoint_bet) 
      hence "Coplanar A C B B'"
        using bet_col ncop__ncols by blast 
      moreover
      have "Coplanar A C B C'"
        by (meson Col A C C' ncop__ncols) 
      moreover
      have "Coplanar A C C B'"
        using ncop_distincts by blast 
      moreover
      have "Coplanar A C C C'"
        using ncop_distincts by blast 
      moreover
      have "B C Perp A C"
        using Perp_perm C A Perp B C by blast 
      moreover
      have "B' C' Perp A C"
        using Perp_perm A C Perp B' C' by blast 
      ultimately
      show ?thesis
        using l12_9 by blast 
    qed
    moreover
    have "Col B' C' B'"
      using not_col_distincts by blast 
    moreover
    have "¬ Col B C B'"
      using ¬ Col B B' C not_col_permutation_5 by blast 
    ultimately
    show ?thesis
      using par_not_col_strict by auto 
  qed
  have "¬ Col B C C'"
    by (meson B C ParStrict B' C' not_col_permutation_1 
        par_strict_not_col_2 par_strict_symmetry)
  hence "C  C'"
    using col_trivial_2 by auto 
  have "B'  C'"
    using B C ParStrict B' C' col_trivial_1 col_trivial_3 
      one_side_not_col124 par_strict_one_side by blast 
  have "Bet A C C'" 
  proof -
    have "Col C A C'"
      by (simp add: Col A C C' col_permutation_4)
    moreover
    have "C B TS C' A"
    proof -
      have "C B TS B' A" 
      proof -
        have "¬ Col B' C B"
          using ¬ Col B B' C col_permutation_2 by blast 
        moreover
        have "¬ Col A C B"
          using ¬ Col A B C col_permutation_5 by blast 
        moreover
        have "Col B C B"
          using not_col_distincts by blast
        moreover
        have "Bet B' B A"
          using B Midpoint A B' between_symmetry 
            midpoint_bet by blast 
        ultimately
        show ?thesis
          using TS_def by blast 
      qed
      moreover
      have "C B OS B' C'"
        using Par_strict_perm B C ParStrict B' C' 
          pars__os3412 by blast 
      ultimately
      show ?thesis
        using l9_8_2 by blast 
    qed
    hence "C B TS A C'"
      by (simp add: l9_2) 
    ultimately
    show ?thesis
      using col_two_sides_bet by blast 
  qed
  have "A  C'"
    using Bet A C C' C  C' between_equality_2 
      between_trivial2 by blast
  have "C' B' Perp A C'" 
  proof -
    have "A  C'"
      using A  C' by auto 
    moreover
    have "C' B' Perp A C"
      using Perp_perm A C Perp B' C' by blast 
    ultimately
    show ?thesis
      using Col A C C' perp_col1 by blast 
  qed
  hence "Per B' C' A" 
    using perp_per_1 by blast
  have "A B C CongA A B' C'" 
  proof -
    have "SAMS C A B A B C"
      using B  A C  A C  B sams123231 by auto 
    moreover
    have "SAMS C A B A B' C'" 
    proof -
      have "C' A B' CongA C A B"
        by (metis midpoint_bet out2__conga 
            B Midpoint A B' B  A Bet A C C' 
            C  A bet_out) 
      moreover
      have "A B' C' CongA A B' C'"
        using B'  A B'  C' lea_asym lea_refl by auto 
      moreover
      have "SAMS C' A B' A B' C'"
        using A  C' B'  A B'  C' sams123231 by force 
      ultimately
      show ?thesis
        using conga2_sams__sams by blast 
    qed
    moreover
    have "C A B A B C SumA B C A" 
    proof -
      have "Per B C A"
        using Per_perm Per A C B by blast 
      moreover
      have "hypothesis_of_right_saccheri_quadrilaterals"
        using assms existential_playfair__rah_1 by blast
      ultimately
      show ?thesis
        using C  A C  B t22_12__rah_2 by presburger 
    qed
    moreover
    have "C A B A B' C' SumA B C A" 
    proof -
      have "hypothesis_of_right_saccheri_quadrilaterals"
        using assms existential_playfair__rah_1 by auto 
      hence "C' A B' A B' C' SumA B' C' A" 
        using A  C' B'  C' Per B' C' A 
          t22_12__rah_2 by presburger 
      moreover
      have "C' A B' CongA C A B"
        by (metis midpoint_bet out2__conga
            B Midpoint A B' B  A Bet A C C' 
            C  A bet_out) 
      moreover
      have "A B' C' CongA A B' C'"
        using B'  A B'  C' conga_refl by auto 
      moreover
      have "B' C' A CongA B C A"
        by (metis A C Perp B' C' A  C' 
            C A Perp B C C  A C  B C  C' 
            Col A C C' col2__eq conga_right_comm l11_16 
            l8_16_1 perp_per_1) 
      ultimately
      show ?thesis
        by (meson conga3_suma__suma) 
    qed
    ultimately
    show ?thesis
      using sams2_suma2__conga456 by blast 
  qed
  moreover
  have "B C A CongA B' C' A"
    by (metis A C Perp B' C' A  C' 
        C A Perp B C C  A C  B C  C' 
        Col A C C' conga_left_comm l11_16 l6_16_1 
        l8_16_1 perp_per_1) 
  moreover
  have "C A B CongA C' A B'" 
  proof -
    have "A Out C' C"
      by (simp add: Bet A C C' C  A bet_out l6_6) 
    moreover
    have "A Out B' B"
      by (simp add: B Midpoint A B' B'  A l7_2 midpoint_out_1) 
    ultimately
    show ?thesis
      by (simp add: out2__conga) 
  qed
  ultimately
  show ?thesis 
    using postulate_of_existence_of_similar_triangles_def by blast 
qed

lemma rah__thales_postulate:
  assumes "postulate_of_right_saccheri_quadrilaterals"
  shows "thales_postulate" 
proof -
  {
    fix  A B C M
    assume "M Midpoint A B" and "Cong M A M C"
    have "Per A C B"
    proof (cases "Col A B C")
      case True
      show ?thesis 
      proof (cases "A = B")
        case True
        thus ?thesis
          using Cong M A M C M Midpoint A B 
            cong_reverse_identity l8_20_2 l8_5 by blast
      next
        case False
        hence "A  B" 
          by auto
        moreover
        have "Col A M B"
          using M Midpoint A B midpoint_col 
            not_col_permutation_4 by blast 
        hence "Col A M C"
          by (meson True calculation col_trivial_3 colx) 
        ultimately
        show ?thesis
          by (metis Cong M A M C M Midpoint A B 
              cong_col_mid cong_left_commutativity l8_2 l8_5 
              symmetric_point_uniqueness)
      qed
    next
      case False
      thus ?thesis 
        using t22_17__rah Cong M A M C M Midpoint A B
          assms existential_playfair__rah_1 by blast 
    qed
  }
  thus ?thesis
    using thales_postulate_def by blast 
qed

lemma rah__triangle:
  assumes "postulate_of_right_saccheri_quadrilaterals"
  shows "triangle_postulate" 
proof -
  {
    fix A B C D E F
    assume "A B C TriSumA D E F"
    hence "Bet D E F"
      using assms existential_playfair__rah_1 t22_14__bet by blast 
  }
  thus ?thesis
    using triangle_postulate_def by blast 
qed

(** There exists a Lambert quadrilateral whose angles are right. *)

lemma rectangle_principle__rectangle_existence:
  assumes "postulate_of_right_lambert_quadrilaterals"
  shows "postulate_of_existence_of_a_right_lambert_quadrilateral"
proof - 
  obtain A B C D where "Saccheri A B C D"
    using ex_saccheri by blast
  moreover
  obtain M where "M Midpoint B C" 
    using midpoint_existence by blast
  moreover
  obtain N where "N Midpoint A D"
    using midpoint_existence by blast
  ultimately
  have "Lambert N M B A" 
    by (meson mid2_sac__lam6521)
  moreover
  have "Per M B A" 
    using postulate_of_right_lambert_quadrilaterals_def 
      assms Lambert N M B A by blast
  ultimately
  show ?thesis 
    using postulate_of_existence_of_a_right_lambert_quadrilateral_def 
    by blast
qed

(**
This is an adaptation of the proof of Martin's Theorem 23.6.
It is more complicated because Martin use the properties of the deflect of a triangle,
which are difficult to handle in our formalization.
*)

lemma similar__rah_aux:
  assumes "¬ Col A B C" and
    "A B C CongA D E F" and
    "B C A CongA E F D" and
    "C A B CongA F D E" and
    "B C A LeA A B C" and
    "D E Lt A B"
  shows "postulate_of_right_saccheri_quadrilaterals" 
proof -
  have "A  B" 
    using assms(1) col_trivial_1 by auto
  have "C  B" 
    using assms(1) col_trivial_2 by blast
  have "A  C"
    using assms(1) col_trivial_3 by blast
  have "F  E"
    using assms(2) conga_distinct by presburger
  have "D  E" 
    using assms(4) conga_diff56 by blast
  then obtain G where "A Out B G" and "Cong A G D E" 
    using segment_construction_3 A  B by blast
  have "D  F" 
    using assms(4) conga_distinct by blast
  then obtain H where "A Out C H" and "Cong A H D F" 
    using segment_construction_3 A  C by blast
  have "A G Lt A B" 
    by (meson Cong A G D E assms(6) cong2_lt__lt 
        cong_reflexivity cong_symmetry)
  have "Bet A G B" 
  proof -
    have "A Out G B" 
      by (simp add: A Out B G l6_6)
    moreover
    have "A G Le A B" 
      by (simp add: A G Lt A B lt__le)
    ultimately
    show ?thesis 
      by (meson l6_13_1)
  qed
  have "B  G" 
    using A G Lt A B not_and_lt by blast
  have "C A B CongA H A G" 
    by (meson Out_cases A Out B G A Out C H out2__conga)
  have "D F E CongA A H G  D E F CongA A G H" 
  proof -
    have "F D E CongA H A G" 
      by (meson C A B CongA H A G assms(4) 
          not_conga not_conga_sym)
    moreover
    have "Cong D F A H" 
      by (meson Cong A H D F not_cong_3412)
    moreover
    have "Cong D E A G"
      by (simp add: Cong A G D E cong_symmetry)
    ultimately
    show ?thesis 
      using F  E l11_49 by blast
  qed
  have "D E F CongA A G H" 
    using D F E CongA A H G  D E F CongA A G H by auto 
  hence "A B C CongA A G H" 
    using assms(2) conga_trans by blast
  have "E F D CongA G H A" 
    by (simp add: D F E CongA A H G  D E F CongA A G H 
        conga_comm)
  hence "B C A CongA G H A" 
    using assms(3) conga_trans by blast
  have "¬ Col A G H" 
    by (meson Out_cases A Out B G A Out C H assms(1) 
        col_out2_col not_col_permutation_2)
  have "¬ Col B G H" 
    using B  G Bet A G B ¬ Col A G H bet_col 
      col2__eq col_permutation_3 by blast
  have "G H ParStrict B C" 
  proof -
    have "B C Par G H" 
    proof -
      have "A B OS C H" 
        by (simp add: A Out C H assms(1) out_one_side)
      moreover
      have "C B A CongA H G A" 
        by (simp add: A B C CongA A G H conga_comm)
      ultimately
      show ?thesis 
        using A Out B G l12_22_b by auto
    qed
    hence "G H Par B C" 
      using par_symmetry by blast
    moreover
    have "Col B C B" 
      by (simp add: col_trivial_3)
    moreover
    have "¬ Col G H B" 
      by (simp add: ¬ Col B G H not_col_permutation_1)
    ultimately
    show ?thesis 
      using par_not_col_strict by blast
  qed
  have "¬ Col G H C" 
    by (meson G H ParStrict B C l12_6 one_side_not_col124)
  have "¬ Col B C G" 
    by (meson A Out B G B  G assms(1) col_trivial_2 
        colx not_col_permutation_5 out_col)
  have "¬ Col H B C" 
    by (metis A Out C H ¬ Col G H C assms(1) 
        col_trivial_3 colx not_col_permutation_2 out_col)
  have "H  C" 
    using ¬ Col H B C col_trivial_3 by auto
  have "G  C" 
    using ¬ Col B C G col_trivial_2 by auto
  have "H  G" 
    using ¬ Col A G H col_trivial_2 by blast
  have "A  G" 
    using ¬ Col A G H col_trivial_1 by auto
  have "H  A" 
    using ¬ Col A G H col_trivial_3 by blast
  have "C Out H A" 
  proof -
    have "Col C H A" 
      using A Out C H col_permutation_1 out_col by blast
    moreover
    have "B C OS H A" 
    proof -
      have "B C OS H G" 
        using G H ParStrict B C one_side_symmetry 
          pars__os3412 by blast
      moreover
      have "B C OS G A" 
        using B  G Bet A G B ¬ Col B C G 
          bet_out_1 out_one_side by presburger
      ultimately
      show ?thesis 
        using one_side_transitivity by blast
    qed
    hence "C B OS H A" 
      by (simp add: invert_one_side)
    ultimately
    show ?thesis 
      using col_one_side_out by force
  qed
  hence "Bet A H C"
    by (meson A Out C H between_symmetry out2__bet)
  have "SAMS B G H H C B" 
  proof -
    have "Bet B G A" 
      using Bet_cases Bet A G B by blast
    moreover
    have "H C B LeA H G A" 
    proof -
      have "B C A LeA A B C" 
        by (simp add: assms(5))
      moreover
      have "B C A CongA H C B" 
        by (metis CongA_def B C A CongA G H A 
            Bet A H C H  C bet2__out bet_out_1 
            conga_left_comm out2__conga)
      moreover
      have "A B C CongA H G A" 
        using A B C CongA A G H conga_right_comm by blast
      ultimately
      show ?thesis 
        using l11_30 by blast
    qed
    ultimately
    show ?thesis 
      using A  G B  G sams_chara by blast
  qed
  have "A G H CongA G B C" 
    by (metis out2__conga A B C CongA A G H
        B  G Bet A G B C  B 
        bet_out_1 conga_sym_equiv 
        conga_trans out_trivial)
  have "G H A CongA B C H" 
    by (metis Out_def B C A CongA G H A C Out H A 
        C  B not_bet_distincts not_conga 
        not_conga_sym out2__conga)
  have "SAMS B G H C B G" 
  proof -
    have "B G H CongA B G H" 
      using B  G H  G conga_refl by blast
    moreover
    have "H G A CongA C B G" 
      by (simp add: A G H CongA G B C conga_comm)
    moreover
    have "SAMS B G H H G A" 
      by (metis A  G B  G Bet A G B H  G 
          bet__sams between_symmetry)
    ultimately
    show ?thesis 
      by (meson conga2_sams__sams)
  qed
  have "SAMS C H G B C H" 
  proof -
    have "C H G CongA C H G" 
      using H  C H  G conga_refl by auto
    moreover
    have "SAMS C H G G H A" 
      using Bet A H C H  A H  C H  G 
        bet__sams between_symmetry by presburger
    ultimately
    show ?thesis
      by (meson G H A CongA B C H conga2_sams__sams)
  qed
  obtain I J K where "B C G C G B SumA I J K" 
    using ex_suma B  G C  B G  C by presburger
  have "C  H" 
    using H  C by auto
  then obtain L M N where "H C G C G H SumA L M N"
    using ex_suma H  G G  C by presburger
  have "L  M" 
    using H C G C G H SumA L M N suma_distincts by presburger
  have "N  M"
    using H C G C G H SumA L M N suma_distincts by blast
  have "I  J" 
    using B C G C G B SumA I J K suma_distincts by blast
  have "J  K" 
    using B C G C G B SumA I J K suma_distincts by blast
  have "I  K" 
    by (metis Par_strict_cases par_strict_not_col_4 
        B C G C G B SumA I J K G H ParStrict B C 
        col_trivial_3 ncol_suma__ncol)
  have "B  C" 
    using C  B by auto
  have "G  B"
    using B  G by auto 
  then obtain O0 P Q where "I J K G B C SumA O0 P Q"
    using ex_suma I  J J  K B  C by blast
  have "G  H" 
    using H  G by auto
  have "M  N" 
    using N  M by auto
  then obtain R S T where "L M N G H C SumA R S T"
    using ex_suma L  M M  N G  H H  C by blast
  obtain U V W where "I J K L M N SumA U V W"
    using ex_suma I  J J  K L  M M  N by blast
  have "R  S" 
    using L M N G H C SumA R S T suma_distincts by blast
  have "S  T" 
    using L M N G H C SumA R S T suma_distincts by blast
  have "O0  P" 
    using I J K G B C SumA O0 P Q suma_distincts by blast
  have "Q  P"
    using I J K G B C SumA O0 P Q suma_distincts by blast
  have "SAMS I J K L M N  H G B B C H SumA U V W"
  proof -
    have "G C TS B H" 
      by (metis Col_cases Bet A G B C Out H A 
          G H ParStrict B C ¬ Col G H C bet_out l12_6 
          l9_19_R2 l9_9 out_col par_one_or_two_sides 
          two_sides_cases)
    have "SAMS H G B B C G" 
    proof -
      have "SAMS H G B B C H" 
        by (simp add: SAMS B G H H C B sams_comm)
      moreover
      have "H G B LeA H G B" 
        using G  B H  G lea_refl by force
      moreover
      have "G InAngle B C H" 
        by (meson Par_strict_cases G C TS B H 
            G H ParStrict B C invert_two_sides 
            l12_6 os_ts__inangle)
      hence "B C G LeA B C H" 
        by (simp add: inangle__lea)
      ultimately
      show ?thesis 
        by (meson sams_lea2__sams)
    qed
    have "C  G" 
      using G  C by auto
    then obtain X Y Z where "B C G H G B SumA X Y Z"
      using ex_suma B  C H  G G  B by blast
    have "B G C C G H SumA H G B"
      by (meson G C TS B H suma_right_comm ts__suma_1)
    have "B G OS C H" 
      by (meson Col_perm A Out B G A Out C H 
          ¬ Col B C G one_side_reflexivity one_side_symmetry 
          os_out_os out_col)
    hence "SAMS B G C C G H" 
      by (simp add: G C TS B H os_ts__sams)
    have "SAMS I J K C G H" 
    proof -
      have "SAMS B C G C G B" 
        using C  B G  B G  C sams123231 by auto
      moreover
      have "SAMS C G B C G H" 
        by (simp add: SAMS B G C C G H sams_left_comm)
      moreover
      have "C G B C G H SumA H G B"
        using B G C C G H SumA H G B suma_left_comm by blast
      moreover
      have "SAMS B C G H G B" 
        by (simp add: SAMS H G B B C G sams_sym)
      ultimately
      show ?thesis
        using B C G C G B SumA I J K sams_assoc by blast
    qed
    have "I J K C G H SumA X Y Z" 
    proof -
      have "SAMS B C G C G B" 
        using C  B G  B G  C sams123231 by auto
      moreover
      have "SAMS C G B C G H" 
        by (simp add: SAMS B G C C G H sams_left_comm)
      moreover
      have "C G B C G H SumA H G B" 
        using B G C C G H SumA H G B suma_left_comm by blast
      ultimately
      show ?thesis 
        using B C G C G B SumA I J K B C G H G B SumA X Y Z 
          suma_assoc by blast
    qed
    have "SAMS B C G H C G" 
      by (meson pars__os3412 G C TS B H G H ParStrict B C 
          invert_two_sides os_ts__sams sams_right_comm)
    have "B C G H C G SumA H C B" 
      by (meson G C TS B H suma_middle_comm 
          suma_right_comm ts__suma)
    have "SAMS I J K L M N" 
    proof -
      have "SAMS X Y Z H C G" 
      proof -
        have "H G B B C G SumA X Y Z"
          by (simp add: B C G H G B SumA X Y Z suma_sym)
        moreover
        have "SAMS H G B H C B" 
          by (simp add: SAMS B G H H C B sams_left_comm)
        ultimately
        show ?thesis 
          by (meson SAMS H G B B C G SAMS B C G H C G 
              B C G H C G SumA H C B sams_assoc)
      qed
      have "SAMS C G H H C G" 
        by (simp add: G  C H  C H  G sams123231 sams_comm)
      moreover
      have "C G H H C G SumA L M N" 
        by (meson H C G C G H SumA L M N suma_sym)
      ultimately
      show ?thesis 
        using SAMS I J K C G H I J K C G H SumA X Y Z 
          SAMS X Y Z H C G sams_assoc_1 by blast
    qed
    moreover
    have "H G B B C H SumA U V W" 
    proof -
      have "X Y Z H C G SumA U V W" 
      proof -
        have "SAMS C G H H C G" 
          by (simp add: G  C H  C H  G 
              sams123231 sams_comm)
        moreover
        have "C G H H C G SumA L M N" 
          by (simp add: H C G C G H SumA L M N suma_sym)
        ultimately
        show ?thesis 
          using SAMS I J K C G H I J K C G H SumA X Y Z 
            I J K L M N SumA U V W suma_assoc by blast
      qed
      moreover
      have "H G B B C G SumA X Y Z" 
        by (simp add: B C G H G B SumA X Y Z suma_sym)
      moreover
      have "B C G H C G SumA B C H"
        by (simp add: B C G H C G SumA H C B suma_right_comm)
      ultimately
      show ?thesis 
        using SAMS H G B B C G SAMS B C G H C G 
          suma_assoc by blast
    qed
    ultimately
    show ?thesis by blast
  qed
  hence "SAMS I J K L M N" 
    by simp
  have "H G B B C H SumA U V W" 
    using SAMS I J K L M N  H G B B C H SumA U V W by simp
  {
    fix A' B' C' D'
    assume "Saccheri A' B' C' D'"
    {
      assume "hypothesis_of_acute_saccheri_quadrilaterals"
      have "U V W LtA U V W" 
      proof -
        have "¬ Col C G B" 
          using Col_cases ¬ Col B C G by blast
        hence "SAMS I J K G B C  ¬ Bet O0 P Q" 
          using B C G C G B SumA I J K I J K G B C SumA O0 P Q 
            t22_14__sams_nbet 
            hypothesis_of_acute_saccheri_quadrilaterals by blast
        have "I J K LtA H G B" 
        proof -
          have "G B C LeA G B C"
            by (simp add: C  B G  B lea_refl)
          moreover
          have "O0 P Q LtA A G B" 
          proof -
            have "O0 P Q LeA A G B" 
              using A  G Bet A G B G  B O0  P 
                Q  P l11_31_2 by force
            moreover
            {
              assume "O0 P Q CongA A G B"
              hence "Bet O0 P Q" 
                using Bet A G B bet_lea__bet conga__lea456123 by blast
              hence False 
                using SAMS I J K G B C  ¬ Bet O0 P Q by blast
            }
            hence "¬ O0 P Q CongA A G B" 
              by auto
            ultimately
            show ?thesis 
              by (simp add: LtA_def)
          qed
          moreover
          have "SAMS I J K G B C"
            by (simp add: SAMS I J K G B C  ¬ Bet O0 P Q)
          moreover
          have "I J K G B C SumA O0 P Q" 
            by (simp add: I J K G B C SumA O0 P Q)
          moreover
          have "H G B G B C SumA A G B" 
          proof -
            have "B G H H G A SumA A G B" 
              by (metis A Out B G Bet A G B G  B 
                  H  G bet__suma between_symmetry l6_3_1 
                  suma_right_comm)
            moreover
            have "B G H CongA H G B" 
              using G  B H  G conga_pseudo_refl by auto
            moreover
            have "H G A CongA G B C" 
              by (simp add: A G H CongA G B C conga_left_comm)
            moreover
            have "A G B CongA A G B" 
              using A  G G  B conga_refl by auto
            ultimately
            show ?thesis 
              by (meson conga3_suma__suma)
          qed
          ultimately
          show ?thesis 
            by (meson sams_lea_lta789_suma2__lta123)
        qed
        moreover
        have "¬ Col C G H" 
          by (meson Col_perm ¬ Col G H C)
        hence "SAMS L M N G H C  ¬ Bet R S T"
          using H C G C G H SumA L M N L M N G H C SumA R S T
            t22_14__sams_nbet hypothesis_of_acute_saccheri_quadrilaterals
          by blast
        have "L M N LtA B C H" 
        proof -
          have "G H C LeA G H C" 
            using H  C H  G lea_refl by auto
          moreover
          have "R S T LtA A H C" 
          proof -
            have "R S T LeA A H C" 
              using Bet A H C H  A H  C R  S 
                S  T l11_31_2 by auto
            moreover
            {
              assume "R S T CongA A H C" 
              have "Bet R S T" 
              proof -
                have "Bet A H C" 
                  by (simp add: Bet A H C)
                moreover
                have "A H C CongA R S T" 
                  using R S T CongA A H C conga_sym_equiv by blast
                moreover
                have "B C H G H C SumA A H C" 
                proof -
                  have "A H G G H C SumA A H C" 
                    using H  A H  C H  G 
                      bet__suma calculation(1) by force
                  moreover
                  have "A H G CongA B C H" 
                    by (simp add: G H A CongA B C H conga_left_comm)
                  moreover
                  have "G H C CongA G H C" 
                    using H  C H  G conga_refl by auto
                  moreover
                  have "A H C CongA A H C" 
                    using H  A H  C conga_refl by auto
                  ultimately
                  show ?thesis 
                    by (meson conga3_suma__suma)
                qed
                ultimately
                show ?thesis 
                  using bet_conga__bet by blast
              qed
              hence False 
                using SAMS L M N G H C  ¬ Bet R S T by auto
            }
            hence "¬ R S T CongA A H C" 
              by auto
            ultimately
            show ?thesis 
              using LtA_def by blast
          qed
          moreover
          have "SAMS L M N G H C" 
            by (simp add: SAMS L M N G H C  ¬ Bet R S T)
          moreover
          have "L M N G H C SumA R S T" 
            using L M N G H C SumA R S T by auto
          moreover
          have "B C H G H C SumA A H C"  
          proof -
            have "A H G G H C SumA A H C" 
              using H  A H  C H  G 
                bet__suma calculation(1) Bet A H C by auto
            moreover
            have "A H G CongA B C H" 
              by (simp add: G H A CongA B C H conga_left_comm)
            moreover
            have "G H C CongA G H C" 
              using H  C H  G conga_refl by auto
            moreover
            have "A H C CongA A H C" 
              using H  A H  C conga_refl by auto
            ultimately
            show ?thesis 
              by (meson conga3_suma__suma)
          qed
          ultimately
          show ?thesis 
            by (meson sams_lea_lta789_suma2__lta123)
        qed
        moreover
        have "SAMS H G B B C H" 
          by (simp add: SAMS B G H H C B sams_comm)
        ultimately
        show ?thesis 
          by (meson  I J K L M N SumA U V W 
              H G B B C H SumA U V W lta__lea 
              sams_lea_lta456_suma2__lta)
      qed
      hence False 
        by (simp add: nlta)
      hence "Per A' B' C'" 
        by simp
    }
    moreover
    {
      assume "hypothesis_of_right_saccheri_quadrilaterals"
      hence "Per A' B' C'" 
        using Saccheri A' B' C' D' 
          hypothesis_of_right_saccheri_quadrilaterals_def
        by blast
    }
    moreover
    {
      assume "hypothesis_of_obtuse_saccheri_quadrilaterals"
      have "U V W LtA U V W" 
      proof -
        have "H G B LtA I J K" 
        proof -
          {
            assume  "I J K LeA H G B" 
            have False 
            proof -
              have "¬ Col C G B" 
                using ¬ Col B C G col_permutation_2 by blast
              moreover
              have "B C G C G B SumA I J K" 
                by (simp add: B C G C G B SumA I J K)
              moreover
              have "SAMS I J K G B C" 
              proof -
                have "SAMS H G B G B C" 
                  by (simp add: SAMS B G H C B G sams_comm)
                moreover
                have "G B C LeA G B C"
                  using C  B G  B lea_refl by blast
                ultimately
                show ?thesis 
                  using I J K LeA H G B sams_lea2__sams by blast
              qed
              ultimately show ?thesis 
                using t22_14__nsams 
                  HypothesisObtuseSaccheriQuadrilaterals 
                by blast
            qed
          }
          hence "¬ I J K LeA H G B" 
            by auto
          thus ?thesis
            using G  B H  G I  J J  K nlea__lta by blast
        qed
        moreover
        {
          assume "L M N LeA B C H"
          have False 
          proof -
            have "¬ Col C G H"
              using ¬ Col G H C col_permutation_1 by blast
            moreover
            have "H C G C G H SumA L M N" 
              by (simp add: H C G C G H SumA L M N)
            moreover
            have "SAMS L M N G H C" 
            proof -
              have "SAMS B C H G H C" 
                by (meson SAMS C H G B C H sams_right_comm sams_sym)
              moreover
              have "G H C LeA G H C" 
                using H  C H  G lea_refl by auto
              ultimately
              show ?thesis 
                using  L M N LeA B C H sams_lea2__sams by blast
            qed
            ultimately
            show ?thesis
              using HypothesisObtuseSaccheriQuadrilaterals 
                t22_14__nsams by blast
          qed
        }
        hence "¬ L M N LeA B C H" 
          by auto
        hence "B C H LtA L M N" 
          using C  B H  C L  M N  M nlta__lea by blast
        ultimately
        show ?thesis 
          by (meson SAMS I J K L M N H G B B C H SumA U V W
              I J K L M N SumA U V W lta__lea 
              sams_lea_lta456_suma2__lta)
      qed
      hence "Per A' B' C'" 
        by (simp add: nlta)
    }
    ultimately
    have "Per A' B' C'" 
      using saccheri_s_three_hypotheses by blast
  }
  thus ?thesis 
    using postulate_of_right_saccheri_quadrilaterals_def by blast
qed

lemma similar__rah:
  assumes "postulate_of_existence_of_similar_triangles"
  shows "postulate_of_right_saccheri_quadrilaterals"
proof -
  obtain A B C D E F where
    "¬ Col A B C" and
    "¬ Cong A B D E" and
    "A B C CongA D E F" and
    "B C A CongA E F D" and
    "C A B CongA F D E" 
    using assms postulate_of_existence_of_similar_triangles_def by blast
  have "A  B" 
    using ¬ Col A B C col_trivial_1 by blast
  have "C  B" 
    using ¬ Col A B C col_trivial_2 by force
  have "A  C" 
    using ¬ Col A B C col_trivial_3 by blast
  have "D  F" 
    using B C A CongA E F D conga_diff56 by blast
  have "E  F" 
    using A B C CongA D E F conga_diff56 by blast
  have "D  E" 
    using C A B CongA F D E conga_distinct by blast
  {
    assume "B C A LeA A B C"
    {
      assume "D E Le A B"
      hence "D E Lt A B" 
        using ¬ Cong A B D E le_anti_symmetry nle__lt by blast
      hence "postulate_of_right_saccheri_quadrilaterals" 
        using ¬ Col A B C  A B C CongA D E F 
          B C A CongA E F D C A B CongA F D E B C A LeA A B C 
          similar__rah_aux by blast
    }
    moreover
    {
      assume "A B Le D E"
      hence "A B Lt D E" 
        by (simp add: Lt_def ¬ Cong A B D E)
      moreover
      have "¬ Col D E F" 
        using ¬ Col A B C A B C CongA D E F ncol_conga_ncol by blast
      moreover
      have "E F D LeA D E F" 
        using B C A LeA A B C B C A CongA E F D 
          A B C CongA D E F l11_30 by blast
      moreover
      have "D E F CongA A B C" 
        using A B C CongA D E F conga_sym by blast
      moreover
      have "E F D CongA B C A" 
        by (simp add: B C A CongA E F D conga_sym)
      moreover
      have "F D E CongA C A B" 
        by (simp add: C A B CongA F D E conga_sym)
      ultimately
      have "postulate_of_right_saccheri_quadrilaterals" 
        using similar__rah_aux by blast
    }
    ultimately
    have "postulate_of_right_saccheri_quadrilaterals"
      using local.le_cases by blast
  }
  moreover
  {
    assume "A B C LeA B C A"
    {
      assume "D F Le A C"
      {
        assume "Cong D F A C"
        have False 
        proof -
          have "¬ Col A C B" 
            using Col_cases ¬ Col A B C by blast
          moreover
          have "A C B CongA D F E" 
            using B C A CongA E F D conga_comm by blast
          moreover
          have "Cong A C D F" 
            using Cong_cases Cong D F A C by blast
          ultimately
          show ?thesis 
            using C A B CongA F D E ¬ Cong A B D E 
              l11_50_1 by blast
        qed
      }
      hence "D F Lt A C" 
        using Lt_def D F Le A C by blast
      moreover
      have "¬ Col A C B" 
        using Col_cases ¬ Col A B C by blast
      moreover
      have "A C B CongA D F E" 
        by (simp add: B C A CongA E F D conga_comm)
      moreover
      have "C B A CongA F E D" 
        by (simp add: A B C CongA D E F conga_comm)
      moreover
      have "B A C CongA E D F" 
        by (meson C A B CongA F D E conga_comm)
      moreover
      have "C B A LeA A C B" 
        by (simp add: A B C LeA B C A lea_comm)
      ultimately
      have "postulate_of_right_saccheri_quadrilaterals" 
        using similar__rah_aux by blast
    }
    moreover
    {
      assume "A C Le D F"
      have "¬ Col D F E" 
      proof -
        have "¬ Col A C B" 
          using Col_cases ¬ Col A B C by blast
        moreover
        have "A C B CongA D F E" 
          using B C A CongA E F D conga_comm by blast
        ultimately
        show ?thesis 
          using ncol_conga_ncol by blast
      qed
      moreover
      have "D F E CongA A C B" 
        by (meson B C A CongA E F D conga_comm conga_sym)
      moreover
      have "F E D CongA C B A" 
        by (meson A B C CongA D E F conga_comm conga_sym)
      moreover
      have "E D F CongA B A C" 
        by (meson C A B CongA F D E conga_comm conga_sym)
      moreover
      have "F E D LeA D F E" 
      proof -
        have "A B C LeA B C A" 
          by (simp add: A B C LeA B C A)
        moreover
        have "A B C CongA F E D" 
          by (simp add: A B C CongA D E F conga_right_comm)
        moreover
        have "B C A CongA D F E"
          by (simp add: B C A CongA E F D conga_right_comm)
        ultimately
        show ?thesis 
          using l11_30 by blast
      qed
      moreover
      {
        assume "Cong A C D F"
        have "¬ Col A C B" 
          using Col_cases ¬ Col A B C by auto
        moreover
        have "A C B CongA D F E" 
          by (simp add: B C A CongA E F D conga_comm)
        ultimately
        have False 
          using Cong A C D F ¬ Cong A B D E  
            C A B CongA F D E l11_50_1 by blast
      }
      hence "A C Lt D F" 
        using Lt_def A C Le D F by blast
      ultimately
      have "postulate_of_right_saccheri_quadrilaterals" 
        using similar__rah_aux by blast
    }
    ultimately
    have  "postulate_of_right_saccheri_quadrilaterals"
      using local.le_cases by blast
  }
  ultimately
  show ?thesis 
    by (metis A  B A  C C  B lea_total)
qed

lemma impossible_case_5:
  shows " P Q R S U I.
            ¬ (BetS Q U R  ¬ Col P Q S  
               ¬ Col P R U  P R Par Q S  
               Bet S Q I  Bet U I P)"
proof -
  {
    fix P Q R S U I
    assume 1: "BetS Q U R" and
      2: "¬ Col P Q S" and
      3: "¬ Col P R U" and
      4: "P R Par Q S" and
      5: "Bet S Q I" and
      6: "Bet U I P"
    have "Bet Q U R"
      by (simp add: "1" BetSEq)
    have "Q  U" 
      using "1" BetSEq by blast
    have "Q  R" 
      using "1" BetSEq by blast
    have "R  U" 
      using "1" BetSEq by blast
    have "Q S Par P R" 
      by (simp add: "4" par_symmetry)
    have "Q S ParStrict P R" 
      using "2" "4" Par_def par_strict_symmetry by blast
    have "Q S OS R U" 
      by (metis "4" Bet Q U R Q S ParStrict P R 
          Q  U bet2__out col_trivial_2 invert_one_side 
          l5_1 l9_19_R2 not_strict_par par_right_comm 
          par_strict_not_col_3)
    have False 
    proof -
      have "Q S TS P U" 
        by (metis "2" "5" "6" NCol_perm Q S OS R U 
            bet_col between_symmetry col124__nos l9_18)
      moreover
      have "Q S OS P U" 
        by (metis Bet Q U R Q S ParStrict P R 
            Q  R Q  U bet2__out l12_6 l5_1 
            out_out_one_side)
      ultimately
      show ?thesis 
        using l9_9_bis by blast
    qed
  }
  thus ?thesis by blast
qed

lemma impossible_case_6:
  shows " P Q R S U I.
             ¬ (BetS Q U R  ¬ Col P Q S  
                P S Par Q R  Bet S Q I  Bet I P U)"
proof -
  {
    fix P Q R S U I
    assume 1: "BetS Q U R" and
      2: "¬ Col P Q S" and
      3: "P S Par Q R" and
      4: "Bet S Q I" and
      5: "Bet I P U"
    have "Bet Q U R"
      by (simp add: "1" BetSEq)
    have "Q  U" 
      using "1" BetSEq by blast
    have "Q  R" 
      using "1" BetSEq by blast
    have "R  U" 
      using "1" BetSEq by blast
    have "Bet U P I" 
      using "5" Bet_cases by blast
    then obtain J where "Bet Q J U" and "Bet P J S" 
      using "4" inner_pasch by blast
    have "P S ParStrict Q U" 
    proof -
      have "P S ParStrict Q R" 
        using "2" "3" Col_cases col_trivial_3 par_not_col_strict by blast
      moreover
      have "Col Q R U" 
        by (simp add: Bet Q U R bet_col col_permutation_5)
      ultimately
      show ?thesis 
        by (meson Q  U par_strict_col_par_strict)
    qed
    hence False 
      using "4" "5" impossible_case_1 par_strict_right_comm by blast
  }
  thus ?thesis 
    by blast
qed

lemma impossible_case_7:
  shows " P Q R S U I.
            ¬ (BetS Q U R  ¬ Col P Q S  
               ¬ Col P R U  P R Par Q S  
               P S Par Q R  Col P U I  Bet Q I S)"
proof -
  {
    fix P Q R S U I
    assume 1:"BetS Q U R" and
      2: "¬ Col P Q S" and
      3: "¬ Col P R U" and
      4: "P R Par Q S" and
      5: "P S Par Q R" and
      6: "Col P U I" and
      7: "Bet Q I S"
    have "Bet Q U R"
      by (simp add: "1" BetSEq)
    have "Q  U" 
      using "1" BetSEq by blast
    have "Q  R" 
      using "1" BetSEq by blast
    have "R  U" 
      using "1" BetSEq by blast
    have "Bet R U Q" 
      using Bet_cases Bet Q U R by auto
    have "P U OS Q S"  
    proof -
      have "P U TS Q R" 
        by (metis "3" Bet Q U R Q  U bet_col 
            col_permutation_2 col_transitivity_1 
            col_trivial_2 l9_18_R2)
      moreover
      have "P U TS S R" 
      proof -
        have "P S OS R Q" 
        proof -
          have "P S Par R Q"
            by (simp add: "5" par_right_comm)
          moreover
          have "Col R Q Q" 
            by (simp add: col_trivial_2)
          moreover
          have "¬ Col P S Q" 
            by (simp add: "2" not_col_permutation_5)
          ultimately
          show ?thesis 
            using par_not_col_strict par_strict_symmetry 
              pars__os3412 by blast
        qed
        hence "P S OS U R" 
          using Bet R U Q l9_17 one_side_symmetry by blast
        moreover
        have "P R OS U S" 
        proof -
          have "P R OS U Q" 
            by (metis "3" Bet R U Q bet_out col_trivial_2 l9_19_R2)
          moreover
          have "P R OS Q S" 
            by (meson "2" "4" col_trivial_3 
                not_col_permutation_1 par_not_col_strict 
                par_symmetry pars__os3412)
          ultimately
          show ?thesis
            using one_side_transitivity by blast
        qed
        ultimately
        show ?thesis 
          by (simp add: l9_31)
      qed
      ultimately
      show ?thesis 
        using l9_8_1 by blast
    qed
    hence "P U OS Q I" 
      using "7" l9_17 by blast
    hence False 
      using "6" one_side_not_col124 by auto
  }
  thus ?thesis by blast
qed

lemma impossible_case_8:
  shows " P Q R S U I. 
             ¬ (BetS Q U R  ¬ Col P Q S  
                P R Par Q S  P S Par Q R  
                Col P U I  Bet I S Q)"
proof -
  {
    fix P Q R S U I
    assume 1: "BetS Q U R" and
      2: "¬ Col P Q S" and
      3: "P R Par Q S" and
      4: "P S Par Q R" and
      5: "Col P U I" and
      6: "Bet I S Q"
    have "Bet Q U R"
      by (simp add: "1" BetSEq)
    have "Q  U" 
      using "1" BetSEq by blast
    have "Q  R" 
      using "1" BetSEq by blast
    have "R  U" 
      using "1" BetSEq by blast
    have "P S ParStrict Q U"
    proof - 
      have "P S ParStrict Q R" 
        using "2" "4" Col_cases col_trivial_3 
          par_not_col_strict by blast
      moreover
      have "Col Q R U" 
        using Col_perm Bet Q U R bet_col by blast
      ultimately
      show ?thesis 
        by (meson Q  U par_strict_col_par_strict)
    qed
    have "Bet Q S I" 
      using "6" Bet_cases by auto
    {
      assume "Bet P U I" 
      hence False 
        by (meson Par_strict_cases Bet Q S I 
            P S ParStrict Q U between_symmetry impossible_case_1)
    }
    moreover
    {
      assume "Bet U I P" 
      then obtain J where "Bet U J Q" and "Bet P S J" 
        using Bet Q S I outer_pasch by blast
      hence False 
        by (metis Bet Q U R P S ParStrict Q U 
            bet_col bet_col1 between_symmetry l12_6 l5_3 
            l9_19 not_bet_and_out)
    }
    moreover
    {
      assume "Bet I P U" 
      then obtain J where "Bet Q J I  Bet R P J" 
        using Bet Q U R outer_pasch by blast
      have "P R ParStrict Q I" 
        using "2" "3" Par_def Bet Q S I bet_col
          bet_neq32__neq col2__eq 
          par_strict_col2_par_strict by blast
      hence False 
        by (meson "3" Bet Q J I  Bet R P J 
            Bet Q S I bet_col bet_col1 inter_uniqueness_not_par
            par_left_comm par_strict_comm par_strict_not_col_4)
    }
    ultimately
    have False 
      using "5" Col_def by blast
  }
  thus ?thesis 
    by blast
qed

lemma strong_parallel_postulate_implies_tarski_s_euclid_aux:
  assumes "strong_parallel_postulate" and
    "A  B" and
    "A  D" and
    "A  T" and
    "B  D" and
    "B  T" and
    "D  T" and
    "¬ Col A B T" and
    "Bet A D T"
  shows " B' B'' MB X. 
                (Bet A B X  T X ParStrict B D  
                 BetS B MB T  BetS B' MB B'' 
                 Cong B MB T MB  Cong B' MB B'' MB  
                 Col B B' D  Bet B'' T X  
                 B  B'  B''  T)"
proof -
  obtain B' where "B Midpoint D B'" 
    using symmetric_point_construction by blast
  have "D  B'" 
    using B Midpoint D B' assms(5) l7_3 by blast
  have "B  B'" 
    using B Midpoint D B' D  B' midpoint_not_midpoint by blast
  moreover
  have "Bet D B B'" 
    by (simp add: B Midpoint D B' midpoint_bet)
  have "Cong D B B B'" 
    using B Midpoint D B' midpoint_cong by auto
  have "Bet T D A" 
    using Bet_cases assms(9) by blast
  have "Bet B' B D" 
    using Bet_cases Bet D B B' by blast
  obtain MB where "MB Midpoint B T" 
    using midpoint_existence by blast
  hence "BetS B MB T" 
    by (metis BetS_def assms(6) midpoint_bet midpoint_distinct_1)
  moreover
  have "Cong B MB T MB" 
    using Midpoint_def MB Midpoint B T not_cong_1243 by blast
  moreover
  have "MB  B" 
    using MB Midpoint B T assms(6) is_midpoint_id by blast
  have "MB  T" 
    using BetSEq calculation(2) by blast
  obtain B'' where "MB Midpoint B' B''" 
    using symmetric_point_construction by blast
  have "MB  B'" 
    using Bet D B B' MB Midpoint B T assms(8) assms(9) 
      bet_col between_exchange2 calculation(1) midpoint_bet 
      outer_transitivity_between by blast
  hence "BetS B' MB B''" 
    by (metis BetS_def MB Midpoint B' B'' midpoint_bet 
        midpoint_not_midpoint)
  hence "B'  B''" 
    using BetSEq by blast
  have "MB  B''" 
    using BetSEq BetS B' MB B'' by blast
  have "Cong B' MB B'' MB" 
    using Midpoint_def MB Midpoint B' B'' 
      cong_right_commutativity by blast
  moreover
  have "¬ Col B T B'" 
    by (metis Inter_def Bet D B B' assms(7) 
        assms(8) assms(9) bet_col calculation(1) 
        col_trivial_3 inter_trivial 
        l6_21 not_col_permutation_5)
  obtain B''' where "Bet T B''' B'" and "Bet A B B'''" 
    using Bet B' B D Bet T D A outer_pasch by blast
  have "B'  B'''" 
    by (metis Bet A B B''' Bet B' B D ¬ Col B T B' 
        assms(3) assms(9) bet_col bet_out_1 
        col_permutation_1 colx out_col)
  have "B'''  T" 
    using Bet A B B''' assms(8) bet_col by blast
  hence "BetS T B''' B'" 
    using BetS_def B'  B''' Bet T B''' B' by presburger
  have "¬ Col B B' B'''" 
    by (meson Col_perm B'  B''' Bet T B''' B' 
        ¬ Col B T B' bet_col col2__eq)
  have "Coplanar B T B' B'''" 
    by (meson Bet T B''' B' bet_col col__coplanar ncoplanar_perm_11)
  hence " X. (Col B'' T X  Col B B''' X)"
    using assms(1) calculation(2) BetS B' MB B'' 
      ¬ Col B B' B''' Cong B MB T MB Cong B' MB B'' MB 
      strong_parallel_postulate_def by blast
  then obtain X where "Col B'' T X" and "Col B B''' X" 
    by blast
  have "B B' Par T B''" 
    using l12_17 calculation(1) MB Midpoint B T 
      MB Midpoint B' B'' by blast
  have "B  B''" 
    using B B' Par T B'' ¬ Col B T B' par_id_3
      par_right_comm by blast
  hence "B B'' Par T B'" 
    using l12_17 
    by (meson MB Midpoint B T MB Midpoint B' B'' mid_par_cong2)
  {
    assume "Bet B'' T X"
    {
      assume "Bet B B''' X"
      hence "BetS B'' T X" 
        by (metis BetS_def B B' Par T B'' Bet A B B''' 
            Bet B' B D Bet B'' T X ¬ Col B B' B''' assms(8) 
            bet_col bet_col1 not_col_permutation_4
            outer_transitivity_between par_distincts)
      have "BetS B B''' X" 
        by (metis BetS_def B B' Par T B'' Bet B B''' X 
            Bet T B''' B' BetS B'' T X ¬ Col B B' B''' 
            ¬ Col B T B' bet_col col_permutation_5 not_col_distincts 
            not_strict_par outer_transitivity_between par_right_comm)
      have "B''  T"
        using BetSEq BetS B'' T X by blast
      have "T  X" 
        using BetSEq BetS B'' T X by blast
      have ?thesis 
      proof -
        have "Bet A B X" 
          using BetSEq Bet A B B''' BetS B B''' X 
            outer_transitivity_between by blast
        moreover
        have "T X ParStrict B D"
        proof -
          have "T X ParStrict B B'" 
          proof -
            have "B B' ParStrict T B''" 
              by (metis Par_def B B' Par T B'' ¬ Col B T B' 
                  not_col_distincts par_col2_par_bis par_id_3)
            moreover
            have "Col T B'' X" 
              using Col_cases Col B'' T X by blast
            ultimately
            show ?thesis 
              by (meson T  X par_strict_col_par_strict 
                  par_strict_symmetry)
          qed
          moreover
          have "Col B B' D" 
            by (simp add: Col_def Bet D B B')
          ultimately
          show ?thesis 
            using assms(5) par_strict_col_par_strict by blast
        qed
        moreover
        have "Col B B' D" 
          by (simp add: Col_def Bet D B B')
        ultimately
        show ?thesis 
          using Bet B'' T X Cong B' MB B'' MB B  B'
            B''  T BetS B MB T BetS B' MB B'' 
            Cong B MB T MB by blast
      qed
    }
    moreover
    {
      assume "Bet B''' X B"
      have "¬ Col B T B''" 
        by (meson B B' Par T B'' ¬ Col B T B' assms(6) 
            col_trivial_2 par_col2_par_bis par_id_3)
      hence False
        using impossible_case_5 BetS T B''' B' ¬ Col B B' B''' 
          B B' Par T B'' Bet B'' T X Bet B''' X B by blast
      hence ?thesis
        by blast
    }
    moreover
    {
      assume "Bet X B B'''"
      have "¬ Col B T B''" 
        using B B' Par T B'' ¬ Col B T B' assms(6) 
          col_trivial_2 par_col2_par_bis par_id_3 by blast
      hence ?thesis 
        using impossible_case_6 BetS T B''' B' B B'' Par T B' 
          Bet B'' T X Bet X B B''' by blast
    }
    ultimately
    have ?thesis 
      using Bet_perm Col B B''' X third_point by blast
  }
  moreover
  {
    assume "Bet T X B''"
    have "¬ Col B T B''" 
      by (meson B B' Par T B'' ¬ Col B T B' assms(6) 
          col_trivial_2 par_col2_par_bis par_id_3)
    hence ?thesis 
      using impossible_case_7 BetS T B''' B' ¬ Col B B' B'''
        B B' Par T B'' B B'' Par T B' Col B B''' X 
        Bet T X B'' by blast
  }
  moreover 
  {
    assume "Bet X B'' T"
    have "¬ Col B T B''" 
      by (meson B B' Par T B'' ¬ Col B T B' assms(6) 
          col_trivial_2 par_col2_par_bis par_id_3)
    hence ?thesis 
      using impossible_case_8 BetS T B''' B' B B' Par T B''
        B B'' Par T B' Bet X B'' T Col B B''' X by blast
  }
  ultimately
  show ?thesis 
    using Bet_perm Col B'' T X third_point by blast
qed

lemma strong_parallel_postulate_implies_tarski_s_euclid :
  assumes "strong_parallel_postulate"
  shows "tarski_s_parallel_postulate"
proof -
  {
    fix A' B' C' D' T'
    assume 1: "Bet A' D' T'" and
      2: "Bet B' D' C'" and
      3: "A'  D'"
    {
      fix A B C D T
      assume H1: "A  B" and
        H2: "A  C" and
        H3: "A  D" and 
        H4: "A  T" and
        H5: "B  C" and
        H6: "B  D" and
        H7: "B  T" and
        H8: "C  D" and
        H9: "C  T" and
        H10: "D  T" and
        H11: "¬ Col A B C" and
        H12: "Bet A D T" and
        H13: "Bet B D C" and
        H14: "¬ Col B C T" 
      have "¬ Col A B T"
        by (meson H11 H12 H13 H3 H6 between_trivial2 
            impossible_case_2)
      moreover
      have "¬ Col A C T" 
        using H11 H12 H13 H3 H8 between_trivial 
          impossible_two_sides_not_col by blast
      ultimately
      have " B' B'' MB X. 
                (Bet A B X  T X ParStrict B D  
                 BetS B MB T  BetS B' MB B'' 
                 Cong B MB T MB  Cong B' MB B'' MB  
                 Col B B' D  Bet B'' T X  
                 B  B'  B''  T)"
        using assms strong_parallel_postulate_implies_tarski_s_euclid_aux 
          H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 by blast
      then obtain B' B'' MB X where "Bet A B X" and
        "T X ParStrict B D" and
        "BetS B MB T" and
        "BetS B' MB B''" and
        "Cong B MB T MB" and
        "Cong B' MB B'' MB" and
        "Col B B' D" and
        "Bet B'' T X" and
        "B  B'" and
        "B''  T"
        by auto
      have "¬ Col A B T"
        by (meson H11 H12 H13 H3 H6 between_trivial2 impossible_case_2)
      moreover
      have "¬ Col A C T" 
        using H11 H12 H13 H3 H8 between_trivial 
          impossible_two_sides_not_col by blast
      ultimately
      have " B' B'' MB X. 
                  (Bet A C X  T X ParStrict C D  
                   BetS C MB T  BetS B' MB B'' 
                   Cong C MB T MB  Cong B' MB B'' MB  
                   Col C B' D  Bet B'' T X  
                   C  B'  B''  T)"
        using assms strong_parallel_postulate_implies_tarski_s_euclid_aux 
          H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 by blast
      then obtain B9' B9'' MB9 Y where "Bet A C Y" and
        "T Y ParStrict C D" and
        "BetS C MB9 T" and
        "BetS B9' MB9 B9''" and
        "Cong C MB9 T MB9" and
        "Cong B9' MB9 B9'' MB9" and
        "Col C B9' D" and
        "Bet B9'' T Y" and
        "C  B9'" and
        "B9''  T"
        by auto
      have "Bet X T Y" 
      proof (cases "Col X T Y")
        case True
        have "¬ Col A B C" 
          by (simp add: H11) 
        {
          assume "Col A X Y"
          hence False 
            by (metis H1 H11 Bet A B X Bet A C Y 
                bet_col bet_neq12__neq 
                col_trivial_3 
                not_par_inter_uniqueness par_id)
        }
        hence "¬ Col A X Y" 
          by blast
        have "Bet Y C A" 
          using Bet A C Y between_symmetry by blast
        then obtain U where "Bet Y U B" and "Bet A D U" 
          using H13 outer_pasch by blast
        have "Bet X B A" 
          by (meson Bet_perm Bet A B X)
        then obtain V where "Bet X V Y" and "Bet A U V" 
          using Bet Y U B outer_pasch by blast
        have "T = V" 
        proof -
          have "¬  Col X Y A" 
            using Col_cases ¬ Col A X Y by blast
          moreover
          have "A  D" 
            by (simp add: H3)
          moreover
          have "Col X Y T" 
            using True not_col_permutation_5 by blast
          moreover
          have "Col X Y V" 
            using Bet X V Y bet_col col_permutation_5 by blast
          moreover
          have "Col A D T" 
            by (simp add: Col_def H12)
          moreover
          have "Col A D V" 
            by (meson Bet A D U Bet A U V bet_col 
                between_exchange4)
          ultimately
          show ?thesis 
            using l6_21 by blast
        qed
        thus ?thesis 
          by (simp add: Bet X V Y)
      next
        case False 
        hence "¬ Col X T Y"
          by simp
        have "¬ Col T B'' Y" 
          by (meson False B''  T Bet B'' T X bet_col 
              col_transitivity_2 not_col_permutation_4)
        have "T Y ParStrict C B" 
          by (metis H13 H5 T Y ParStrict C D bet_col 
              between_symmetry col_trivial_3 par_strict_col2_par_strict)
        have "T X ParStrict B C"
          by (meson H13 H5 T X ParStrict B D bet_col 
              par_strict_col_par_strict)
        have "X  T"
          using False col_trivial_1 by auto
        have "Y  T" 
          using False col_trivial_2 by blast
        have "X  Y" 
          using False col_trivial_3 by force
        have "Coplanar T B B'' Y" 
        proof -
          have "Coplanar B Y T X" 
          proof -
            have "¬ Col C B T" 
              using Col_cases H14 by blast
            moreover
            have "Coplanar C B T X" 
              using T X ParStrict B C ncoplanar_perm_17 
                pars__coplanar by blast
            moreover
            have "Coplanar C B T Y" 
              using T Y ParStrict C B coplanar_perm_16 
                pars__coplanar by blast
            ultimately
            show ?thesis 
              by (meson coplanar_trans_1 ncoplanar_perm_3)
          qed
          moreover
          have "Col T X B''" 
            by (simp add: Col_def Bet B'' T X)
          ultimately
          show ?thesis
            using X  T col_cop__cop coplanar_perm_13 by blast
        qed
        have " I. Col B' B I  Col T Y I" 
        proof -
          have "BetS T MB B" 
            by (metis BetS_def BetS B MB T between_symmetry)
          moreover
          have "BetS B'' MB B'" 
            by (metis BetS_def Bet_cases BetS B' MB B'')
          moreover
          have "Cong T MB B MB"
            by (meson Cong B MB T MB not_cong_3412)
          moreover
          have "Cong B'' MB B' MB" 
            by (simp add: Cong B' MB B'' MB cong_symmetry)
          ultimately
          show ?thesis 
            using assms ¬ Col T B'' Y Coplanar T B B'' Y 
              strong_parallel_postulate_def by blast
        qed
        then obtain I where "Col B' B I" and "Col T Y I" 
          by auto
        thus ?thesis 
          by (metis H13 H6 B  B' Col B B' D 
              T Y ParStrict C D bet_col col3 col_trivial_2 
              not_col_permutation_4 not_strict_par 
              par_strict_not_col_4 par_strict_par)
      qed
      hence " x y. (Bet A B x  Bet A C y  Bet x T y)" 
        using Bet A B X Bet A C Y by auto
    }
    hence " X Y. Bet A' B' X  Bet A' C' Y  Bet X T' Y" 
      using 1 2 3 tarski_s_euclid_remove_degenerated_cases by blast
  }
  thus ?thesis 
    using tarski_s_parallel_postulate_def by blast
qed

(** This is the converse of triangle_mid_par. *)


lemma midpoint_converse_postulate_implies_playfair:
  assumes "midpoint_converse_postulate"
  shows "playfair_s_postulate"
proof -
  {
    fix A1 A2 B1 B2 C1 C2 P
    assume "A1 A2 Par B1 B2" and
      "Col P B1 B2" and
      "A1 A2 Par C1 C2" and
      "Col P C1 C2"
    {
      assume "A1 A2 ParStrict B1 B2"
      {
        assume "A1 A2 ParStrict C1 C2"
        hence "P  A1" 
          using Col_cases Col P C1 C2 par_strict_not_col_3 by blast
        obtain X where "P Midpoint A1 X" 
          using symmetric_point_construction by blast
        {
          fix B1' B2'
          assume "Col P B1' B2'" and
            "A1 A2 ParStrict B1' B2'" and
            "P  B1'"
          moreover
          {
            fix B1'' B2''
            assume "Col P B1'' B2''" and
              "A1 A2 ParStrict B1'' B2''" and
              "P  B1''"
            have "A1  X" 
              using P Midpoint A1 X P  A1 l7_3 by blast
            have "P  X" 
              using A1  X P Midpoint A1 X midpoint_distinct_1 by blast
            have "A1  A2" 
              using A1 A2 ParStrict B1' B2' par_strict_neq1 by blast
            have "A1  B1''" 
              using A1 A2 ParStrict B1'' B2'' 
                not_par_strict_id by fastforce
            have "A1  B2''"
              using A1 A2 ParStrict B1'' B2'' Col P B1'' B2'' 
                P  B1'' col_transitivity_2 par_strict_not_col_3 by blast
            have "A2  B1''" 
              using A1 A2 ParStrict B1'' B2'' not_par_strict_id 
                par_strict_left_comm by blast
            have "A2  B2''" 
              using Par_strict_cases A1 A2 ParStrict B1'' B2'' 
                not_par_strict_id by blast
            have "B2''  B1''" 
              using A1 A2 ParStrict B1'' B2'' col_trivial_1 
                par_strict_not_col_3 by blast
            have " B3. Col B1'' P B3  (BetS X B3 A2  BetS A1 B3 A2)"
            proof -
              have "Coplanar X A1 A2 B1''" 
              proof -
                have "Coplanar A2 B1'' A1 P" 
                  using NCol_perm A1 A2 ParStrict B1'' B2'' 
                    B2''  B1'' Col P B1'' B2'' col_cop__cop 
                    ncoplanar_perm_12 pars__coplanar by blast
                moreover
                have "Col A1 P X" 
                  using Midpoint_def P Midpoint A1 X 
                    bet_col by blast
                ultimately
                show ?thesis 
                  using P  A1 col_cop__cop 
                    ncoplanar_perm_17 by blast
              qed
              moreover
              have "¬ Col A2 P B1''" 
                by (metis Par_strict_cases A1 A2 ParStrict B1'' B2''
                    Col P B1'' B2'' P  B1'' col3 col_trivial_2 
                    not_col_permutation_2 par_strict_not_col_3)
              moreover
              {
                assume "Col X A1 B1''"
                have "Bet A1 P X" 
                  using P Midpoint A1 X midpoint_bet by blast
                hence "Col A1 P X" 
                  using Col_def by blast
                hence "Col A1 P B1''" 
                  using Col X A1 B1'' 
                  by (metis A1  X col_permutation_2 
                      col_trivial_2 l6_21)
                moreover
                have "¬ Col A1 P B1''" 
                  by (metis A1 A2 ParStrict B1'' B2''
                      Col P B1'' B2'' P  B1'' col3 col_trivial_2 
                      col_trivial_3 par_strict_not_col_3)
                ultimately
                have "False" 
                  by simp
              }
              hence "¬ Col X A1 B1''" 
                by blast
              moreover
              have "BetS X P A1" 
                using BetS_def Midpoint_def P Midpoint A1 X
                  P  A1 P  X between_symmetry by presburger
              ultimately
              show ?thesis 
                using hilbert_s_version_of_pasch by blast
            qed
            then obtain B3 where "Col B1'' P B3" and "BetS X B3 A2  BetS A1 B3 A2" 
              by blast
            have "Col B1'' B2'' B3" 
              by (meson Col B1'' P B3 Col P B1'' B2''
                  P  B1'' col_transitivity_2 not_col_permutation_4)
            moreover
            {
              assume "BetS A1 B3 A2"
              have "Col B3 A1 A2" 
                using BetSEq Col_def BetS A1 B3 A2 
                  col_permutation_3 by blast
              moreover
              have "Col B3 B1'' B2''" 
                using Col_perm Col B1'' B2'' B3 by blast
              ultimately
              have "False"
                using A1 A2 ParStrict B1'' B2'' par_not_col by blast
            }
            hence "BetS A2 B3 X" 
              by (metis BetS_def BetS X B3 A2  BetS A1 B3 A2 
                  between_symmetry)
            moreover
            have "A1 A2 ParStrict P B3" 
            proof -
              have "Col B1'' B2'' P" 
                by (simp add: Col P B1'' B2'' col_permutation_1)
              moreover
              {
                assume "P = B3"
                have "Bet A2 B3 X" 
                  using BetSEq BetS A2 B3 X by blast
                hence "Col X P A2" 
                  using BetSEq BetS A1 B3 A2  False 
                    BetS X B3 A2  BetS A1 B3 A2 P = B3 bet_col by blast
                have "A2  B3" 
                  using BetSEq BetS A2 B3 X by auto
                have "B3  X"    
                  using BetSEq BetS A2 B3 X by auto
                hence "Col P A1 A2" 
                proof -
                  have "Col X P A2" 
                    by (simp add: Col X P A2)
                  moreover
                  have "Bet A1 P X" 
                    by (simp add: P Midpoint A1 X midpoint_bet)
                  hence "Col X P A1" 
                    using Bet_cases Col_def by blast
                  ultimately
                  show ?thesis 
                    using A1 A2 ParStrict B1'' B2'' 
                    by (metis P  X col_transitivity_2)
                qed
                hence "False" 
                  using Col P B1'' B2'' A1 A2 ParStrict B1'' B2'' 
                    par_not_col by blast
              }
              hence "P  B3" 
                by blast
              ultimately
              show ?thesis 
                using Col B1'' B2'' B3 A1 A2 ParStrict B1'' B2'' 
                  par_strict_col2_par_strict by blast
            qed
            ultimately
            have " B3. Col B1'' B2'' B3  BetS A2 B3 X  A1 A2 ParStrict P B3" 
              by blast
          }
          ultimately
          have " B3. Col B1' B2' B3  BetS A2 B3 X  A1 A2 ParStrict P B3" 
            using A1 A2 ParStrict B1' B2' Col P B1' B2' by blast
        }
        moreover
        {
          fix B1' B2'
          assume "Col P B1' B2'" and
            "A1 A2 ParStrict B1' B2'" and
            "P = B1'" 
          have "P  B2'" 
            using  P = B1' A1 A2 ParStrict B1' B2' 
              par_strict_distinct by presburger
          moreover
          have "Col P B2' B1'" 
            using P = B1' col_trivial_3 by blast
          moreover
          have "A1 A2 ParStrict B2' B1'" 
            by (simp add: A1 A2 ParStrict B1' B2' 
                par_strict_right_comm)
          ultimately
          have " B3. Col B1' B2' B3  BetS A2 B3 X  A1 A2 ParStrict P B3" 
            using Col_perm 
              B2' B1'. Col P B1' B2'; A1 A2 ParStrict B1' B2'; P  B1' 
                 B3. Col B1' B2' B3  BetS A2 B3 X  A1 A2 ParStrict P B3 
            by blast
        }
        ultimately
        have H1: " B1' B2'. (Col P B1' B2'  A1 A2 ParStrict B1' B2') 
                        
          ( B3. Col B1' B2' B3  BetS A2 B3 X  A1 A2 ParStrict P B3)"       
          by blast
        then obtain B3 where "Col B1 B2 B3" and "BetS A2 B3 X" and 
          "A1 A2 ParStrict P B3" 
          using A1 A2 ParStrict B1 B2 Col P B1 B2 by blast
        obtain C3 where "Col C1 C2 C3" and "BetS A2 C3 X" and 
          "A1 A2 ParStrict P C3"
          using A1 A2 ParStrict C1 C2 Col P C1 C2 H1 by blast
        have "Col A2 X B3" 
          by (meson BetSEq Bet_cases Col_def BetS A2 B3 X)
        have "Col A2 X C3" 
          by (meson BetSEq Bet_cases Col_def BetS A2 C3 X)
        have "¬ Col A1 A2 X" 
          by (metis BetSEq A1 A2 ParStrict P C3 
              BetS A2 B3 X Col A2 X C3 col124__nos col3
              col_trivial_3 l12_6 not_col_permutation_2)
        have "B3 = C3" 
        proof -
          have "B3 Midpoint A2 X" 
          proof -
            have "¬ Col A2 A1 X" 
              by (meson Col_cases ¬ Col A1 A2 X)
            moreover
            have "A2 A1 Par B3 P" 
              by (simp add: A1 A2 ParStrict P B3 
                  par_strict_comm par_strict_par)
            ultimately
            show ?thesis 
              using assms P Midpoint A1 X Col A2 X B3 
                midpoint_converse_postulate_def by blast
          qed
          moreover
          have "C3 Midpoint A2 X" 
          proof -
            have "¬ Col A2 A1 X" 
              by (meson Col_cases ¬ Col A1 A2 X)
            moreover
            have "A2 A1 Par C3 P" 
              by (simp add: A1 A2 ParStrict P C3 
                  par_strict_comm par_strict_par)
            ultimately
            show ?thesis 
              using assms P Midpoint A1 X Col A2 X C3
                midpoint_converse_postulate_def by blast
          qed
          ultimately
          show ?thesis
            by (meson Mid_cases l7_17_bis)
        qed
        have "Col C1 B1 B2" 
        proof -
          have "Col B1 B2 C3" 
            using B3 = C3 Col B1 B2 B3 by auto
          moreover
          have "Col C1 C2 C3" 
            using Col C1 C2 C3 by auto
          moreover
          have "Col P C1 C2" 
            by (simp add: Col P C1 C2)
          moreover
          have "Col P B1 B2" 
            by (simp add: Col P B1 B2)
          ultimately
          show ?thesis 
            by (metis A1 A2 ParStrict C1 C2 A1 A2 ParStrict P C3
                l6_21 not_col_permutation_2 par_strict_neq2)
        qed
        moreover
        have "Col C2 B1 B2" 
        proof -
          have "Col B1 B2 C3" 
            using B3 = C3 Col B1 B2 B3 by auto
          moreover
          have "Col C1 C2 C3" 
            using Col C1 C2 C3 by auto
          moreover
          have "Col P C1 C2" 
            by (simp add: Col P C1 C2)
          moreover
          have "Col P B1 B2" 
            by (simp add: Col P B1 B2)
          ultimately
          show ?thesis 
            by (metis A1 A2 ParStrict P C3 Col C1 B1 B2 
                l6_21 not_col_permutation_2 not_col_permutation_3 
                par_strict_neq2)
        qed
        ultimately
        have "Col C1 B1 B2  Col C2 B1 B2" 
          by simp
      }
      moreover
      have "(A1  A2  B1  B2  Col A1 B1 B2  Col A2 B1 B2) 
               
            Col C1 B1 B2  Col C2 B1 B2" 
        using NCol_perm A1 A2 ParStrict B1 B2 
          par_strict_not_col_3 by blast
      {
        assume "A1  A2"  and
          "B1  B2" and
          "Col A1 B1 B2" and
          "Col A2 B1 B2"
        hence "Col C1 B1 B2  Col C2 B1 B2" 
          using NCol_perm A1 A2 ParStrict B1 B2 
            par_strict_not_col_3 by blast
      }
      ultimately
      have "Col C1 B1 B2  Col C2 B1 B2" 
        by (meson A1 A2 Par C1 C2 A1 A2 ParStrict B1 B2 
            Col P B1 B2 Col P C1 C2 col_permutation_1 
            par_not_col par_not_col_strict)
    }
    moreover
    {
      assume "A1  A2" and "B1  B2" and
        "Col A1 B1 B2" and "Col A2 B1 B2"
      hence "¬ A1 A2 ParStrict B1 B2" 
        using par_strict_not_col_2 by blast
      have "Col B1 B2 C1  Col B1 B2 C2" 
      proof -
        have "B1 B2 Par C1 C2" 
          using NCol_perm A1 A2 Par C1 C2 B1  B2 
            Col A1 B1 B2 Col A2 B1 B2 
            par_col2_par_bis par_symmetry by blast
        moreover have "Col B1 B2 A1" 
          using Col A1 B1 B2 
            not_col_permutation_2 by blast
        moreover have "Col C1 C2 A1" 
          using Par_cases Col P B1 B2 
            Col P C1 C2 calculation(1) calculation(2) 
            col_not_col_not_par col_permutation_1 by blast
        ultimately show ?thesis 
          using inter_uniqueness_not_par not_strict_par2 by blast
      qed
      hence "Col C1 B1 B2  Col C2 B1 B2" 
        using col_permutation_2 by blast
    }
    ultimately
    have "Col C1 B1 B2  Col C2 B1 B2"
      using Par_def A1 A2 Par B1 B2 by presburger
  }
  thus ?thesis 
    using playfair_s_postulate_def by blast
qed

lemma playfair_implies_par_trans:
  assumes "playfair_s_postulate" 
  shows "postulate_of_transitivity_of_parallelism"
proof -
  {
    fix A1 A2 B1 B2 C1 C2
    assume "A1 A2 Par B1 B2" and 
      "B1 B2 Par C1 C2"
    have "B1  B2" 
      using A1 A2 Par B1 B2 par_distincts by blast
    have "A1  A2" 
      using A1 A2 Par B1 B2 par_distincts by auto
    have "C1  C2" 
      using B1 B2 Par C1 C2 par_distincts by blast
    have "A1 A2 Par C1 C2" 
    proof (cases "Coplanar A1 A2 C1 B1")
      case True
      show ?thesis 
      proof (cases "Col A1 A2 C1")
        case True
        hence "Col A1 A2 C2" 
        proof -
          have "B1 B2 Par A1 A2" 
            by (simp add: A1 A2 Par B1 B2 par_symmetry)
          moreover have "Col C1 A1 A2" 
            using True not_col_permutation_1 by blast
          moreover have "Col C1 C1 C2" 
            by (simp add: col_trivial_1)
          ultimately show ?thesis
            using playfair_s_postulate_def B1 B2 Par C1 C2 
              assms col_permutation_1 by blast
        qed
        have "B1 B2 Par C1 C2" 
          by (simp add: B1 B2 Par C1 C2)
        moreover
        have "Col C1 C1 C2" 
          by (simp add: col_trivial_1)
        moreover
        have "Col A2 C1 C2" 
          using Par_cases True A1 A2 Par B1 B2 assms 
            calculation(1) calculation(2) not_col_permutation_3 
            playfair_s_postulate_def by blast
        moreover
        have "B1 B2 Par A1 A2" 
          using Par_cases A1 A2 Par B1 B2 by blast
        moreover
        have "Col A1 A2 C1" 
          using True by simp
        hence "Col A1 C1 C2" 
          using calculation(3) 
          by (metis Col A1 A2 C2 col_transitivity_1)
        ultimately
        show ?thesis 
          using Par_def A1  A2 C1  C2 by blast
      next
        case False
        hence "¬ Col A1 A2 C1" 
          by simp
        have "A1 A2 ParStrict C1 C2" 
        proof -
          have "Coplanar A1 A2 C1 C2" 
          proof -
            have "C1 C2 Par B1 B2" 
              by (simp add: B1 B2 Par C1 C2 par_symmetry)
            moreover
            {
              assume "A1 A2 Par B1 B2" and "C1 C2 ParStrict B1 B2"
              hence "Coplanar C1 C2 B1 B2" 
                using ParStrict_def by blast
              have "Coplanar A1 A2 C1 C2" 
              proof -
                {
                  assume "A1 A2 ParStrict B1 B2"
                  hence "Coplanar A1 A2 B1 B2" 
                    using pars__coplanar by auto
                  moreover
                  have "Coplanar C1 C2 B1 B2" 
                    by (simp add: Coplanar C1 C2 B1 B2)
                  moreover
                  have "Coplanar A1 A2 C1 B1"
                    by (simp add: True)
                  ultimately
                  have "Coplanar A1 A2 C1 B2" 
                  proof -
                    have "¬ Col A2 B1 B2" 
                      using A1 A2 ParStrict B1 B2 par_strict_not_col_2 by auto
                    moreover have "Coplanar A2 B1 B2 A1" 
                      using Coplanar A1 A2 B1 B2 ncoplanar_perm_18 by blast
                    moreover have "Coplanar A2 B1 B2 A2" 
                      using ncop_distincts by blast
                    moreover have "Coplanar A2 B1 B2 C1" 
                      by (meson True A1 A2 ParStrict B1 B2 
                          calculation(2) coplanar_perm_1 l9_30 
                          ncop_distincts par_strict_not_col_3
                          par_strict_symmetry)
                    moreover have "Coplanar A2 B1 B2 B2" 
                      using ncop_distincts by blast
                    ultimately show ?thesis 
                      using coplanar_pseudo_trans by blast
                  qed
                  have "Coplanar A1 A2 C1 C1" 
                    using ncop_distincts by blast
                  have "Coplanar B1 B2 C1 A1" 
                    by (meson False True Coplanar A1 A2 C1 B2 
                        coplanar_pseudo_trans ncop_distincts)
                  moreover
                  have "Coplanar B1 B2 C1 A2" 
                    by (meson False True Coplanar A1 A2 C1 B2 
                        coplanar_trans_1 ncoplanar_perm_22)
                  moreover
                  have "Coplanar B1 B2 C1 C1" 
                    using ncop_distincts by blast
                  moreover
                  have "Coplanar B1 B2 C1 C2" 
                    by (simp add: Coplanar C1 C2 B1 B2
                        coplanar_perm_16)
                  ultimately
                  have "Coplanar A1 A2 C1 C2" 
                    by (meson NCol_perm C1 C2 ParStrict B1 B2
                        coplanar_pseudo_trans not_col_distincts 
                        par_not_col)
                }
                moreover
                {
                  assume "A1  A2  B1  B2  Col A1 B1 B2  Col A2 B1 B2"
                  hence "Coplanar A1 A2 C1 C2" 
                    by (meson C1 C2 Par B1 B2 col2_cop__cop 
                        col_permutation_1 ncoplanar_perm_16 par__coplanar) 
                }
                ultimately
                show ?thesis 
                  by (metis Par_cases A1 A2 Par B1 B2 A1  A2 
                      B1  B2 col_permutation_2 not_col_distincts 
                      par_not_col_strict par_strict_symmetry)
              qed
            }
            moreover
            {
              assume "A1 A2 Par B1 B2" and "C1  C2" and
                "B1  B2" and "Col C1 B1 B2" and "Col A2 B1 B2"
              hence "Coplanar A1 A2 C1 C2" 
                by (meson col_permutation_1 col_trivial_3
                    ncop__ncols par_not_col par_not_col_strict)
            }
            ultimately
            show ?thesis 
              by (metis A1 A2 Par B1 B2 B1  B2 
                  all_one_side_par_strict col2_cop__cop not_strict_par1 
                  not_strict_par2 par__coplanar par_not_col_strict
                  par_symmetry)
          qed
          moreover
          {
            assume " X. Col X A1 A2  Col X C1 C2"
            then obtain X where "Col X A1 A2" and "Col X C1 C2" 
              by blast
            have "B1 B2 Par A1 A2" 
              using A1 A2 Par B1 B2 par_symmetry by blast
            hence False
              using  B1 B2 Par C1 C2 Col X A1 A2 
                Col X C1 C2 False assms col_permutation_1 
                playfair_s_postulate_def by blast
          }
          ultimately
          show ?thesis 
            using ParStrict_def by blast
        qed
        thus ?thesis 
          by (simp add: Par_def)
      qed
    next
      case False
      hence "A1 A2 ParStrict B1 B2" 
        using A1 A2 Par B1 B2 col_trivial_3 
          ncop__ncols par_not_col_strict by blast
      have "B1 B2 ParStrict C1 C2" 
      proof -
        have "Col C1 C2 C1" 
          by (simp add: col_trivial_3)
        moreover
        have "¬ Col B1 B2 C1" 
          by (meson False A1 A2 Par B1 B2 B1  B2 
              col_cop__cop ncoplanar_perm_1 par__coplanar)
        ultimately
        show ?thesis 
          using B1 B2 Par C1 C2 par_not_col_strict by blast
      qed
      have " C'. Coplanar A1 A2 C1 C'  Coplanar B1 B2 C1 C'  C1  C'" 
      proof -
        have "Coplanar A1 A2 C1 C1" 
          using ncop_distincts by blast
        moreover
        have "A1 A2 C1 OSP B1 B2" 
          by (meson False A1 A2 ParStrict B1 B2 
              col_trivial_2 cop2_os__osp 
              ncop_distincts par_strict_one_side)
        ultimately
        show ?thesis 
          by (simp add: cop_osp__ex_cop2)
      qed
      then obtain C' where "Coplanar A1 A2 C1 C'" and "Coplanar B1 B2 C1 C'" 
        and "C1  C'" 
        by auto
      { 
        fix X
        assume "Coplanar A1 A2 B1 X" and 
          "Col X C1 C'" 
        have "Col X A1 A2" 
        proof -
          have "¬ Coplanar A1 A2 C1 B1" 
            by (simp add: False)
          moreover
          have "¬ Col A1 A2 B1" 
            using calculation ncop__ncols by auto
          moreover
          have "Coplanar A1 A2 B1 B1" 
            using ncop_distincts by blast
          moreover
          have "Coplanar A1 A2 C1 X" 
            using C1  C' Col X C1 C' Coplanar A1 A2 C1 C' 
              col_cop__cop col_permutation_1 by blast
          moreover
          have "Coplanar A1 A2 C1 A1" 
            using ncop_distincts by blast
          moreover
          have "Coplanar A1 A2 C1 A2" 
            using ncop_distincts by blast
          moreover
          have "Coplanar A1 A2 B1 X" 
            by (simp add: Coplanar A1 A2 B1 X)
          moreover
          have "Coplanar A1 A2 B1 A1" 
            using ncop_distincts by blast
          moreover
          have "Coplanar A1 A2 B1 A2" 
            using ncop_distincts by blast
          ultimately
          show ?thesis 
            using l9_30 by blast
        qed
        moreover
        have "Col X B1 B2" 
        proof -
          have "¬ Coplanar A1 A2 B1 C1" 
            using False ncoplanar_perm_1 by blast
          moreover
          have "¬ Col B1 B2 C1" 
            using B1 B2 ParStrict C1 C2 col123__nos l12_6 by blast
          moreover
          have "Coplanar B1 B2 C1 C1" 
            using ncop_distincts by blast
          moreover
          have "Coplanar A1 A2 B1 X" 
            by (simp add: Coplanar A1 A2 B1 X)
          moreover
          have "Coplanar A1 A2 B1 B1" 
            using ncop_distincts by blast
          moreover
          have "Coplanar A1 A2 B1 B2" 
            using ParStrict_def A1 A2 ParStrict B1 B2 by blast
          moreover
          have "Coplanar B1 B2 C1 X" 
            by (meson C1  C' Col X C1 C' 
                Coplanar B1 B2 C1 C' col_cop__cop 
                not_col_permutation_1)
          moreover
          have "Coplanar B1 B2 C1 B1" 
            using ncop_distincts by blast
          moreover
          have "Coplanar B1 B2 C1 B2" 
            using ncop_distincts by blast
          ultimately
          show ?thesis 
            using l9_30 by blast
        qed
        ultimately
        have False 
          using A1 A2 ParStrict B1 B2 par_not_col by blast
      }
      have "A1 A2 ParStrict C1 C2" 
      proof -
        {
          assume " X. Col X A1 A2  Col X C1 C'" 
          then obtain X where "Col X A1 A2" and "Col X C1 C'" 
            by auto
          have "Coplanar A1 A2 B1 X" 
            using Col X A1 A2 col_permutation_1 ncop__ncols by blast
          hence False 
            using Col X C1 C' 
              X. Coplanar A1 A2 B1 X; Col X C1 C'  False 
            by blast
        }
        hence "A1 A2 ParStrict C1 C'" 
          using ParStrict_def Coplanar A1 A2 C1 C' by blast
        moreover
        have "B1 B2 ParStrict C1 C'"
        proof -
          have "B1 B2 Par C1 C'" 
            using  A1 A2 Par B1 B2 B1  B2 Coplanar B1 B2 C1 C' 
              assms calculation col_cop__cop col_permutation_1 
              coplanar_perm_1 par__coplanar par_strict_par 
              playfair_s_postulate_def
            by (meson False cop_npars__inter_exists)
          thus ?thesis 
            using Par_def 
              X. Coplanar A1 A2 B1 X; Col X C1 C'  False 
              ncop_distincts by blast
        qed
        hence "Col C1 C' C2" 
          using B1 B2 Par C1 C2 assms col_permutation_1 
            col_trivial_1 par_strict_par 
            playfair_s_postulate_def by blast
        ultimately
        show ?thesis 
          using C1  C2 par_strict_col_par_strict by blast
      qed
      thus ?thesis 
        by (simp add: Par_def)
    qed
  }
  thus ?thesis 
    using postulate_of_transitivity_of_parallelism_def by blast
qed

lemma par_trans_implies_playfair:
  assumes "postulate_of_transitivity_of_parallelism"
  shows "playfair_s_postulate" 
proof -
  {
    fix A1 A2 B1 B2 C1 C2 P
    assume "A1 A2 Par B1 B2" and
      "Col P B1 B2" and
      "A1 A2 Par C1 C2" and
      "Col P C1 C2"
    have "C1 C2 Par B1 B2" 
      using A1 A2 Par B1 B2 A1 A2 Par C1 C2 assms 
        par_symmetry postulate_of_transitivity_of_parallelism_def by blast
    hence "Col C1 B1 B2  Col C2 B1 B2" 
      using Par_def Col P B1 B2 Col P C1 C2 
        par_not_col by blast
  }
  thus ?thesis 
    using playfair_s_postulate_def by blast
qed

lemma par_perp_perp_implies_par_perp_2_par:
  assumes "perpendicular_transversal_postulate"
  shows "postulate_of_parallelism_of_perpendicular_transversals"
proof -
  {
    fix A1 A2 B1 B2 C1 C2 D1 D2
    assume "A1 A2 Par B1 B2" and "A1 A2 Perp C1 C2" and "B1 B2 Perp D1 D2" and
      "Coplanar A1 A2 C1 D1" and "Coplanar A1 A2 C1 D2" and
      "Coplanar A1 A2 C2 D1" and "Coplanar A1 A2 C2 D2" 
    have "C1 C2 Perp A1 A2" 
      using Perp_perm A1 A2 Perp C1 C2 by blast
    moreover
    have "D1 D2 Perp A1 A2" 
    proof -
      have "B1 B2 Par A1 A2" 
        using Par_cases A1 A2 Par B1 B2 by blast
      moreover
      have "B1 B2 Perp D1 D2" 
        by (simp add: B1 B2 Perp D1 D2)
      moreover

      have "Coplanar A1 A2 D1 D2" 
      proof -
        {
          assume "¬ Col A1 A2 C1"
          hence "Coplanar A1 A2 D1 D2" 
            by (meson Coplanar A1 A2 C1 D1 Coplanar A1 A2 C1 D2
                coplanar_pseudo_trans ncop_distincts)
        }
        moreover
        {
          assume "¬ Col A1 A2 C2"
          hence "Coplanar A1 A2 D1 D2" 
            by (meson Coplanar A1 A2 C2 D1 Coplanar A1 A2 C2 D2
                coplanar_perm_12 coplanar_trans_1 not_col_permutation_2)
        }
        ultimately
        show ?thesis
          using perp_not_col2 A1 A2 Perp C1 C2 by blast
      qed
      ultimately
      show ?thesis 
        using Perp_perm assms perpendicular_transversal_postulate_def by blast
    qed
    ultimately
    have "C1 C2 Par D1 D2"
      using l12_9 Coplanar A1 A2 C1 D1 Coplanar A1 A2 C1 D2 
        Coplanar A1 A2 C2 D1 Coplanar A1 A2 C2 D2 
      by blast
  }
  thus ?thesis 
    using postulate_of_parallelism_of_perpendicular_transversals_def by blast
qed

lemma par_perp_2_par_implies_par_perp_perp:
  assumes "postulate_of_parallelism_of_perpendicular_transversals" 
  shows "perpendicular_transversal_postulate"
proof -
  {
    fix A B C D P Q
    assume "A B Par C D" and
      "A B Perp P Q" and
      "Coplanar C D P Q"
    {
      assume "A B ParStrict C D"
      obtain X where "X PerpAt A B P Q" 
        using Perp_def A B Perp P Q by blast
      have "C D Perp P Q" 
      proof (cases "Col C D X")
        case True
        have "Col X A B" 
          using X PerpAt A B P Q Col_cases perp_in_col by blast
        moreover
        have "Col X C D"  
          using Col_cases True by blast
        ultimately
        have " X0. Col X0 A B  Col X0 C D" 
          by blast
        hence False 
          using A B ParStrict C D par_not_col by blast
        thus ?thesis 
          by blast
      next
        case False
        then obtain Y where "Col C D Y" and "C D Perp X Y" 
          using False l8_18_existence by blast
        have "A  B" 
          using A B Par C D par_distinct by auto
        have "P  Q" 
          using A B Perp P Q perp_not_eq_2 by auto
        have "P Q Par X Y" 
        proof -
          have "Coplanar C D X A" 
          proof -
            have "Coplanar C D A B" 
              using Par_cases A B Par C D par__coplanar by blast
            moreover
            have "Col X A B" 
              using X PerpAt A B P Q Col_cases perp_in_col by blast
            hence "Col A B X" 
              using Col_cases by blast
            moreover
            have "Col A B A" 
              by (simp add: col_trivial_3)
            ultimately
            show ?thesis 
              using A  B col2_cop__cop by blast
          qed
          have "Coplanar C D X B" 
          proof -
            have "Coplanar C D A B" 
              using Par_perm A B Par C D par__coplanar by blast
            moreover
            have "Col X A B" 
              using X PerpAt A B P Q Col_cases perp_in_col by blast
            hence "Col A B X" 
              using Col_cases by blast
            moreover
            have "Col A B B" 
              by (simp add: col_trivial_2)
            ultimately
            show ?thesis 
              using A  B col2_cop__cop by blast
          qed
          have "Coplanar C D X P" 
            by (meson Coplanar C D P Q P  Q 
                X PerpAt A B P Q col_cop__cop ncoplanar_perm_6 
                ncoplanar_perm_7 perp_in_col)
          have "Coplanar C D X Q" 
          proof -
            have "Coplanar C D P Q" 
              by (simp add: Coplanar C D P Q)
            moreover
            have "Col P Q X" 
              using X PerpAt A B P Q perp_in_col by blast
            moreover
            have "Col P Q Q" 
              using col_trivial_2 by auto
            ultimately
            show ?thesis 
              using P  Q col2_cop__cop by blast
          qed
          have "Coplanar C D X Y" 
            by (simp add: C D Perp X Y perp__coplanar)
          have "Coplanar A B P X" 
            using X PerpAt A B P Q col__coplanar 
              coplanar_perm_1 perp_in_col by blast
          moreover
          have "Coplanar A B P Y" 
            by (meson False Coplanar C D X A Coplanar C D X B
                Coplanar C D X P Coplanar C D X Y 
                coplanar_pseudo_trans)
          moreover
          have "Coplanar A B Q X" 
            by (meson X PerpAt A B P Q ncop__ncol 
                ncoplanar_perm_1 perp_in_col)
          moreover
          have "Coplanar A B Q Y" 
            by (meson  Coplanar C D X A Coplanar C D X B 
                Coplanar C D X Q Coplanar C D X Y False
                coplanar_pseudo_trans)
          ultimately
          show ?thesis
            using  C D Perp X Y A B Perp P Q A B Par C D 
              postulate_of_parallelism_of_perpendicular_transversals_def
              assms by blast
        qed
        {
          assume "P  Q  X  Y  Col P X Y  Col Q X Y"
          hence "C D Perp P Q" 
            by (meson C D Perp X Y not_col_permutation_2 perp_col2_bis)
        }
        moreover
        {
          assume "P Q ParStrict X Y"
          have "Col X P Q" 
            using X PerpAt A B P Q Col_cases perp_in_col by blast
          moreover
          have "Col X X Y" 
            by (simp add: col_trivial_1)
          ultimately
          have False 
            using P Q ParStrict X Y par_not_col by blast
          hence "C D Perp P Q" 
            by blast
        }
        ultimately
        show ?thesis 
          using P Q Par X Y Par_def by blast
      qed
    }
    hence "C D Perp P Q" 
      by (metis Par_perm Par_strict_perm par_neq2 
          par_not_col_strict perp_col2 perp_inter_perp_in 
          A B Par C D A B Perp P Q not_strict_par2)
  }
  thus ?thesis 
    using perpendicular_transversal_postulate_def by blast
qed

lemma par_perp_perp_implies_playfair:
  assumes "perpendicular_transversal_postulate"
  shows "playfair_s_postulate" 
proof -
  {
    fix A1 A2 B1 B2 C1 C2 P
    assume "A1 A2 Par B1 B2" and 
      "Col P B1 B2" and
      "A1 A2 Par C1 C2" and
      "Col P C1 C2"
    {
      assume H1: " C1 C2. P  C1  A1 A2 Par C1 C2  Col P C1 C2
                     
                       (Col C1 B1 B2  Col C2 B1 B2)"
      fix C1 C2
      assume "A1 A2 Par C1 C2" and "Col P C1 C2"
      have "Col C1 B1 B2  Col C2 B1 B2" 
      proof (cases "P = C1")
        case True
        hence "P = C1" 
          by simp
        show ?thesis 
        proof (cases "P = C2")
          case True
          thus ?thesis
            using Col P B1 B2 P = C1 by auto
        next
          case False
          hence "P  C2"
            by simp
          show ?thesis 
            by (metis A1 A2 Par C1 C2 Col P B1 B2 
                Col P C1 C2 H1 not_col_permutation_5 
                par_right_comm)
        qed
      next
        case False
        hence "P  C1"
          by simp
        thus ?thesis 
          using A1 A2 Par C1 C2 Col P C1 C2 H1 by blast
      qed
    }
    {
      fix C1 C2
      assume "P  C1" and 
        "A1 A2 Par C1 C2" and 
        "Col P C1 C2"
      have "Col C1 B1 B2  Col C2 B1 B2" 
      proof (cases "Col A1 A2 P")
        case True
        have "Col C1 B1 B2" 
          using A1 A2 Par B1 B2 A1 A2 Par C1 C2 
            Col P B1 B2 Col P C1 C2 col3 not_strict_par1 
            not_strict_par2 par_neq1
          by (meson True not_col_permutation_2)
        moreover
        have "Col C2 B1 B2"
          using A1 A2 Par B1 B2 A1 A2 Par C1 C2 
            Col P B1 B2 Col P C1 C2 
            col3 not_strict_par1 not_strict_par2 par_neq1
          by (metis P  C1 calculation 
              col_permutation_1 col_trivial_2)
        ultimately show ?thesis
          by blast
      next
        case False
        hence "¬ Col A1 A2 P"
          by simp
        then obtain I where "Col A1 A2 I" and "A1 A2 Perp P I" 
          using l8_18_existence by blast
        have "Coplanar B1 B2 P I" 
          using Col P B1 B2 col_permutation_1 ncop__ncol by blast
        have "Coplanar C1 C2 P I" 
          by (meson Col P C1 C2 col_permutation_1 ncop__ncol)
        moreover
        have "A1 A2 Par B1 B2" 
          using A1 A2 Par B1 B2 by auto
        ultimately
        have "B1 B2 Perp P I" 
          using perpendicular_transversal_postulate_def assms 
            A1 A2 Perp P I Coplanar B1 B2 P I by blast
        have "C1 C2 Perp P I"
          using perpendicular_transversal_postulate_def assms 
            A1 A2 Perp P I Coplanar C1 C2 P I A1 A2 Par C1 C2 by blast
        have "Coplanar A1 A2 P B1" 
          using A1 A2 Par B1 B2 Col P B1 B2 col2_cop__cop 
            col_permutation_1 col_trivial_3 par__coplanar 
            par_neq2 by blast
        have "Coplanar A1 A2 P B2" 
          using A1 A2 Par B1 B2 Col P B1 B2 col2_cop__cop 
            col_permutation_1 col_trivial_3 par__coplanar 
            par_neq2 by blast
        have "Coplanar A1 A2 P C1" 
          using A1 A2 Par C1 C2 Col P C1 C2 col_trivial_2
            ncop_distincts par__coplanar 
            par_col2_par_bis by blast
        have "Coplanar A1 A2 P I" 
          by (simp add: A1 A2 Perp P I perp__coplanar)
        have "P C1 Perp P I" 
        proof -
          have "C1  P" 
            using P  C1 by blast
          moreover
          have "C1 C2 Perp P I" 
            by (simp add: C1 C2 Perp P I)
          moreover
          have "Col C1 C2 P" 
            using Col_cases Col P C1 C2 by blast
          ultimately
          show ?thesis 
            by (meson perp_col perp_left_comm)
        qed
        have "Col P C1 B1" 
        proof (cases "P = B1")
          case True
          thus ?thesis
            by (simp add: col_trivial_3)
        next
          case False
          show ?thesis 
          proof -
            have "Coplanar P I C1 B1" 
            proof -
              have "Coplanar A1 A2 P P" 
                using ncop_distincts by blast
              thus ?thesis 
                by (meson ¬ Col A1 A2 P Coplanar A1 A2 P B1 
                    Coplanar A1 A2 P C1 Coplanar A1 A2 P I 
                    coplanar_pseudo_trans)
            qed
            moreover
            have "P B1 Perp P I" 
              by (metis False Perp_perm B1 B2 Perp P I Col P B1 B2 
                  col_permutation_1 perp_col)
            ultimately
            show ?thesis 
              using P C1 Perp P I cop_perp2__col by blast
          qed
        qed
        moreover
        have "Col P C1 B2" 
        proof (cases "P = B2")
          case True
          thus ?thesis
            by (simp add: col_trivial_3)
        next
          case False
          show ?thesis 
          proof -
            have "Coplanar P I C1 B2" 
            proof -
              have "Coplanar A1 A2 P P" 
                using ncop_distincts by blast
              thus ?thesis 
                by (meson ¬ Col A1 A2 P Coplanar A1 A2 P B2
                    Coplanar A1 A2 P C1 Coplanar A1 A2 P I 
                    coplanar_pseudo_trans)
            qed
            moreover
            have "P B2 Perp P I" 
              by (metis False Perp_perm B1 B2 Perp P I 
                  Col P B1 B2 col_permutation_1 perp_col)
            ultimately
            show ?thesis 
              using P C1 Perp P I cop_perp2__col by blast
          qed
        qed
        ultimately
        show ?thesis 
          by (metis Col P C1 C2 P  C1 col_transitivity_2)
      qed
    }
    hence "Col C1 B1 B2  Col C2 B1 B2" 
      using A1 A2 Par C1 C2 Col P C1 C2
        C2a C1a. C1 C2. P  C1  A1 A2 Par C1 C2  Col P C1 C2 
 Col C1 B1 B2  Col C2 B1 B2; A1 A2 Par C1a C2a; Col P C1a C2a 
 Col C1a B1 B2  Col C2a B1 B2 
      by blast
  }
  thus ?thesis 
    using playfair_s_postulate_def by blast
qed

lemma playfair__universal_posidonius_postulate:
  assumes "playfair_s_postulate" 
  shows "universal_posidonius_postulate" 
proof -
  {
    fix A1 A2 A3 A4 B1 B2 B3 B4
    assume "A1 A2 Par B1 B2" and
      "Col A1 A2 A3" and "Col B1 B2 B3" and
      "A1 A2 Perp A3 B3" and
      "Col A1 A2 A4" and "Col B1 B2 B4" and "A1 A2 Perp A4 B4"
    {
      assume "A1 A2 ParStrict B1 B2" 
      hence "¬ Col A1 A2 B1" 
        by (meson par_strict_not_col_1)
      then obtain A1' where "Col A1 A2 A1'" and "A1 A2 Perp B1 A1'" 
        using l8_18_existence by blast
      {
        fix A3 B3
        assume "Col A1 A2 A3" and
          "Col B1 B2 B3" and
          "A1 A2 Perp A3 B3"
        have "B3  A3" 
          using A1 A2 Perp A3 B3 Col A1 A2 A3 perp_not_col2 by blast
        then obtain B3' where "Bet A3 B3 B3'  Bet A3 B3' B3" and "Cong A3 B3' A1' B1" 
          using segment_construction_2 by blast
        {
          assume "A1' = A3" 
          have "Col A1' B1 B3" 
          proof -
            have "Coplanar A1 A2 B1 B3" 
              using A1 A2 Par B1 B2 Col B1 B2 B3 col2_cop__cop 
                col_trivial_3 par__coplanar par_neq2 by blast
            moreover
            have "A1' B1 Perp A1 A2" 
              using Perp_perm A1 A2 Perp B1 A1' by blast
            moreover
            have "A1' B3 Perp A1 A2" 
              using Perp_perm A1' = A3 A1 A2 Perp A3 B3 by blast
            ultimately
            show ?thesis 
              using cop_perp2__col by blast
          qed
          have "B1 = B3" 
          proof -
            have "¬ Col B1 B2 A1'" 
            proof (cases "A1 = A1'")
              case True
              thus ?thesis 
                using A1 A2 Par B1 B2 Col A1 A2 A1' 
                  ¬ Col A1 A2 B1 not_strict_par1 by blast
            next
              case False
              thus ?thesis 
                using A1' = A3 A1 A2 Par B1 B2 Col A1 A2 A3 ¬ Col A1 A2 B1 
                  not_strict_par by blast
            qed
            moreover
            have "Col B1 B2 B1" 
              by (simp add: col_trivial_3)
            moreover
            have "Col A1' B1 B1" 
              using col_trivial_2 by auto
            ultimately
            show ?thesis 
              by (meson  Col B1 B2 B3 Col A1' B1 B3 
                  col_permutation_4 l6_16_1)
          qed
          hence "Cong A3 B3 A1' B1" 
            using cong_reflexivity by (simp add: A1' = A3)
        }
        moreover
        {
          assume "A1'  A3" 
          have "Saccheri A1' B1 B3' A3" 
          proof -
            have "A1' B1 Perp A3 A1'" 
              using A1' A3 Perp_cases A1 A2 Perp B1 A1'
                Col A1 A2 A1' Col A1 A2 A3 perp_col2_bis by blast
            hence "Per B1 A1' A3" 
              using perp_per_1 by blast
            moreover
            have "A3 A1' Perp B3' A3" 
            proof -
              have "A1 A2 Perp A3 B3" 
                by (simp add: A1 A2 Perp A3 B3)
              hence "A3 B3 Perp A3 A1'" 
                using perp_col0 A1' A3  Col A1 A2 A3
                  Col A1 A2 A1' by presburger
              moreover
              have "Col A3 B3 B3'" 
                using Col_def Bet A3 B3 B3'  Bet A3 B3' B3 
                  col_permutation_4 by blast
              moreover
              have "Col A3 B3 A3" 
                by (simp add: col_trivial_3)
              ultimately
              show ?thesis 
                by (metis A1' B1 Perp A3 A1' Cong A3 B3' A1' B1
                    cong_diff_3 perp_col0 perp_not_eq_1)
            qed
            hence "Per A1' A3 B3'" 
              using perp_per_1 by blast
            moreover
            have "Cong A1' B1 B3' A3" 
              using Cong A3 B3' A1' B1 not_cong_4312 by blast
            moreover
            have "A1' A3 OS B1 B3'" 
            proof -
              have "A1' A3 OS B1 B3" 
              proof (cases "B1 = B3")
                case True
                thus ?thesis 
                  by (metis Col_cases ¬ Col A1 A2 B1 A1'  A3 
                      Col A1 A2 A1' Col A1 A2 A3 colx 
                      one_side_reflexivity)
              next
                case False
                have "Col A1 A2 A1'" 
                  using Col A1 A2 A1' by auto
                moreover
                have "Col A1 A2 A3" 
                  by (simp add: Col A1 A2 A3)
                moreover
                have "A1 A2 OS B1 B3" 
                  by (meson A1 A2 ParStrict B1 B2 Col B1 B2 B3
                      par_strict_one_side)
                ultimately
                show ?thesis 
                  using col2_os__os A1'  A3 by blast
              qed
              moreover
              have "A1' A3 OS B3 B3'" 
                by (metis Bet A3 B3 B3'  Bet A3 B3' B3
                    Cong A1' B1 B3' A3 bet_out calculation col124__nos 
                    cong_identity invert_one_side l6_6 os_distincts 
                    out_one_side)
              ultimately
              show ?thesis 
                using one_side_transitivity by blast
            qed
            ultimately
            show ?thesis 
              using Saccheri_def by blast
          qed
          hence "A1' A3 ParStrict B1 B3'" 
            using sac__pars1423 by blast
          have "Col B3' B1 B2" 
          proof -
            have "A1 A2 Par B1 B2" 
              using A1 A2 Par B1 B2 by auto
            moreover
            have "Col B1 B1 B2" 
              by (simp add: col_trivial_1)
            moreover
            have "A1 A2 Par B1 B3'" 
            proof -
              have "A1  A2" 
                using ¬ Col A1 A2 B1 col_trivial_1 by blast
              moreover
              have "B1 B3' Par A1' A3" 
                using Par_strict_perm A1' A3 ParStrict B1 B3'
                  par_strict_par by blast
              moreover
              have "Col A1' A3 A1" 
                by (meson Col A1 A2 A1' Col A1 A2 A3
                    calculation(1) col_transitivity_1 
                    not_col_permutation_3)
              moreover
              have "Col A1' A3 A2" 
                by (meson Col A1 A2 A1' Col A1 A2 A3
                    calculation(1) col_transitivity_2 
                    not_col_permutation_2)
              ultimately 
              show ?thesis 
                by (meson par_col2_par par_symmetry)
            qed
            moreover
            have "Col B1 B1 B3'" 
              by (simp add: col_trivial_1)
            ultimately
            show ?thesis 
              using assms playfair_s_postulate_def by blast
          qed
          have "B3 = B3'" 
          proof -
            have "¬ Col B1 B3' A3" 
              by (metis A1 A2 Par B1 B2 A1' A3 ParStrict B1 B3'
                  Col A1 A2 A3 Col B3' B1 B2 ¬ Col A1 A2 B1 
                  col_transitivity_2 not_col_permutation_4 
                  not_strict_par par_strict_neq2)
            moreover
            have "A3  B3" 
              using B3  A3 by auto
            moreover
            have "Col B1 B3' B3" 
              by (metis A1 A2 ParStrict B1 B2 Col B1 B2 B3 
                  Col B3' B1 B2 colx not_col_distincts
                  par_strict_neq2)
            moreover
            have "Col B1 B3' B3'" 
              by (simp add: col_trivial_2)
            moreover
            have "Col A3 B3 B3" 
              by (simp add: col_trivial_2)
            moreover
            have "Col A3 B3 B3'" 
              using Bet A3 B3 B3'  Bet A3 B3' B3
                bet_col1 between_trivial by blast
            ultimately
            show ?thesis 
              using l6_21 by blast
          qed
          hence "Cong A3 B3 A1' B1" 
            using Cong A3 B3' A1' B1 by auto
        }
        ultimately
        have "Cong A3 B3 A1' B1" 
          by blast
      }
      moreover
      have "Cong A3 B3 A1' B1" 
        using calculation(1) 
        by (simp add: A1 A2 Perp A3 B3 Col A1 A2 A3
            Col B1 B2 B3)
      moreover
      have "Cong A1' B1 A4 B4" 
        using calculation(1) Cong_perm A1 A2 Perp A4 B4
          Col A1 A2 A4 Col B1 B2 B4 by blast
      ultimately
      have "Cong A3 B3 A4 B4" 
        using cong_transitivity by blast
    }
    moreover
    {
      assume "A1  A2" and "B1  B2" and "Col A1 B1 B2" and "Col A2 B1 B2" 
      hence "Cong A3 B3 A4 B4" 
        using A1 A2 Par B1 B2 A1 A2 Perp A3 B3 
          Col A1 A2 A3 Col B1 B2 B3 calculation 
          par_not_col_strict perp_not_col2 by blast
    }
    ultimately
    have "Cong A3 B3 A4 B4" 
      using Par_def A1 A2 Par B1 B2 by presburger
  }
  thus ?thesis 
    using universal_posidonius_postulate_def by blast
qed

(** Formalization of a proof from Bachmann's article "Zur Parallelenfrage" *)

lemma weak_inverse_projection_postulate__bachmann_s_lotschnittaxiom_aux:
  assumes "weak_inverse_projection_postulate" 
  shows " A1 A2 B1 B2 C1 C2 Q P R M.
             (A1 A2 Perp B1 B2  A1 A2 Perp C1 C2  
              Col A1 A2 Q  Col B1 B2 Q 
              Col A1 A2 P  Col C1 C2 P  
              Col B1 B2 R  Coplanar Q P R C1  
              Coplanar Q P R C2  ¬ Col Q P R 
              M InAngle P Q R  M Q P CongA M Q R) 
        
           (B1 B2 ParStrict C1 C2  
           ( S. Q Out M S  Col C1 C2 S))" 
proof -
  {
    fix A1 A2 B1 B2 C1 C2 Q P R M
    assume "A1 A2 Perp B1 B2" and 
      "A1 A2 Perp C1 C2" and
      "Col A1 A2 Q" and 
      "Col B1 B2 Q" and
      "Col A1 A2 P" and 
      "Col C1 C2 P" and 
      "Col B1 B2 R" and
      "Coplanar Q P R C1" and 
      "Coplanar Q P R C2" and 
      "¬ Col Q P R" and
      "M InAngle P Q R" and 
      "M Q P CongA M Q R"
    have "Q  P" 
      using ¬ Col Q P R col_trivial_1 by auto
    have "Q  R" 
      using ¬ Col Q P R col_trivial_3 by auto
    have "A1  A2" 
      using A1 A2 Perp C1 C2 perp_distinct by auto
    have "C1  C2" 
      using A1 A2 Perp C1 C2 perp_distinct by auto
    have "B1  B2" 
      using A1 A2 Perp B1 B2 perp_distinct by auto
    have "Q  M" 
      using M InAngle P Q R inangle_distincts by blast
    have "¬ Col A1 A2 R" 
      using A1 A2 Perp B1 B2 Col A1 A2 P Col A1 A2 Q 
        ¬ Col Q P R col3 perp_not_eq_1 by blast
    have "¬ Col B1 B2 P" 
      using B1  B2 Col B1 B2 Q Col B1 B2 R 
        ¬ Col Q P R col3 by blast
    have "B1 B2 ParStrict C1 C2" 
    proof -
      have "B1 B2 Par C1 C2" 
      proof -
        have "Col A1 P Q  Col A2 P Q  Col B1 R Q  Col B2 R Q" 
          by (meson A1  A2 B1  B2 Col A1 A2 P 
              Col A1 A2 Q Col B1 B2 Q Col B1 B2 R 
              col_transitivity_1 col_transitivity_2)
        have "Coplanar Q P R A1" 
          by (meson Col A1 P Q  Col A2 P Q  Col B1 R Q  Col B2 R Q 
              ncop__ncols not_col_permutation_3)
        have "Coplanar Q P R A2"
          using Col A1 P Q  Col A2 P Q  Col B1 R Q  Col B2 R Q 
            ncop__ncols not_col_permutation_3 by blast
        have "Coplanar Q P R B1" 
          using Col A1 P Q  Col A2 P Q  Col B1 R Q  Col B2 R Q 
            ncop__ncols not_col_permutation_3 by blast
        have "Coplanar Q P R B2" 
          using NCol_perm Col A1 P Q  Col A2 P Q  Col B1 R Q  Col B2 R Q 
            ncop__ncols by blast
        have "Coplanar A1 A2 B1 C1" 
          by (meson Coplanar Q P R A1 Coplanar Q P R A2 
              Coplanar Q P R B1 Coplanar Q P R C1 ¬ Col Q P R
              coplanar_pseudo_trans)
        moreover
        have "Coplanar A1 A2 B1 C2" 
          by (meson Coplanar Q P R A1 Coplanar Q P R A2
              Coplanar Q P R B1 Coplanar Q P R C2 ¬ Col Q P R
              coplanar_pseudo_trans)
        moreover
        have "Coplanar A1 A2 B2 C1" 
          by (meson Coplanar Q P R A1 Coplanar Q P R A2
              Coplanar Q P R B2 Coplanar Q P R C1 ¬ Col Q P R 
              coplanar_pseudo_trans)
        moreover
        have "Coplanar A1 A2 B2 C2" 
          by (meson Coplanar Q P R A1 Coplanar Q P R A2
              Coplanar Q P R B2 Coplanar Q P R C2 ¬ Col Q P R
              coplanar_pseudo_trans)
        moreover
        have "B1 B2 Perp A1 A2" 
          using Perp_perm A1 A2 Perp B1 B2 by blast
        moreover
        have "C1 C2 Perp A1 A2" 
          using Perp_perm A1 A2 Perp C1 C2 by blast
        ultimately
        show ?thesis 
          by (meson l12_9)
      qed
      moreover
      have "Col C1 C2 P" 
        by (simp add: Col C1 C2 P)
      moreover
      have "¬ Col B1 B2 P" 
        using ¬ Col B1 B2 P by auto
      ultimately
      show ?thesis 
        using par_not_col_strict by blast
    qed
    moreover
    have "¬ Col Q C1 C2" 
      using Col B1 B2 Q calculation 
        not_col_permutation_1 par_not_col by blast
    have "Per P Q R" 
    proof -
      have "B1 B2 Perp A1 A2" 
        using Perp_perm A1 A2 Perp B1 B2 by blast
      hence "A1 A2 Perp Q R" 
        using Q  R Col B1 B2 R Col B1 B2 Q perp_col0 by blast
      moreover
      have "Col A1 A2 Q" 
        using Col A1 A2 Q by auto
      moreover
      have" Col A1 A2 P" 
        by (simp add: Col A1 A2 P)
      ultimately
      show ?thesis 
        by (meson Q  P perp_col2 perp_per_2)
    qed
    have "P Q M P Q M SumA P Q R"
    proof -
      have "P Q M M Q R SumA P Q R" 
        by (simp add: M InAngle P Q R inangle__suma)
      moreover
      have "P Q M CongA P Q M" 
        using Q  M Q  P conga_refl by auto
      moreover
      have "M Q R CongA P Q M" 
        by (meson M Q P CongA M Q R conga_right_comm conga_sym)
      moreover
      have "P Q R CongA P Q R" 
        using Q  P Q  R conga_refl by auto
      ultimately
      show ?thesis 
        by (meson conga3_suma__suma)
    qed
    have "Acute P Q M" 
    proof -
      have "¬ Bet P Q R" 
        using Col_cases ¬ Col Q P R bet_col by blast
      moreover
      have "SAMS P Q M P Q M" 
        by (meson M InAngle P Q R M Q P CongA M Q R
            conga2_sams__sams conga_left_comm conga_sym 
            conga_trans inangle__sams)
      moreover
      have "P Q M P Q M SumA P Q R" 
        by (simp add: P Q M P Q M SumA P Q R)
      ultimately
      show ?thesis 
        using nbet_sams_suma__acute by blast
    qed
    have " C3. Col C1 C2 C3  P Q OS R C3" 
    proof -
      obtain C0 where "C1  C0" and "C2  C0" and 
        "P  C0" and "Col C1 C2 C0" 
        using Col C1 C2 P diff_col_ex3 by blast
      have " C3. Col C0 P C3  P Q OS R C3" 
      proof -
        have "C0  P" 
          using P  C0 by auto
        moreover
        have "Col P Q P" 
          using col_trivial_3 by blast
        moreover
        have "Col C0 P P" 
          by (simp add: col_trivial_2)
        moreover
        {
          assume "Col P Q C0" 
          hence "Col C1 C2 Q" 
            by (metis (full_types) Col C1 C2 C0 Col C1 C2 P 
                calculation(1) col_permutation_4 col_trivial_2 l6_21)
          hence "False" 
            using ¬ Col Q C1 C2 not_col_permutation_1 by blast
        }
        moreover
        have "¬ Col P Q R" 
          using Col_cases ¬ Col Q P R by blast
        moreover
        have "Coplanar P Q R C0" 
        proof -
          have "Coplanar P Q R C1" 
            using Coplanar Q P R C1 ncoplanar_perm_6 by blast
          moreover
          have "Coplanar P Q R C2" 
            by (simp add: Coplanar Q P R C2 coplanar_perm_6)
          ultimately
          show ?thesis 
            using C1  C2 Col C1 C2 C0 col_cop2__cop by blast
        qed
        hence "Coplanar P Q C0 R" 
          by (simp add: coplanar_perm_1)
        ultimately
        show ?thesis 
          using cop_not_par_same_side by blast
      qed
      then obtain C3 where "Col C0 P C3" and "P Q OS R C3" 
        by blast
      thus ?thesis 
        by (metis Col C1 C2 C0 Col C1 C2 P P  C0 colx)
    qed
    then obtain C3 where "Col C1 C2 C3" and "P Q OS R C3" 
      by blast
    have " S. Q Out M S  Col P C3 S" 
    proof -
      have "Q Out P P" 
        using Q  P out_trivial by auto
      moreover
      have "P  C3" 
        by (metis os_distincts P Q OS R C3)
      moreover
      have "Per Q P C3" 
      proof -
        have "A1 A2 Perp C1 C2" 
          by (simp add: A1 A2 Perp C1 C2)
        then obtain P' where "P' PerpAt A1 A2 C1 C2" 
          using perp_inter_perp_in_n by blast
        hence "Col P' A1 A2  Col P' C1 C2  
               ( U V.(Col U A1 A2  Col V C1 C2)Per U P' V)" 
          using PerpAt_def by blast
        hence " U V.(Col U A1 A2  Col V C1 C2)Per U P' V"
          by blast
        hence "P = P'" 
          by (metis Col_cases Col A1 A2 P Col C1 C2 P 
              P' PerpAt A1 A2 C1 C2 l8_14_2_1b)
        moreover
        have "Col Q A1 A2" 
          using NCol_cases Col A1 A2 Q by blast
        moreover
        have "Col C3 C1 C2" 
          by (simp add: Col C1 C2 C3 col_permutation_2)
        ultimately
        show ?thesis 
          using U V. Col U A1 A2  Col V C1 C2  Per U P' V by blast
      qed
      moreover
      have "Coplanar P Q M C3" 
      proof -
        have "Coplanar P Q R P" 
          using ncop_distincts by blast
        moreover
        have "Coplanar P Q R Q" 
          using ncop_distincts by blast
        moreover
        have "Coplanar P Q R M" 
          by (meson M InAngle P Q R inangle__coplanar 
              ncoplanar_perm_18)
        moreover
        have "Coplanar P Q R C3" 
          using P Q OS R C3 os__coplanar by auto
        ultimately
        show ?thesis 
          using Col_perm ¬ Col Q P R coplanar_pseudo_trans by blast
      qed
      ultimately
      show ?thesis 
        using Acute P Q M Per P Q R P Q M P Q M SumA P Q R 
          assms weak_inverse_projection_postulate_def by blast
    qed
    then obtain S where "Q Out M S" and "Col P C3 S" 
      by blast
    hence " S. Q Out M S  Col C1 C2 S" 
      by (metis Col C1 C2 C3 P Q OS R C3 Col C1 C2 P
          colx not_col_distincts one_side_not_col124)
    ultimately
    have "B1 B2 ParStrict C1 C2  ( S. Q Out M S  Col C1 C2 S)" 
      by blast
  }
  thus ?thesis 
    by blast
qed

lemma weak_inverse_projection_postulate__bachmann_s_lotschnittaxiom:
  assumes "weak_inverse_projection_postulate"
  shows "bachmann_s_lotschnittaxiom" 
proof -
  {
    fix A1 A2 B1 B2 C1 C2 D1 D2 Q P R
    assume "Q  P" and 
      "Q  R" and
      "A1 A2 Perp B1 B2" and
      "A1 A2 Perp C1 C2" and
      "B1 B2 Perp D1 D2" and
      "Col A1 A2 Q" and
      "Col B1 B2 Q" and 
      "Col A1 A2 P" and
      "Col C1 C2 P" and
      "Col B1 B2 R" and 
      "Col D1 D2 R" and
      "Coplanar Q P R C1" and 
      "Coplanar Q P R C2" and
      "Coplanar Q P R D1" and
      "Coplanar Q P R D2"
    have "Q P Perp R Q" 
      using Q  P Q  R Col A1 A2 Q Col A1 A2 P 
        Col B1 B2 R Col B1 B2 QA1 A2 Perp B1 B2
        perp_col4 by auto
    hence "¬ Col P Q R" 
      by (meson NCol_cases perp_not_col)
    have "P  Q" 
      using Q  P by auto
    have "R  Q" 
      using Q  R by blast
    obtain M where "(M InAngle P Q R)" and "(M Q P CongA M Q R)" 
      using angle_bisector P  Q R  Q by blast
    have "B1  B2" 
      using B1 B2 Perp D1 D2 col_trivial_1 perp_not_col2 by blast
    have "M  Q" 
      using M InAngle P Q R inangle_distincts by presburger
    have "P Q M P Q M SumA P Q R" 
    proof -
      have "P Q M M Q R SumA P Q R" 
        by (simp add: M InAngle P Q R inangle__suma)
      moreover
      have "P Q M CongA P Q M" 
        using M  Q Q  P conga_refl by auto
      moreover
      have "M Q R CongA P Q M" 
        by (meson M Q P CongA M Q R conga_right_comm conga_sym)
      moreover
      have "P Q R CongA P Q R" 
        using Q  P R  Q conga_refl by auto
      ultimately
      show ?thesis 
        by (meson conga3_suma__suma)
    qed
    have "Acute P Q M" 
    proof -
      have "¬ Bet P Q R" 
        using ¬ Col P Q R bet_col by force
      moreover
      have "SAMS P Q M P Q M" 
        by (meson M InAngle P Q R M Q P CongA M Q R 
            conga2_sams__sams conga_right_comm conga_trans 
            inangle__sams not_conga_sym)
      ultimately
      show ?thesis 
        by (meson P Q M P Q M SumA P Q R nbet_sams_suma__acute)
    qed
    have "B1 B2 ParStrict C1 C2  ( S. Q Out M S  Col C1 C2 S)" 
    proof -
      have "A1 A2 Perp B1 B2" 
        using A1 A2 Perp B1 B2 by auto
      moreover
      have "A1 A2 Perp C1 C2" 
        by (simp add: A1 A2 Perp C1 C2)
      moreover
      have "Col A1 A2 Q" 
        by (simp add: Col A1 A2 Q)
      moreover
      have "Col B1 B2 Q" 
        by (simp add: Col B1 B2 Q)
      moreover
      have "Col A1 A2 P" 
        by (simp add: Col A1 A2 P)
      moreover
      have "Col C1 C2 P" 
        by (simp add: Col C1 C2 P)
      moreover
      have "Col B1 B2 R" 
        using Col B1 B2 R by auto
      moreover
      have "Coplanar Q P R C1" 
        by (simp add: Coplanar Q P R C1)
      moreover
      have "Coplanar Q P R C2" 
        using Coplanar Q P R C2 by auto
      moreover
      have "¬ Col Q P R" 
        using Col_cases ¬ Col P Q R by blast
      moreover
      have "M InAngle P Q R" 
        by (simp add: M InAngle P Q R)
      moreover
      have "M Q P CongA M Q R"
        using M Q P CongA M Q R by blast
      ultimately
      show ?thesis 
        using assms 
          weak_inverse_projection_postulate__bachmann_s_lotschnittaxiom_aux
        by blast
    qed
    then obtain S where "Q Out M S" and "Col C1 C2 S" 
      by blast
    have "B1 B2 ParStrict C1 C2" 
      using B1 B2 ParStrict C1 C2  ( S. Q Out M S  Col C1 C2 S) by blast
    have "A1 A2 ParStrict D1 D2  ( T.  Q Out M T  Col D1 D2 T)"
    proof -
      have "B1 B2 Perp A1 A2" 
        using Perp_perm A1 A2 Perp B1 B2 by blast
      moreover
      have "B1 B2 Perp D1 D2" 
        by (simp add: B1 B2 Perp D1 D2)
      moreover
      have "Col B1 B2 Q" 
        by (simp add: Col B1 B2 Q)
      moreover
      have "Col A1 A2 Q" 
        using Col A1 A2 Q by blast
      moreover
      have "Col B1 B2 R" 
        by (simp add: Col B1 B2 R)
      moreover
      have "Col D1 D2 R" 
        by (simp add: Col D1 D2 R)
      moreover
      have "Col A1 A2 P" 
        using Col A1 A2 P by auto
      moreover
      have "Coplanar Q R P D1" 
        by (simp add: Coplanar Q P R D1 coplanar_perm_2)
      moreover
      have "Coplanar Q R P D2" 
        using Coplanar Q P R D2 coplanar_perm_2 by blast
      moreover
      have "¬ Col Q R P" 
        using Col_cases ¬ Col P Q R by blast
      moreover
      have "M InAngle R Q P" 
        by (simp add: M InAngle P Q R l11_24)
      moreover
      have "M Q R CongA M Q P" 
        by (simp add: M Q P CongA M Q R conga_sym_equiv)
      ultimately
      show ?thesis
        using assms 
          weak_inverse_projection_postulate__bachmann_s_lotschnittaxiom_aux 
        by blast
    qed
    then obtain T where "Q Out M T" and "Col D1 D2 T" 
      by blast
    have "A1 A2 ParStrict D1 D2"
      using A1 A2 ParStrict D1 D2  ( T.  Q Out M T  Col D1 D2 T) by blast
    have " I. Col C1 C2 I  Col D1 D2 I" 
    proof (cases "Col C1 C2 T")
      case True
      thus ?thesis 
        using Col D1 D2 T by auto
    next
      case False
      hence "¬ Col C1 C2 T" 
        by blast
      show ?thesis 
      proof (cases "Col D1 D2 S")
        case True
        thus ?thesis 
          using Col C1 C2 S by auto
      next
        case False
        hence "¬ Col D1 D2 S"
          by auto
        have "Q Out S T" 
          using Out_cases Q Out M S Q Out M T l6_7 by blast
        have "S  Q" 
          using Q Out M S l6_3_1 by blast
        have "T  Q" 
          using Q Out M T l6_3_1 by blast
        {
          assume "Bet Q S T" 
          have "C1 C2 TS R T" 
          proof -
            have "C1 C2 TS Q T" 
              by (metis TS_def Bet Q S T Col C1 C2 S 
                  S  Q ¬ Col C1 C2 T bet_col colx 
                  not_col_permutation_2)
            moreover
            have "C1 C2 ParStrict Q R" 
              by (metis Par_strict_cases B1 B2 ParStrict C1 C2 
                  Col B1 B2 Q Col B1 B2 R R  Q 
                  par_strict_col2_par_strict)
            hence "C1 C2 OS Q R" 
              using l12_6 by blast
            ultimately
            show ?thesis 
              using l9_8_2 by blast
          qed
          then obtain I where "Col I C1 C2" and "Bet R I T" 
            using TS_def by blast
          have "T  R" 
            using C1 C2 TS R T ts_distincts by blast
          hence " I. Col C1 C2 I  Col D1 D2 I" 
            by (meson Bet R I T Col D1 D2 R Col D1 D2 T 
                Col I C1 C2 bet_col colx not_col_permutation_2)
        }
        moreover
        {
          assume "Bet Q T S" 
          have "D1 D2 TS P S" 
          proof -
            have "D1 D2 TS Q S" 
              by (metis Col_cases False Bet Q T S Col D1 D2 T 
                  T  Q bet_col colx l9_18)
            moreover
            have "D1 D2 ParStrict A1 A2" 
              by (meson A1 A2 ParStrict D1 D2 par_strict_symmetry)
            hence "D1 D2 ParStrict Q P" 
              using Q  P Col A1 A2 Q Col A1 A2 P
                par_strict_col2_par_strict by blast
            hence "D1 D2 OS Q P" 
              by (simp add: l12_6)
            ultimately
            show ?thesis 
              using l9_8_2 by blast
          qed
          then obtain I where "Col I D1 D2" and "Bet P I S" 
            using TS_def by blast
          hence "Col D1 D2 I" 
            using Col_cases by blast
          have "P  S" 
            using D1 D2 TS P S not_two_sides_id by blast
          hence " I. Col C1 C2 I  Col D1 D2 I" 
            by (metis (full_types) Col C1 C2 P Col C1 C2 S
                thesis. (I. Col I D1 D2; Bet P I S  thesis)  thesis 
                bet_col col_trivial_2 l6_21 not_col_permutation_2)
        }
        ultimately
        show ?thesis 
          using Out_def Q Out S T by force
      qed
    qed
  }
  thus ?thesis  
    using bachmann_s_lotschnittaxiom_aux_R2 by blast
qed

lemma weak_triangle_circumscription_principle__bachmann_s_lotschnittaxiom:
  assumes "weak_triangle_circumscription_principle" 
  shows "bachmann_s_lotschnittaxiom" 
proof -
  {
    fix A1 A2 B1 B2 C1 C2 D1 D2 IAB IAC IBD
    assume "IAB  IAC" and "IAB  IBD" and 
      "A1 A2 Perp B1 B2" and 
      "A1 A2 Perp C1 C2" and
      "B1 B2 Perp D1 D2" and
      "Col A1 A2 IAB" and
      "Col B1 B2 IAB" and 
      "Col A1 A2 IAC" and
      "Col C1 C2 IAC" and
      "Col B1 B2 IBD" and 
      "Col D1 D2 IBD" and
      "Coplanar IAB IAC IBD C1" and 
      "Coplanar IAB IAC IBD C2" and
      "Coplanar IAB IAC IBD D1" and
      "Coplanar IAB IAC IBD D2"
    obtain E where "IAC Midpoint IAB E" 
      using symmetric_point_construction by blast
    hence "Bet IAB IAC E" 
      using midpoint_bet by auto
    hence "Col IAB IAC E" 
      using Col_def by blast
    obtain F where "IBD Midpoint IAB F" 
      using symmetric_point_construction by blast
    hence "Bet IAB IBD F" 
      using midpoint_bet by auto
    hence "Col IAB IBD F" 
      using Col_def by blast
    have "IAB  F" 
      using Bet IAB IBD F IAB  IBD between_identity by blast
    have "IAB  E" 
      using IAB  IAC IAC Midpoint IAB E l8_20_2 by blast
    have "E IAB Perp IAB F" 
    proof -
      have "B1 B2 Perp E IAB" 
      proof -
        have "A1 A2 Perp B1 B2" 
          using A1 A2 Perp B1 B2 by blast
        moreover
        have "E  IAB" 
          using IAB  E by blast
        moreover
        have "Col A1 A2 E" 
          using Col A1 A2 IAB Col A1 A2 IAC Col IAB IAC E
            IAB  IAC colx by blast
        moreover
        have "Col A1 A2 IAB" 
          by (simp add: Col A1 A2 IAB)
        ultimately
        show ?thesis 
          using perp_col0 by blast
      qed
      moreover
      have "IAB  F" 
        using IAB  F by auto
      moreover
      have "Col B1 B2 IAB" 
        by (simp add: Col B1 B2 IAB)
      moreover
      have "Col B1 B2 F" 
        using Col B1 B2 IBD Col IAB IBD F IAB  IBD
          calculation(3) colx by blast
      ultimately
      show ?thesis 
        using perp_col0 by blast
    qed
    have "Per IAC IAB IBD" 
    proof -
      have "IAB  F" 
        by (simp add: IAB  F)
      moreover
      have "Per IAC IAB F" 
      proof -
        have "IAB  E" 
          using IAB  E by blast
        moreover
        have "Per F IAB E" 
          using Perp_perm E IAB Perp IAB F perp_per_2 by blast
        moreover
        have "Col IAB E IAC" 
          using Col IAB IAC E not_col_permutation_5 by blast
        ultimately
        show ?thesis 
          using l8_2 per_col by blast
      qed
      moreover
      have "Col IAB F IBD" 
        using Col IAB IBD F not_col_permutation_5 by blast
      ultimately
      show ?thesis 
        using per_col by blast
    qed
    hence "¬ Col IAC IAB IBD" 
      using IAB  IAC IAB  IBD l8_9 by blast
    have " I. Col C1 C2 I  Col D1 D2 I" 
    proof -
      have "¬ Col E F IAB" 
        by (metis Col IAB IAC E Col IAB IBD F IAB  E 
            IAB  F ¬ Col IAC IAB IBD col_permutation_1 
            col_transitivity_2)
      moreover
      have "E IAB Perp F IAB" 
        by (simp add: E IAB Perp IAB F perp_right_comm)
      hence "Per E IAB F" 
        using Perp_cases perp_per_2 by blast
      moreover
      have "F IAB ReflectL D1 D2" 
      proof -
        have "IBD Midpoint IAB F" 
          by (simp add: IBD Midpoint IAB F)
        moreover
        have "Col D1 D2 IBD" 
          by (simp add: Col D1 D2 IBD)
        moreover
        have "D1 D2 Perp IAB F"
        proof -
          have "B1 B2 Perp D1 D2" 
            using B1 B2 Perp D1 D2 by blast
          moreover
          have "IAB  F" 
            using IAB  F by auto
          moreover
          have "Col B1 B2 IAB" 
            by (simp add: Col B1 B2 IAB)
          moreover
          have "Col B1 B2 F" 
            using Col B1 B2 IBD Col IAB IBD F IAB  IBD
              calculation(3) colx by blast
          ultimately
          show ?thesis 
            using perp_col0 by blast
        qed
        hence "(D1 D2 Perp IAB F)  (IAB = F)" 
          by blast
        ultimately
        show ?thesis 
          using ReflectL_def by blast
      qed
      hence "D1 D2 PerpBisect F IAB" 
        using Perp_bisect_def IAB  F by blast
      moreover
      have "E IAB ReflectL C1 C2" 
      proof -
        have "IAC Midpoint IAB E" 
          by (simp add: IAC Midpoint IAB E)
        moreover
        have "Col C1 C2 IAC" 
          by (simp add: Col C1 C2 IAC)
        moreover
        have "C1 C2 Perp IAB E"
        proof -
          have "A1 A2 Perp C1 C2" 
            by (simp add: A1 A2 Perp C1 C2)
          moreover
          have "IAB  E" 
            using IAB  E by auto
          moreover
          have "Col A1 A2 IAB" 
            by (simp add: Col A1 A2 IAB)
          moreover
          have "Col A1 A2 E" 
            using Col A1 A2 IAC Col IAB IAC E IAB  IAC
              calculation(3) colx by blast
          ultimately
          show ?thesis 
            using perp_col0 by blast
        qed
        hence "(C1 C2 Perp IAB E)  (IAB = E)" 
          by blast
        ultimately
        show ?thesis 
          using ReflectL_def by blast
      qed
      hence "C1 C2 PerpBisect E IAB" 
        using Perp_bisect_def IAB  E by blast
      moreover
      have "Coplanar E F IAB D1" 
      proof -
        have "Coplanar IAB IAC IBD E" 
          using Col IAB IAC E ncop__ncols by blast
        moreover
        have "Coplanar IAB IAC IBD F" 
          using Col IAB IBD F ncop__ncols by blast
        moreover
        have "Coplanar IAB IAC IBD IAB" 
          using Coplanar IAB IAC IBD D1 ncop_distincts by blast
        ultimately
        show ?thesis 
          by (meson Coplanar IAB IAC IBD D1 ¬ Col IAC IAB IBD
              col_permutation_4 coplanar_pseudo_trans)
      qed
      moreover
      have "Coplanar E F IAB D2" 
      proof -
        have "Coplanar IAB IAC IBD E" 
          using Col IAB IAC E ncop__ncols by blast
        moreover
        have "Coplanar IAB IAC IBD F" 
          using Col IAB IBD F ncop__ncols by blast
        moreover
        have "Coplanar IAB IAC IBD IAB" 
          using ncop_distincts by blast
        moreover
        have "Coplanar IAB IAC IBD D2" 
          using Coplanar IAB IAC IBD D2 by blast
        ultimately
        show ?thesis 
          using NCol_perm ¬ Col IAC IAB IBD coplanar_pseudo_trans by blast
      qed
      moreover
      have "Coplanar E F IAB C1" 
      proof -
        have "Coplanar IAB IAC IBD E" 
          using Col IAB IAC E ncop__ncols by blast
        moreover
        have "Coplanar IAB IAC IBD F" 
          using Col IAB IBD F ncop__ncols by blast
        moreover
        have "Coplanar IAB IAC IBD IAB" 
          using ncop_distincts by blast
        ultimately
        show ?thesis 
          using Col_perm Coplanar IAB IAC IBD C1 
            ¬ Col IAC IAB IBD coplanar_pseudo_trans by blast
      qed
      moreover
      have "Coplanar E F IAB C2" 
      proof -
        have "Coplanar IAB IAC IBD E" 
          using Col IAB IAC E ncop__ncols by blast
        moreover
        have "Coplanar IAB IAC IBD F" 
          using Col IAB IBD F ncop__ncols by blast
        moreover
        have "Coplanar IAB IAC IBD IAB" 
          using ncop_distincts by blast
        moreover
        have "Coplanar IAB IAC IBD C2" 
          using Coplanar IAB IAC IBD C2 by auto
        ultimately
        show ?thesis 
          using NCol_cases ¬ Col IAC IAB IBD 
            coplanar_pseudo_trans by blast
      qed
      ultimately
      show ?thesis 
        using assms weak_triangle_circumscription_principle_def by blast
    qed
  }
  thus ?thesis
    using bachmann_s_lotschnittaxiom_aux_R2 by blast
qed

lemma universal_posidonius_postulate__perpendicular_transversal_postulate_aux_lem:
  fixes A1 A2 B1 B2 C1 C2 D1 D2 IAB IAC IBD
  assumes 
    "IAB  IAC" and 
    "IAB  IBD" and
    "A1 A2 Perp B1 B2" and
    "A1 A2 Perp C1 C2" and
    "B1 B2 Perp D1 D2" and 
    "Col A1 A2 IAB" and
    "Col B1 B2 IAB" and
    "Col A1 A2 IAC" and
    "Col C1 C2 IAC" and
    "Col B1 B2 IBD" and
    "Col D1 D2 IBD" and
    "Coplanar IAB IAC IBD C1" and
    "Coplanar IAB IAC IBD C2" and
    "Coplanar IAB IAC IBD D1" and
    "Coplanar IAB IAC IBD D2" and
    "postulate_of_right_saccheri_quadrilaterals" 
  shows " I. Col C1 C2 I  Col D1 D2 I" 
proof - 
  have "thales_postulate" 
    using assms(16) rah__thales_postulate by blast
  hence "thales_converse_postulate" 
    using thales_postulate__thales_converse_postulate by blast
  hence "weak_triangle_circumscription_principle"
    using thales_converse_postulate__weak_triangle_circumscription_principle
    by blast
  hence "bachmann_s_lotschnittaxiom" 
    using weak_triangle_circumscription_principle__bachmann_s_lotschnittaxiom
    by blast
  thus ?thesis 
    using assms(1) assms(2) assms(3) assms(4) assms(5)
      assms(6) assms(7) assms(8) assms(9) 
      assms(10) assms(11) assms(12)
      assms(13) assms(14) assms(15) 
      bachmann_s_lotschnittaxiom_aux_R1 by blast
qed

lemma universal_posidonius_postulate__perpendicular_transversal_postulate_aux:
  assumes "universal_posidonius_postulate"
  shows " E F G H R P.
  E G Perp R P  Coplanar F H P R  Col E G R  Saccheri E F H G 
  F H Perp P R" 
proof -
  {
    fix E F G H R P
    assume "E G Perp R P" and "Coplanar F H P R" and 
      "Col E G R" and "Saccheri E F H G"
    have "Per F E G" 
      using Saccheri E F H G perp_per_2 sac__perp1214 by blast
    have "E G Perp E F" 
      using Perp_cases Saccheri E F H G sac__perp1214 by blast
    have "E G ParStrict F H" 
      by (simp add: Saccheri E F H G sac__pars1423)
    hence "E  G" 
      using par_strict_distinct by presburger
    have "E  F" 
      using E G Perp E F perp_distinct by blast
    have "P  R" 
      using E G Perp R P perp_distinct by blast
    have "E  H" 
      using Saccheri E F H G sac_distincts by blast
    have "F  H" 
      using E G ParStrict F H par_strict_distinct by auto
    have "postulate_of_right_saccheri_quadrilaterals" 
    proof -
      obtain M1 where "M1 Midpoint E G" 
        using midpoint_existence by presburger
      hence "Bet E M1 G" 
        by (simp add: midpoint_bet)
      obtain M2 where "M2 Midpoint F H"       
        using midpoint_existence by presburger
      hence "Bet F M2 H" 
        by (simp add: midpoint_bet)
      have "Lambert M1 M2 F E" 
        using mid2_sac__lam6521 M1 Midpoint E G M2 Midpoint F H
          Saccheri E F H G by blast
      have "M1  M2"
        using Lambert M1 M2 F E Lambert_def by blast
      have "F  M2"
        using Lambert M1 M2 F E Lambert_def by blast
      have "F  E"
        using Lambert M1 M2 F E Lambert_def by blast
      have "M1  E"
        using Lambert M1 M2 F E Lambert_def by blast
      have "Per M2 M1 E" 
        using Lambert M1 M2 F E Lambert_def by blast
      have "Per M1 E F" 
        using Lambert M1 M2 F E Lambert_def by blast
      have "Per M1 M2 F" 
        using Lambert M1 M2 F E Lambert_def by blast
      have "Coplanar M1 M2 F E" 
        using Lambert M1 M2 F E Lambert_def by blast    
      have "Saccheri M1 M2 F E" 
      proof -
        have "Cong F E M1 M2" 
        proof -
          have "E G Par F H" 
            using Saccheri E F H G sac__par1423 by blast
          moreover
          have "Col E G E" 
            by (simp add: col_trivial_3)
          moreover
          have "Col F H F" 
            by (simp add: col_trivial_3)
          moreover
          have "E G Perp E F" 
            by (simp add: E G Perp E F)
          moreover
          have "Col E G M1" 
            using Bet E M1 G bet_col not_col_permutation_5 by blast
          moreover
          have "Col F H M2" 
            using Bet F M2 H bet_col col_permutation_5 by blast
          moreover
          have "E G Perp M1 M2" 
          proof -
            have "E M1 Perp M1 M2" 
              by (metis l8_2 M1  E M1  M2 Per M2 M1 E per_perp)
            moreover
            have "Col E M1 E" 
              by (simp add: col_trivial_3)
            moreover
            have "Col E M1 G" 
              by (simp add: Col_def Bet E M1 G)
            ultimately
            show ?thesis 
              using E  G perp_col2 by blast
          qed
          ultimately
          show ?thesis 
            using assms universal_posidonius_postulate_def
              cong_left_commutativity by blast
        qed
        hence "Cong M1 M2 F E" 
          using cong_symmetry by blast
        moreover
        have "M1 E ParStrict M2 F" 
        proof -
          have "M1  E" 
            by (simp add: M1  E)
          moreover have "M2  F" 
            using F  M2 by blast
          moreover have "Col E G M1" 
            using Bet E M1 G bet_col not_col_permutation_5 by blast
          moreover
          have "Col E G E" 
            by (simp add: col_trivial_3)
          moreover
          have "Col F H M2" 
            using Bet F M2 H bet_col col_permutation_5 by blast
          moreover
          have "Col F H F" 
            by (simp add: col_trivial_3)
          moreover  have "E G ParStrict F H" 
            by (simp add: E G ParStrict F H)
          ultimately
          show ?thesis 
            using par_strict_col4__par_strict by blast
        qed
        hence "M1 E OS M2 F" 
          using l12_6 by auto
        ultimately
        show ?thesis
          using Per M2 M1 E Per M1 E F 
          by (simp add: Saccheri_def)
      qed
      thus ?thesis 
        using Per M1 M2 F per_sac__rah 
          existential_playfair__rah_1 by blast
    qed
    have "F H Perp P R" 
    proof (cases "E = R")
      case True
      hence "E P Perp F H" 
      proof -
        have "Col F P E" 
        proof -
          have "Coplanar G F P E" 
          proof -
            have "Coplanar H R F G" 
              using True E G ParStrict F H ncoplanar_perm_11 
                pars__coplanar by blast
            moreover have "Coplanar H R F F" 
              using ncop_distincts by blast
            moreover have "Coplanar H R F P" 
              using Coplanar F H P R ncoplanar_perm_13 by blast
            moreover have "Coplanar H R F E" 
              using True ncop_distincts by blast
            ultimately show ?thesis 
              using ParStrict_def True E G ParStrict F H 
                col_trivial_1 coplanar_pseudo_trans 
                not_col_permutation_2 by blast
          qed
          moreover
          have "Per P E G" 
            using True E G Perp R P l8_2 perp_per_2 by blast
          ultimately
          show ?thesis 
            using E  G Per F E G cop_per2__col by blast  
        qed
        hence "Col E F P" 
          by (simp add: col_permutation_2)
        moreover
        have "Per E F H" 
          using Saccheri E F H G 
            postulate_of_right_saccheri_quadrilaterals 
            postulate_of_right_saccheri_quadrilaterals_def by blast
        hence "E F Perp F H" 
          by (simp add: E  F F  H per_perp)
        ultimately
        show ?thesis 
          using True P  R col_trivial_3 perp_col2 by metis
      qed
      thus ?thesis 
        using Perp_perm True by blast
    next
      case False
      have "¬ Col F H R" 
        by (meson Col E G R E G ParStrict F H 
            not_col_permutation_1 par_not_col)
      have " I. Col P R I  Col F H I" 
      proof -
        have "E  F" 
          by (simp add: E  F)
        moreover
        have "E G Perp E F" 
          by (simp add: E G Perp E F)
        moreover
        have "E G Perp P R" 
          using Perp_cases E G Perp R P by blast
        moreover
        have "Per E F H" 
          using Saccheri E F H G 
            postulate_of_right_saccheri_quadrilaterals 
            postulate_of_right_saccheri_quadrilaterals_def by blast
        hence "E F Perp F H" 
          by (simp add: E  F F  H per_perp)
        moreover
        have "Col E G E" 
          by (simp add: col_trivial_3)
        moreover
        have "Col E F E" 
          by (simp add: col_trivial_3)
        moreover
        have "Col E G R" 
          by (simp add: Col E G R)
        moreover
        have "Col P R R" 
          by (simp add: col_trivial_2)
        moreover
        have "Col E F F" 
          using col_trivial_2 by auto
        moreover
        have "Col F H F" 
          by (simp add: col_trivial_3)
        moreover
        have "Coplanar E R F P" 
        proof -
          have "Coplanar F H R P" 
            using Coplanar F H P R coplanar_perm_1 by blast
          moreover
          have "Coplanar F H R E" 
            by (metis False Col E G E Col E G R 
                E G ParStrict F H par_strict_col2_par_strict 
                par_strict_symmetry pars__coplanar)
          moreover
          have "Coplanar F H R F" 
            using ncop_distincts by blast
          moreover
          have "Coplanar F H R R" 
            using ncop_distincts by blast
          ultimately
          show ?thesis 
            by (meson ¬ Col F H R coplanar_pseudo_trans)
        qed
        moreover
        have "Coplanar E R F R" 
          using ncop_distincts by blast
        moreover
        have "Coplanar E R F F" 
          using ncop_distincts by blast
        moreover
        have "Coplanar F H E R" 
          by (meson False Col E G R E G ParStrict F H 
              col_trivial_3 par_strict_col2_par_strict 
              par_strict_symmetry pars__coplanar)
        hence "Coplanar E R F H" 
          by (simp add: coplanar_perm_16)
        ultimately
        show ?thesis 
          using False postulate_of_right_saccheri_quadrilaterals 
            universal_posidonius_postulate__perpendicular_transversal_postulate_aux_lem 
          by blast
      qed
      then obtain S where "Col P R S" and "Col F H S" 
        by blast
      have "S  R" 
        using Col F H S ¬ Col F H R by auto
      have "Saccheri E F S R" 
      proof -
        have "Per F E R" 
        proof -
          have "E  G" 
            by (simp add: E  G)
          moreover
          have "Per F E G" 
            using Saccheri E F H G perp_per_2 sac__perp1214 by blast
          ultimately
          show ?thesis 
            using  Col E G R per_col by blast
        qed
        moreover
        have "R E Perp S R" 
        proof -
          have "Col E G E" 
            by (simp add: col_trivial_3)
          moreover
          have "Col R P S" 
            using Col_cases Col P R S by blast
          moreover
          have "Col R P R" 
            by (simp add: col_trivial_3)
          ultimately
          show ?thesis 
            using False S  R E G Perp R P  
              Col E G R perp_col4 by auto
        qed
        hence "Per E R S" 
          using perp_per_1 by force
        moreover
        have "Cong E F R S" 
        proof -
          have "E G Par F H" 
            using E G ParStrict F H par_strict_par by auto
          moreover
          have "Col E G E" 
            by (simp add: col_trivial_3)
          moreover
          have "Col F H F" 
            by (simp add: col_trivial_3)
          moreover
          have "E G Perp R S" 
          proof -
            have "R P Perp E G" 
              using Perp_perm E G Perp R P by blast
            moreover
            have "Col R P S" 
              using Col P R S not_col_permutation_4 by blast
            ultimately
            show ?thesis 
              using E G Perp R P S  R perp_col1 by auto
          qed
          ultimately
          show ?thesis 
            using E G Perp E F Col E G R Col F H S 
              assms universal_posidonius_postulate_def by blast
        qed
        hence "Cong E F S R" 
          using not_cong_1243 by blast
        moreover
        have "E R OS F S" 
        proof -
          {
            assume "F = S"
            hence "¬ Col E G F" 
              by (meson Col F H S E G ParStrict F H 
                  not_col_permutation_1 par_not_col)
            have "Col E P R" 
            proof -
              have "F E Perp E G" 
                using Perp_cases E G Perp E F by blast
              moreover
              have "P R Perp E G" 
                using Perp_perm E G Perp R P by blast
              moreover
              have "Col F P R" 
                by (simp add: Col P R S F = S col_permutation_2)
              moreover
              have "Coplanar E G E P" 
                using ncop_distincts by blast
              moreover
              have "Coplanar E G E R" 
                using ncop_distincts by blast
              ultimately
              show ?thesis 
                using col_cop2_perp2__col by blast
            qed
            hence False 
              by (metis False Col E G R E G Perp R P 
                  col_trivial_3 l6_21 not_col_permutation_2
                  perp_not_col2)
          }
          moreover
          have "E R ParStrict F H" 
            by (meson False Col E G R E G ParStrict F H 
                F  H col_trivial_2 col_trivial_3 
                par_strict_col4__par_strict)
          ultimately
          show ?thesis 
            using Col F H S par_strict_one_side by blast
        qed
        ultimately
        show ?thesis 
          using Saccheri_def by blast
      qed
      have "F  S" 
        using Saccheri E F S R sac_distincts by blast
      have "F S Perp P R" 
      proof -
        have "R  P" 
          using P  R by auto
        moreover
        have "Saccheri R S F E" 
          by (simp add:  Saccheri E F S R sac_perm)
        hence "Per R S F" 
          using postulate_of_right_saccheri_quadrilaterals 
            postulate_of_right_saccheri_quadrilaterals_def by blast
        hence "R S Perp S F" 
          using F  S S  R per_perp by auto
        moreover
        have "Col R S P" 
          using Col P R S not_col_permutation_2 by blast
        ultimately
        show ?thesis 
          using Perp_perm perp_col by blast
      qed
      moreover
      have "Col F S H" 
        using Col_cases Col F H S by blast
      ultimately
      show ?thesis 
        using F  H perp_col by blast
    qed
  }
  thus ?thesis 
    by blast
qed

lemma universal_posidonius_postulate__perpendicular_transversal_postulate:
  assumes "universal_posidonius_postulate"
  shows "perpendicular_transversal_postulate" 
proof -
  {
    fix A B C D P Q
    assume "A B Par C D" and 
      "A B Perp P Q" and 
      "Coplanar C D P Q"
    {
      fix P Q
      assume "A B Perp P Q" and 
        "Coplanar C D P Q" and
        "¬ Col A B P" 
      have "A B Par C D" 
        using A B Par C D by auto
      hence "A B ParStrict C D  (A  B  C  D  Col A C D  Col B C D)"
        by (simp add: Par_def)
      moreover
      {
        assume "A B ParStrict C D"
        obtain R where "Col A B R" and "Col P Q R" 
          using A B Perp P Q perp_inter_exists by blast
        have "¬ Col A B C" 
          using A B ParStrict C D l12_6 one_side_not_col123 by blast
        then obtain E where "Col A B E" and "A B Perp C E" 
          using l8_18_existence by blast
        have "¬ Col A B D" 
          using A B ParStrict C D par_strict_not_col_4 by auto
        then obtain G where "Col A B G" and "A B Perp D G" 
          using l8_18_existence by blast
        {
          assume "E = G" 
          hence "Col C D E" 
          proof -
            have "E C Perp A B" 
              using Perp_perm A B Perp C E by blast
            moreover
            have "D E Perp A B" 
              using Perp_cases A B Perp D G E = G by blast
            moreover
            have "Col E D E" 
              by (simp add: col_trivial_3)
            moreover
            have "Coplanar A B C D" 
              by (simp add: A B ParStrict C D pars__coplanar)
            moreover
            have "Coplanar A B C E" 
              using Col A B E ncop__ncols by blast
            ultimately
            show ?thesis 
              using col_cop2_perp2__col by blast
          qed
          hence "Col E A B  Col E C D" 
            using Col_cases Col A B E by blast
          hence False 
            using A B Par C D Col A B G Col C D E E = G
              ¬ Col A B C not_strict_par by blast
        }
        have "Saccheri E C D G" 
        proof -
          have "A B Perp E C" 
            by (simp add: A B Perp C E perp_right_comm)
          hence "Per C E G" 
            using Col A B E Col A B G A B Perp C E
              l8_16_1 by blast
          moreover
          have "Per E G D" 
            using A B Perp D G Col A B G Col A B E
              Per_perm l8_16_1 by blast
          moreover
          have "Cong E C D G" 
          proof -
            have "Col C D C" 
              by (simp add: col_trivial_3)
            moreover
            have "Col C D D" 
              by (simp add: col_trivial_2)
            moreover
            have "A B Perp G D" 
              by (simp add:A B Perp D G perp_right_comm)
            ultimately
            show ?thesis 
              using assms A B Par C D Col A B E A B Perp E C
                Col A B G  not_cong_1243 
                universal_posidonius_postulate_def by blast
          qed
          moreover
          have "C D ParStrict A B" 
            using A B ParStrict C D par_strict_symmetry by blast
          hence "C D ParStrict E G" 
            using Col A B E Col A B G E = G  False 
              par_strict_col2_par_strict by blast
          hence "E G OS C D" 
            by (simp add: pars__os3412)
          ultimately
          show ?thesis 
            using Saccheri_def by blast
        qed
        have "P  Q" 
          using A B Perp P Q perp_distinct by auto
        have "P  R" 
          using Col A B R ¬ Col A B P by auto
        have "A  B" 
          using ¬ Col A B C col_trivial_1 by auto
        have "C D Perp P R" 
        proof -
          have "A B Perp R P" 
            by (meson A B Perp P Q Col P Q R P  R 
                perp_col1 perp_right_comm)
          hence "E G Perp R P" 
            using Col A B E Col A B G E = G  False 
              perp_col2 by blast
          moreover
          have "Coplanar C D P R" 
            using Coplanar C D P Q Col P Q R P  Q 
              col_cop__cop by blast
          moreover
          have "Col E G R" 
            using Col A B R Col A B E Col A B G
              A  B col3 by blast
          ultimately
          show ?thesis 
            using assms 
              universal_posidonius_postulate__perpendicular_transversal_postulate_aux 
              Saccheri E C D G by blast
        qed
        hence "P R Perp C D" 
          using Perp_perm by blast
        hence "C D Perp P Q" 
          using NCol_perm Perp_cases Col P Q R P  Q 
            perp_col1 by blast
      }
      moreover
      have "(A  B  C  D  Col A C D  Col B C D)  C D Perp P Q" 
        by (meson A B Par C D A B Perp P Q not_col_distincts 
            not_col_permutation_2 not_strict_par perp_col2)
      ultimately
      have "C D Perp P Q" 
        by blast
    }
    moreover
    have "¬ Col A B P  C D Perp P Q" 
      by (simp add: A B Perp P Q Coplanar C D P Q calculation)
    moreover
    have "¬ Col A B Q  C D Perp P Q" 
      using A B Perp P Q Coplanar C D P Q calculation(1)
        ncoplanar_perm_1 perp_right_comm by blast
    ultimately
    have "C D Perp P Q" 
      using A B Perp P Q Coplanar C D P Q perp_not_col2 by blast
  }
  thus ?thesis 
    using perpendicular_transversal_postulate_def by blast
qed

lemma playfair__alternate_interior:
  assumes "playfair_s_postulate"
  shows "alternate_interior_angles_postulate" 
proof -
  {
    fix A B C D
    assume "A C TS B D" and
      "A B Par C D"
    have "¬ Col A B C" 
      using TS_def A C TS B D not_col_permutation_4 by blast
    hence "¬ Col B A C  ¬ Col A C B" 
      using Col_cases by blast
    then obtain D' where "B A C CongA A C D'" and "A C TS D' B" 
      using ex_conga_ts by blast
    have "B A C CongA D' C A" 
      by (simp add: B A C CongA A C D' conga_right_comm)
    moreover
    have "D' C A CongA D C A" 
    proof -
      have "C Out D D'" 
      proof -
        have "Col C C D  Col D' C D" 
        proof -
          have "A B Par C D" 
            using A B Par C D by auto
          moreover
          have "Col C C D" 
            by (simp add: col_trivial_1)
          moreover
          have "A B Par C D'" 
          proof -
            have "A C TS B D'" 
              by (meson A C TS D' B l9_2)
            moreover
            have "B A C CongA D' C A" 
              by (simp add: B A C CongA D' C A)
            ultimately
            show ?thesis 
              using l12_21_b by blast 
          qed
          moreover
          have "Col C C D'" 
            using col_trivial_1 by blast
          ultimately
          show ?thesis
            using assms playfair_s_postulate_def by blast
        qed
        hence "Col C D D'" 
          using not_col_permutation_1 by blast
        moreover
        have "A C OS D D'" 
          using A C TS B D A C TS D' B l9_2 l9_8_1 by blast
        hence "C A OS D D'" 
          by (simp add: invert_one_side)
        ultimately
        show ?thesis 
          using col_one_side_out by blast
      qed
      moreover
      have "C Out A A" 
        using ¬ Col B A C  ¬ Col A C B 
          not_col_distincts out_trivial by blast
      ultimately
      show ?thesis 
        by (simp add: out2__conga)
    qed
    ultimately
    have "B A C CongA D C A" 
      by (meson conga_trans)
  }
  thus ?thesis 
    using alternate_interior_angles_postulate_def by presburger
qed

lemma playfair_bis__playfair:
  assumes "alternative_playfair_s_postulate"
  shows "playfair_s_postulate" 
proof -
  {
    fix A1 A2 B1 B2 C1 C2 P
    assume "A1 A2 Par B1 B2" and
      "Col P B1 B2" and
      "A1 A2 Par C1 C2" and
      "Col P C1 C2"
    have "Col C1 B1 B2  Col C2 B1 B2" 
    proof (cases "Col A1 A2 P")
      case True
      {
        assume H1: "(A1  A2  B1  B2  Col A1 B1 B2  Col A2 B1 B2 ) 
(Col C1 B1 B2  Col C2 B1 B2)"
        have ?thesis 
          by (metis Par_def True A1 A2 Par B1 B2 H1 
              Col P B1 B2 col_permutation_2 par_not_col)
      }
      moreover
      have "A1 A2 ParStrict C1 C2  ?thesis" 
        by (metis True A1 A2 Par C1 C2 Col P C1 C2 
            inter_uniqueness_not_par not_col_permutation_2
            par_strict_not_col_1)
      ultimately
      show ?thesis using A1 A2 Par C1 C2 
        by (metis True Col P C1 C2 col_permutation_2 colx not_strict_par)
    next
      case False
      have "A1  A2" 
        using False not_col_distincts by presburger
      then obtain X where "P X Perp A1 A2"
        using perp_exists by blast
      {
        assume H2: " A1 A2. (A1 A2 Par B1 B2 
                          A1 A2 Par C1 C2  ¬ Col A1 A2 P 
                          P X Perp A1 A2  ¬ Col P X A1) 
                    
                         (Col C1 B1 B2  Col C2 B1 B2)"
        fix A1 A2
        assume "A1 A2 Par B1 B2" and
          "A1 A2 Par C1 C2" and
          "¬ Col A1 A2 P" and
          "P X Perp A1 A2"
        {
          assume "Col P X A1"
          have "Col C1 B1 B2  Col C2 B1 B2" 
            using A1 A2 Par B1 B2 A1 A2 Par C1 C2 
              ¬ Col A1 A2 P P X Perp A1 A2 
            by (metis Col_perm Perp_cases H2 
                l8_16_1 par_left_comm)
        }
        moreover
        {
          assume "Col P X A2"
          have "Col C1 B1 B2  Col C2 B1 B2" 
            using A1 A2 Par B1 B2 A1 A2 Par C1 C2 
              Col P X A1  Col C1 B1 B2  Col C2 B1 B2 
              P X Perp A1 A2 H2 ¬ Col A1 A2 P by blast
        }
        ultimately
        have "Col C1 B1 B2  Col C2 B1 B2" 
          using A1 A2 Par B1 B2 A1 A2 Par C1 C2 P X Perp A1 A2 
            H2 ¬ Col A1 A2 P by blast
      }
      {
        fix A1' A2'
        assume "A1' A2' Par B1 B2" and
          "A1' A2' Par C1 C2" and
          "¬ Col A1' A2' P" and
          "P X Perp A1' A2'" and
          "¬ Col P X A1'"
        have "Coplanar P X A1' A2'" 
          by (simp add: P X Perp A1' A2' perp__coplanar)
        have "P  X" 
          using ¬ Col P X A1' col_trivial_1 by force
        then obtain D where "P X Perp D P" and "Coplanar P X A1' D" 
          using ex_perp_cop by blast
        hence "D  P" 
          using perp_not_eq_2 by blast
        have "P Perp2 A1' A2' D P" 
        proof -
          have "Col P X P"
            by (simp add: col_trivial_3)
          moreover
          have "X P Perp A1' A2'" 
            using Perp_cases P X Perp A1' A2' by blast
          moreover
          have "X P Perp P D" 
            using Perp_cases P X Perp D P by blast
          ultimately
          show ?thesis 
            using Perp2_def perp_right_comm by blast
        qed
        have "Col B1 P D  Col B2 P D" 
        proof -
          have "Col P P D" 
            using col_trivial_1 by auto
          moreover
          have "Coplanar A1' A2' P D" 
            by (meson Coplanar P X A1' A2' Coplanar P X A1' D 
                ¬ Col P X A1' coplanar_perm_16 l9_30 ncop_distincts)
          ultimately
          show ?thesis 
            using P Perp2 A1' A2' D P ¬ Col A1' A2' P
              A1' A2' Par B1 B2 Col P B1 B2
              alternative_playfair_s_postulate_def assms 
              coplanar_perm_1 not_col_permutation_5 by blast
        qed
        moreover
        have "Col C1 P D  Col C2 P D" 
        proof -
          have "Col P P D" 
            using col_trivial_1 by auto
          moreover
          have "Coplanar A1' A2' P D" 
            by (meson Coplanar P X A1' A2' Coplanar P X A1' D 
                ¬ Col P X A1' coplanar_perm_16 l9_30 ncop_distincts)
          ultimately
          show ?thesis 
            using P Perp2 A1' A2' D P ¬ Col A1' A2' P 
              A1' A2' Par C1 C2 Col P C1 C2 
              alternative_playfair_s_postulate_def assms 
              coplanar_perm_1 not_col_permutation_5 by blast
        qed
        ultimately
        have "Col P D C1  Col P D C2  Col P D B1  Col P D B2" 
          using Col_cases by blast
        hence "Col C1 B1 B2  Col C2 B1 B2" 
          by (metis D  P col3)
      }
      thus ?thesis 
        using False A1 A2 Par B1 B2 A1 A2 Par C1 C2 
          P X Perp A1 A2 
          A2a A1a. A1 A2. A1 A2 Par B1 B2  A1 A2 Par C1 C2  
            ¬ Col A1 A2 P  P X Perp A1 A2  ¬ Col P X A1 
              Col C1 B1 B2  Col C2 B1 B2; A1a A2a Par B1 B2; 
             A1a A2a Par C1 C2; ¬ Col A1a A2a P; P X Perp A1a A2a 
       Col C1 B1 B2  Col C2 B1 B2 by blast
    qed
  }
  thus ?thesis 
    using playfair_s_postulate_def by blast
qed

lemma playfair_s_postulate_implies_midpoint_converse_postulate:
  assumes "playfair_s_postulate"
  shows "midpoint_converse_postulate"
proof -
  {
    fix A B C P Q
    assume "¬ Col A B C" and
      "P Midpoint B C" and
      "A B Par Q P" and
      "Col A C Q" 
    obtain X where "X Midpoint A C" 
      using midpoint_existence by blast
    hence "Bet A X C" 
      by (simp add: midpoint_bet)
    have "Cong A X X C" 
      using X Midpoint A C midpoint_cong by blast
    have "A B ParStrict X P" 
      using triangle_mid_par P Midpoint B C X Midpoint A C
        ¬ Col A B C by blast
    have "X = Q" 
    proof -
      have "Col A C X" 
        by (meson Bet A X C bet_col1 between_trivial)
      moreover
      have "Col P Q X" 
        using A B Par Q P A B ParStrict X P assms 
          col_trivial_3 not_col_permutation_3 par_strict_par 
          playfair_s_postulate_def by blast
      moreover
      have "Col P Q Q" 
        by (simp add: col_trivial_2)
      ultimately
      show ?thesis
        using l6_21 
        by (metis A B Par Q P Col A C Q ¬ Col A B C
            not_col_distincts par_col2_par_bis par_id)
    qed
    hence "Q Midpoint A C" 
      using X Midpoint A C by auto
  }
  thus ?thesis 
    using midpoint_converse_postulate_def by blast
qed

lemma inter_dec_plus_par_perp_perp_imply_triangle_circumscription:
  assumes (*"decidability_of_intersection" and*)
    "perpendicular_transversal_postulate"
  shows "triangle_circumscription_principle" 
proof -
  {
    fix A B C
    assume "¬ Col A B C"
    hence "A  B" 
      using col_trivial_1 by blast
    then obtain C1 C2 where "C1 C2 PerpBisect A B" and 
      "Coplanar A B C C1" and "Coplanar A B C C2"
      using perp_bisect_existence_cop by blast
    have "A  C" 
      using ¬ Col A B C col_trivial_3 by blast
    then obtain B1 B2 where "B1 B2 PerpBisect A C" and 
      "Coplanar A C B B1" and "Coplanar A C B B2"
      using perp_bisect_existence_cop by blast
    {
      assume " I. Col I B1 B2  Col I C1 C2"
      then obtain CC where "Col CC B1 B2" and "Col CC C1 C2"
        by auto
      have "Cong A CC B CC"
      proof (cases "CC = C1")
        case True
        thus ?thesis 
          using C1 C2 PerpBisect A B perp_bisect_cong2 by blast
      next
        case False
        hence "CC  C1" 
          by auto
        have "C1 C2 PerpBisectBis A B" 
          using C1 C2 PerpBisect A B perp_bisect_equiv_defA by blast
        then obtain I where "I PerpAt C1 C2 A B" and "I Midpoint A B" 
          using Perp_bisect_bis_def by blast
        have "I PerpAt C1 CC A B" 
          by (metis False perp_in_sym Col CC C1 C2 
              I PerpAt C1 C2 A B not_col_permutation_2 
              perp_in_col_perp_in)
        hence "C1 CC PerpBisectBis A B" 
          using Perp_bisect_bis_def I Midpoint A B by blast
        hence "C1 CC PerpBisect A B" 
          by (simp add: perp_bisect_equiv_defB)
        hence "CC C1 PerpBisect A B" 
          by (simp add: perp_bisect_sym_1)
        thus ?thesis 
          by (simp add: perp_bisect_cong_1)
      qed
      moreover
      have "Cong A CC C CC" 
      proof (cases "CC = B1")
        case True
        thus ?thesis 
          using B1 B2 PerpBisect A C perp_bisect_cong_1 by auto
      next
        case False
        hence "CC  B1" 
          by auto
        have "B1 B2 PerpBisectBis A C" 
          using B1 B2 PerpBisect A C perp_bisect_equiv_defA by blast
        then obtain I where "I PerpAt B1 B2 A C" and "I Midpoint A C" 
          using Perp_bisect_bis_def by blast
        have "I PerpAt B1 CC A C" 
          by (metis False perp_in_sym Col CC B1 B2 
              I PerpAt B1 B2 A C not_col_permutation_2 
              perp_in_col_perp_in)
        hence "B1 CC PerpBisectBis A C" 
          using Perp_bisect_bis_def I Midpoint A C by blast
        hence "B1 CC PerpBisect A C" 
          by (simp add: perp_bisect_equiv_defB)
        hence "CC B1 PerpBisect A C" 
          by (simp add: perp_bisect_sym_1)
        thus ?thesis 
          by (simp add: perp_bisect_cong_1)
      qed
      moreover
      have "C1 C2 Perp A B  B = A" 
        using C1 C2 PerpBisect A B perp_bisect_perp by blast
      have "Coplanar A B C CC" 
      proof (cases "A = B")
        case True
        thus ?thesis 
          using A  B by auto
      next
        case False
        hence "C1 C2 Perp A B" 
          using C1 C2 Perp A B  B = A by auto
        hence "Coplanar C1 C2 A B" 
          using perp__coplanar by simp
        have "C1  C2" 
          using C1 C2 PerpBisect A B col_trivial_1 
            perp_bisect_perp perp_not_col2 by blast
        moreover
        have "Coplanar A B C C1" 
          using Coplanar A B C C1 by auto
        moreover
        have "Coplanar A B C C2" 
          by (simp add: Coplanar A B C C2)
        ultimately
        show ?thesis 
          by (meson Col_cases Col CC C1 C2 col_cop2__cop)
      qed
      ultimately
      have " CC. Cong A CC B CC  Cong A CC C CC  Coplanar A B C CC" 
        by auto
    }
    moreover
    {
      assume "¬ ( I. Col I B1 B2  Col I C1 C2)"
      have "Coplanar B1 B2 C1 C2" 
      proof -
        have "Coplanar A B C B1" 
          using Coplanar A C B B1 ncoplanar_perm_2 by blast
        moreover
        have "Coplanar A B C B2" 
          using Coplanar A C B B2 coplanar_perm_2 by blast
        moreover
        have "Coplanar A B C C1" 
          using Coplanar A B C C1 by auto
        moreover
        have "Coplanar A B C C2" 
          by (simp add: Coplanar A B C C2)
        ultimately
        show ?thesis 
          by (meson ¬ Col A B C coplanar_pseudo_trans)
      qed
      hence "B1 B2 ParStrict C1 C2" 
        using I. Col I B1 B2  Col I C1 C2 
        by (simp add: ParStrict_def)
      hence "B1 B2 Par C1 C2" 
        by (simp add: Par_def)
      have "C1 C2 Perp A B" 
        using C1 C2 PerpBisect A B perp_bisect_perp by auto
      have "B1 B2 Perp A C" 
        using B1 B2 PerpBisect A C perp_bisect_perp by auto
      hence "Coplanar C1 C2 A C  C1 C2 Perp A C" 
        using B1 B2 Par C1 C2 assms 
          perpendicular_transversal_postulate_def by simp
      have "A B Par A C" 
      proof -
        have "Coplanar C1 C2 A A" 
          using ncop_distincts by blast
        moreover
        have "Coplanar C1 C2 A C" 
          by (meson Coplanar A B C C1 Coplanar A B C C2
              ¬ Col A B C coplanar_pseudo_trans
              ncop_distincts)
        moreover
        have "Coplanar C1 C2 A B" 
          using C1 C2 PerpBisect A B perp__coplanar 
            perp_bisect_perp by blast
        hence "Coplanar C1 C2 B A" 
          by (simp add: coplanar_perm_1)
        moreover
        have "Coplanar C1 C2 B C" 
          by (meson Coplanar A B C C1 Coplanar A B C C2
              ¬ Col A B C coplanar_pseudo_trans ncop_distincts)
        moreover
        have "A B Perp C1 C2" 
          using Perp_cases C1 C2 Perp A B by blast
        moreover
        have "A C Perp C1 C2" 
          using Perp_perm Coplanar C1 C2 A C  C1 C2 Perp A C
            calculation(2) by blast
        ultimately
        show ?thesis 
          by (simp add: l12_9)
      qed
      hence "Col A B C"
        by (simp add: par_id)
      hence False 
        using ¬ Col A B C by blast
      hence " CC. Cong A CC B CC  Cong A CC C CC  Coplanar A B C CC" 
        by simp
    }
    ultimately
    have " CC. Cong A CC B CC  Cong A CC C CC  Coplanar A B C CC" 
      by auto
  }
  thus ?thesis 
    using triangle_circumscription_principle_def by blast
qed

(** If a straight line falling on two straight lines make
    the sum of the interior angles on the same side different from two right angles,
    the two straight lines meet if produced indefinitely. *)

lemma original_euclid__original_spp:
  assumes "euclid_s_parallel_postulate"
  shows "alternative_strong_parallel_postulate" 
proof -
  {
    fix A B C D P Q R
    assume "B C OS A D" and
      "A B C B C D SumA P Q R" and
      "¬ Bet P Q R"
    obtain A' where "B Midpoint A A'" 
      using symmetric_point_construction by blast
    hence "Bet A B A'" 
      by (simp add: midpoint_bet)
    hence "Col A B A'" 
      by (simp add: bet_col)
    obtain D' where "C Midpoint D D'" 
      using symmetric_point_construction by blast
    hence "Bet D C D'" 
      by (simp add: midpoint_bet)
    hence "Col D C D'" 
      by (simp add: bet_col)
    have "A  B" 
      using B C OS A D os_distincts by blast
    have "C  B" 
      using A B C B C D SumA P Q R suma_distincts by blast
    have "C  D" 
      using B C OS A D os_distincts by blast
    have "D  D'" 
      using Bet D C D' C  D bet_neq12__neq by blast
    hence "C  D'" 
      using C Midpoint D D' midpoint_distinct_1 by blast
    have "A'  B" 
      using A  B B Midpoint A A' midpoint_not_midpoint by blast
    {
      assume "B C D LeA C B A'"
      have "SAMS A B C B C D" 
        using Midpoint_def A  B A'  B B C D LeA C B A' 
          B Midpoint A A' sams_chara by blast 
      then obtain Y where "B Out A Y  C Out D Y" 
        using B C OS A D A B C B C D SumA P Q R ¬ Bet P Q R
          assms euclid_s_parallel_postulate_def by blast
      hence " Y. Col B A Y  Col C D Y" 
        using out_col by blast
    }
    moreover
    {
      assume "C B A' LeA B C D"
      have "SAMS D' C B C B A'" 
      proof -
        have "Bet D' C D" 
          by (simp add: C Midpoint D D' l7_2 midpoint_bet)
        moreover
        have "C B A' LeA B C D" 
          by (simp add: C B A' LeA B C D)
        ultimately
        show ?thesis 
          by (metis C  D' C  D sams_chara)
      qed
      have "B  C" 
        using C  B by auto
      have "D'  C" 
        using C  D' by auto
      obtain P' Q' R' where "A' B C B C D' SumA P' Q' R'" 
        using ex_suma A'  B B  C C  D' by blast
      have "B C OS A' D'" 
      proof -
        have "¬ Col B C A" 
          using B C OS A D col123__nos by blast
        have "¬ Col B C D" 
          using B C OS A D col124__nos by blast
        have "B C TS A A'" 
          using A'  B Bet A B A' ¬ Col B C A bet__ts by force
        hence "B C TS A' D" 
          using B C OS A D l9_2 l9_8_2 by blast
        moreover
        have "B C TS D D'" 
          using Bet D C D' D'  C ¬ Col B C D bet__ts 
            invert_two_sides not_col_permutation_4 by presburger
        ultimately
        show ?thesis 
          by (meson l9_2 l9_8_1)
      qed
      moreover
      {
        assume "Bet P' Q' R'" 
        hence "A' B C SuppA B C D'" 
          using bet_suma__suppa  A' B C B C D' SumA P' Q' R' by auto
        have "A B C SuppA B C D" 
        proof -
          have "B C D' CongA A B C" 
          proof -
            have "A' B C SuppA B C D'" 
              by (simp add: A' B C SuppA B C D')
            moreover
            have "A' B C SuppA A B C" 
              by (metis between_symmetry A  B A'  B
                  Bet A B A' C  B bet__suppa suppa_right_comm)
            ultimately
            show ?thesis 
              by (simp add: suppa2__conga456)
          qed
          moreover
          have "A' B C CongA B C D" 
          proof -
            have "A' B C SuppA B C D'" 
              using A' B C SuppA B C D' by auto
            moreover
            have "B C D SuppA B C D'" 
              using Bet D C D' C  B C  D D'  C 
                bet__suppa suppa_left_comm by presburger
            ultimately 
            show ?thesis 
              by (simp add: suppa2__conga123)
          qed
          moreover
          have "B C D' SuppA A' B C" 
            by (simp add: A' B C SuppA B C D' suppa_sym)
          ultimately
          show ?thesis 
            by (meson conga2_suppa__suppa)
        qed
        hence "Bet P Q R" 
          using A B C B C D SumA P Q R suma_suppa__bet by auto
        hence False 
          using ¬ Bet P Q R by auto
      }
      ultimately
      have " Y. B Out A' Y  C Out D' Y"
        using A' B C B C D' SumA P' Q' R' assms 
          euclid_s_parallel_postulate_def SAMS D' C B C B A' 
          sams_comm sams_sym by blast
      then obtain Y where "B Out A' Y" and "C Out D' Y"
        by auto
      have "Col B A' Y" 
        using B Out A' Y out_col by auto
      hence "Col B A Y" 
        by (meson A'  B Col A B A' col_permutation_4
            col_trivial_2 colx)
      moreover
      have "Col C D' Y" 
        using C Out D' Y out_col by auto
      hence "Col C D Y" 
        by (meson Col D C D' D'  C col_trivial_2
            colx not_col_permutation_4)
      ultimately
      have " Y. Col B A Y  Col C D Y" 
        by auto
    }
    ultimately
    have " Y. Col B A Y  Col C D Y" 
      using lea_total by (metis A'  B C  B C  D)
  }
  thus ?thesis 
    using alternative_strong_parallel_postulate_def by blast
qed

lemma original_spp__inverse_projection_postulate:
  assumes "alternative_strong_parallel_postulate"
  shows "inverse_projection_postulate" 
proof -
  {
    fix A B C P Q
    assume "Acute A B C" and
      "B Out A P" and
      "P  Q" and
      "Per B P Q" and
      "Coplanar A B C Q"
    have "B  A" 
      using Acute A B C acute_distincts by blast
    have "B  P" 
      using B Out A P l6_3_1 by blast
    have "B  C" 
      using Acute A B C acute_distincts by blast
    have "Col B A P" 
      using B Out A P out_col by blast
    have " Y. B Out C Y  Col P Q Y"
    proof (cases "Col A B C")
      case True
      {
        assume "Bet C B A"
        obtain x y z where "Per x y z" and "A B C LtA x y z" 
          using Acute A B C Bet C B A acute_not_bet 
            between_symmetry by blast
        have "¬ (A B C LtA x y z  x y z LtA A B C)" 
          by (simp add: not_and_lta)
        have "A B C LtA x y z" 
          using A B C LtA x y z by auto
        moreover
        have "x y z LtA A B C" 
          using Acute A B C Bet C B A acute_not_bet
            between_symmetry by blast
        ultimately
        have False 
          using ¬ (A B C LtA x y z  x y z LtA A B C) by blast
      }
      hence "¬ Bet C B A" 
        by auto
      hence "B Out C A"
        by (simp add: True col_permutation_3 l6_4_2)
      hence "B Out C P" 
        using l6_7 B Out A P by blast
      moreover
      have "Col P Q P" 
        by (simp add: col_trivial_3)
      ultimately
      show ?thesis 
        by auto
    next
      case False
      have "¬ Col B P Q" 
        using B  P P  Q Per B P Q l8_9 by blast
      have " Q0. Col Q P Q0  A B OS C Q0"
      proof -
        have "Q  P" 
          using P  Q by auto
        moreover
        have "Col A B P" 
          using Col_cases Col B A P by blast
        moreover
        have "Col Q P P" 
          using col_trivial_2 by blast
        moreover
        have "¬Col A B Q" 
          by (metis Out_def B Out A P ¬ Col B P Q 
              calculation(2) col_transitivity_2)
        moreover
        have "¬ Col A B C" 
          by (simp add: False)
        moreover
        have "Coplanar A B Q C" 
          using Coplanar A B C Q coplanar_perm_1 by blast
        ultimately
        show ?thesis 
          by (simp add: cop_not_par_same_side)
      qed
      then obtain Q0 where "Col Q P Q0" and "A B OS C Q0"
        by auto
      have "¬ Col A B Q0" 
        using A B OS C Q0 one_side_not_col124 by blast
      have "P  Q0" 
        using NCol_cases Col B A P ¬ Col A B Q0 by blast
      then obtain D E F where "C B P B P Q0 SumA D E F" 
        using ex_suma B  C B  P by presburger
      have " Y. Col B C Y  Col P Q0 Y"
      proof -
        have "B P OS C Q0" 
          using A B OS C Q0 B  P Col B A P
            col_one_side invert_one_side by blast
        moreover
        have "C B P B P Q0 SumA D E F" 
          by (simp add: C B P B P Q0 SumA D E F)
        moreover
        {
          assume "Bet D E F"
          have "Per B P Q0" 
            using Col Q P Q0 P  Q Per B P Q 
              not_col_permutation_4 per_col by blast
          hence "Per C B P" 
            using Bet D E F C B P B P Q0 SumA D E F 
              bet_per_suma__per123 by blast
          hence "A B C LtA C B P" 
            using Acute A B C acute_per__lta B  CB  P by simp
          hence "A B C LeA C B P  ¬ A B C CongA C B P" 
            by (simp add: lta__lea lta_not_conga)
          moreover
          have "A B C CongA P B C" 
          proof -
            have "B Out P A" 
              using B Out A P l6_6 by blast
            moreover                    
            have "B Out C C" 
              using B  C out_trivial by fastforce
            ultimately
            show ?thesis
              by (simp add: out2__conga)
          qed
          hence"A B C CongA C B P" 
            by (simp add: conga_right_comm)
          ultimately
          have False 
            by blast
        }
        ultimately
        show ?thesis 
          using alternative_strong_parallel_postulate_def assms by blast
      qed
      then obtain Y where "Col B C Y  Col P Q0 Y"
        by auto
      have "Col A B B" 
        by (simp add: col_trivial_2)
      hence " B0. A B Perp B0 B  A B OS C B0" 
        by (simp add: False l10_15)
      then obtain B0 where "A B Perp B0 B" and "A B OS C B0" 
        by auto
      have "¬ Col A B B0" 
        using A B OS C B0 col124__nos by blast
      have "¬ Col B C P" 
        by (meson False B  P Col B A P col2__eq col_permutation_4)
      have "B0  B" 
        using Col A B B ¬ Col A B B0 by auto
      have "P  Y" 
        using Col B C Y  Col P Q0 Y ¬ Col B C P by blast
      have "B B0 OS C Y" 
      proof -
        have "B B0 OS C P" 
        proof -
          have "B0 B OS C A" 
          proof -
            have "¬ Col B0 B A" 
              using ¬ Col A B B0 not_col_permutation_3 by blast
            moreover
            {
              assume "Col B B0 C" 
              hence "A B C LtA A B C" 
                by (metis Perp_cases A B Perp B0 B Acute A B C B  C acute_per__lta 
                    col_trivial_3 l8_16_1)
              hence "False" 
                using not_and_lta by blast
            }
            moreover
            have "A B C LeA A B B0" 
              using A B Perp B0 B Acute A B C B  A 
                B0  B acute_per__lta lta__lea perp_comm 
                perp_per_2 by presburger
            hence "C InAngle A B B0" 
              by (simp add: A B OS C B0 lea_in_angle 
                  one_side_symmetry)
            hence "C InAngle B0 B A" 
              using l11_24 by blast
            ultimately
            show ?thesis 
              using in_angle_one_side by blast
          qed
          hence "B B0 OS C A" 
            using invert_one_side by blast
          moreover
          have "B B0 OS A P" 
            using B Out A P calculation col124__nos 
              col_trivial_3 l9_19_R2 by blast
          ultimately
          show ?thesis 
            using one_side_transitivity by blast
        qed
        moreover
        have "B B0 Par P Y" 
        proof -
          have "Coplanar A B B P" 
            using ncop_distincts by blast
          moreover
          have "Coplanar A B B Y" 
            using ncop_distincts by blast
          moreover
          have "Coplanar A B B0 P" 
            by (meson Col B A P col_permutation_4 ncop__ncols)
          moreover
          have "Coplanar A B B0 Y" 
          proof -
            have "¬ Col C A B" 
              using Col_cases False by blast
            moreover
            have "Coplanar C A B B0" 
            proof -
              have "Coplanar A B B0 C" 
                by (meson A B OS C B0 cop2_os__osp 
                    ncop_distincts osp_distincts)
              moreover
              have "Coplanar A B B0 A" 
                using ncop_distincts by auto
              moreover
              have "Coplanar A B B0 B" 
                using ncop_distincts by blast
              moreover
              have "Coplanar A B B0 B0"  
                using ncop_distincts by blast
              ultimately
              show ?thesis 
                using coplanar_perm_18 by blast
            qed
            moreover
            have "Coplanar C A B Y" 
              using Col B C Y  Col P Q0 Y 
                col_permutation_4 ncop__ncols by blast
            ultimately 
            show ?thesis 
              using coplanar_trans_1 by blast
          qed
          moreover
          have "B B0 Perp A B" 
            using Perp_cases A B Perp B0 B by blast
          moreover
          have "B P Perp P Y" 
          proof -
            have "B P Perp P Q" 
              using B  P P  Q Per B P Q per_perp by blast
            moreover
            have "Col P Q Y" 
              by (meson Col B C Y  Col P Q0 Y Col Q P Q0 
                  P  Q0 col_trivial_2 colx not_col_permutation_4)
            ultimately
            show ?thesis 
              using P  Y perp_col1 by blast
          qed
          hence "P Y Perp B P" 
            using Perp_perm by blast
          hence "P Y Perp B A" 
            using B Out A P B  A col_permutation_5
              out_col perp_col1 by blast
          hence "P Y Perp A B" 
            by (simp add: perp_right_comm)
          ultimately
          show ?thesis 
            using l12_9 by blast
        qed
        hence "B B0 ParStrict P Y" 
          using calculation not_col_distincts 
            one_side_not_col124 par_not_col_strict by blast
        hence "B B0 OS P Y" 
          using l12_6 by blast
        ultimately
        show ?thesis 
          using one_side_transitivity by blast
      qed
      hence "B Out C Y" 
        using Col B C Y  Col P Q0 Y 
          col_one_side_out by blast
      moreover
      have "Col P Q Y" 
        by (meson Col B C Y  Col P Q0 Y Col Q P Q0 
            P  Q0 col_trivial_2 colx not_col_permutation_4)
      ultimately
      show ?thesis 
        by auto
    qed
  }
  thus ?thesis 
    using inverse_projection_postulate_def by auto
qed

lemma proclus_bis__proclus:
  assumes "alternative_proclus_postulate"
  shows "proclus_postulate" 
proof -
  {
    fix A B C D P Q
    assume "A B Par C D" and
      "Col A B P" and
      "¬ Col A B Q" and
      "Coplanar C D P Q"
    have " Y. Col P Q Y  Col C D Y" 
    proof (cases "Col C D P")
      case True
      thus ?thesis 
        using col_trivial_3 by blast
    next
      case False
      hence "¬ Col C D P" 
        by simp
      have "C D Par A B" 
        by (simp add: A B Par C D par_symmetry)
      hence "C D ParStrict A B" 
        using False Col A B P par_not_col_strict by blast
      obtain C0 where "Col C D C0" and "C D Perp P C0" 
        using False l8_18_existence by blast
      have "¬ Col C0 A B" 
        by (meson C D ParStrict A B Col C D C0 
            col_permutation_2 par_not_col)
      have " A0. Col A B A0  ¬ Col C0 P A0" 
      proof (cases "Col C0 P A")
        case True
        thus ?thesis 
          by (metis (full_types) C D ParStrict A B 
              Col A B P Col C D C0 col_permutation_5 col_trivial_2
              not_col_permutation_1 par_not_col par_strict_col_par_strict)
      next
        case False
        thus ?thesis 
          using col_trivial_3 by blast
      qed
      then obtain A0 where "Col A B A0" and "¬ Col C0 P A0" 
        by blast
      have "Col C0 P P" 
        by (simp add: col_trivial_2)
      then obtain A' where "C0 P Perp A' P" and "C0 P OS A0 A'" 
        using ¬ Col C0 P A0 l10_15 by blast
      have "P  A0" 
        using Col C0 P P ¬ Col C0 P A0 by blast
      hence "Coplanar C D P A0" 
        by (meson C D ParStrict A B Col A B A0 
            Col A B P par_strict_col2_par_strict
            pars__coplanar)
      show ?thesis  
      proof (cases "Col A0 P A'")
        case True
        show ?thesis 
        proof -
          have "P Perp2 A0 P C D" 
          proof -
            have "Col P C0 P" 
              by (simp add: col_trivial_3)
            moreover
            have "C0 P Perp A0 P" 
              by (metis NCol_perm Perp_perm True 
                  C0 P Perp A' P P  A0 perp_col)
            moreover
            have "C0 P Perp C D" 
              using Perp_perm C D Perp P C0 by blast
            ultimately
            show ?thesis 
              using Perp2_def by blast
          qed
          moreover
          have "¬Col C D P" 
            using False by auto
          moreover
          have "Coplanar A0 P C D" 
            by (simp add: Coplanar C D P A0 coplanar_perm_22)
          moreover
          have "Col A0 P P" 
            by (simp add: col_trivial_2)
          moreover
          have "¬Col A0 P Q" 
            by (metis Col A B A0 Col A B P 
                P  A0 ¬ Col A B Q colx)
          ultimately
          show ?thesis
            using Coplanar C D P Q assms 
              alternative_proclus_postulate_def by simp
        qed
      next
        case False
        hence "¬ Col A0 P A'" 
          by simp
        have " Y. Col P A0 Y  Col C D Y"
        proof -
          have "P Perp2 A' P C D" 
          proof -
            have "Col P C0 P" 
              by (simp add: col_trivial_3)
            moreover
            have "C0 P Perp C D" 
              using Perp_cases C D Perp P C0 by auto
            ultimately
            show ?thesis 
              using C0 P Perp A' P Perp2_def by blast
          qed
          moreover
          have "¬Col C D P" 
            by (simp add: ¬ Col C D P)
          moreover
          have "Coplanar C D P A0" 
            by (meson C D ParStrict A B Col A B A0
                Col A B P P  A0 par_strict_col2_par_strict
                pars__coplanar)
          have "C0 P OS A0 A'" 
            by (simp add: C0 P OS A0 A')
          hence "Coplanar C0 P A0 A'" 
            by (simp add: os__coplanar)
          hence "Coplanar A' P C D" 
          proof -
            have "Coplanar C0 P A0 A'" 
              by (simp add: Coplanar C0 P A0 A')
            moreover have "Coplanar C0 P A0 P" 
              using ncop_distincts by blast
            moreover have "Coplanar C0 P A0 C" 
              by (metis Col C D C0 Coplanar C D P A0 
                  ¬ Col C D P col_cop__cop coplanar_perm_20 
                  coplanar_perm_22 not_col_distincts)
            moreover have "Coplanar C0 P A0 D" 
              by (metis Col C D C0 Coplanar C D P A0 
                  calculation(3) col_cop2__cop coplanar_perm_21 
                  coplanar_perm_22 ncop_distincts)
            ultimately show ?thesis 
              using ¬ Col C0 P A0 coplanar_pseudo_trans by blast
          qed
          moreover
          have "Col A' P P" 
            by (simp add: col_trivial_2)
          moreover
          have "¬ Col A' P A0" 
            by (simp add: False not_col_permutation_3)
          ultimately
          show ?thesis 
            using Coplanar C D P A0 assms 
              alternative_proclus_postulate_def by simp
        qed
        then obtain Y where "Col P A0 Y" and "Col C D Y" 
          by auto
        have "C D ParStrict A B" 
          by (simp add: C D ParStrict A B)
        moreover
        have "Col Y C D" 
          using Col_cases Col C D Y by blast
        moreover
        have "Col Y A B" 
          by (meson Col A B A0 Col A B P Col P A0 Y
              P  A0 colx not_col_permutation_1)
        ultimately
        have "False" 
          using par_not_col by simp
        thus ?thesis 
          by simp
      qed
    qed
  }
  thus ?thesis
    using proclus_postulate_def by blast
qed

lemma proclus_s_postulate_implies_strong_parallel_postulate:
  assumes "proclus_postulate"
  shows "strong_parallel_postulate" 
proof -
  {
    fix P Q R S T U
    assume "BetS P T Q" and
      "BetS R T S" and
      "¬ Col P R U" and
      "Coplanar P Q R U" and
      "Cong P T Q T" and
      "Cong R T S T"
    have " I. Col S Q I  Col P U I"
    proof (cases "Col P Q R")
      case True
      have "Col S Q P" 
        by (metis (full_types) BetS_def Col_cases
            True BetS P T Q BetS R T S bet_col colx)
      moreover
      have "Col P U P" 
        by (simp add: col_trivial_3)
      ultimately
      show ?thesis 
        by auto
    next
      case False
      show ?thesis 
      proof -
        have "P R Par Q S" 
        proof -
          have "T Midpoint P Q" 
            by (simp add: BetSEq midpoint_def BetS P T Q
                Cong P T Q T cong_right_commutativity)
          moreover
          have "T Midpoint R S" 
            by (meson BetSEq midpoint_def BetS R T S
                Cong R T S T not_cong_1243)
          ultimately
          show ?thesis 
            using False not_col_distincts sym_par by blast
        qed
        moreover  
        have "Col P R P" 
          by (simp add: col_trivial_3)
        moreover
        have "Coplanar P Q R S" 
          using calculation(1) coplanar_perm_2 par__coplanar by blast
        hence "Coplanar Q S P U" 
          by (meson False Coplanar P Q R U col_permutation_1
              coplanar_trans_1 ncoplanar_perm_8)
        ultimately
        show ?thesis
          using ¬ Col P R U assms proclus_postulate_def
            not_col_permutation_4 by blast
      qed
    qed
  }
  thus ?thesis 
    using strong_parallel_postulate_def by blast
qed

lemma rectangle_existence__rah:
  assumes "postulate_of_existence_of_a_right_lambert_quadrilateral"
  shows "postulate_of_right_saccheri_quadrilaterals" 
proof -
  {
    fix A B C D 
    assume "Saccheri A B C D"
    hence "Per A B C" 
      using assms lam_per__rah 
        hypothesis_of_right_saccheri_quadrilaterals_def 
        postulate_of_existence_of_a_right_lambert_quadrilateral_def 
      by blast
  }
  thus ?thesis 
    by (simp add: postulate_of_right_saccheri_quadrilaterals_def)
qed

lemma posidonius_postulate__rah:
  assumes "posidonius_postulate"
  shows "postulate_of_right_saccheri_quadrilaterals" 
proof -
  have " A1 A2 B1 B2.
            Per A2 A1 B1  Per A1 A2 B2 
            Cong A1 B1 A2 B2  A1 A2 OS B1 B2 
           ( A3 B3.
                 (Col A1 A2 A3  Col B1 B2 B3  
                  A1 A2 Perp A3 B3) 
                    Cong A3 B3 A1 B1)" 
  proof- 
    obtain A1' A2' B1 B2 where
      "¬ Col A1' A2' B1" and "B1  B2" and 
      "Coplanar A1' A2' B1 B2" and
      H1: " A3 A4 B3 B4.
      (Col A1' A2' A3  Col B1 B2 B3  A1' A2' Perp A3 B3 
      Col A1' A2' A4  Col B1 B2 B4  A1' A2' Perp A4 B4) 
      Cong A3 B3 A4 B4"
      using assms posidonius_postulate_def by blast
    obtain A1 where "Col A1' A2' A1" and "A1' A2' Perp B1 A1" 
      using ¬ Col A1' A2' B1 l8_18_existence by blast
    have "A1'  A2'" 
      using ¬ Col A1' A2' B1 col_trivial_1 by blast
    have "A1  B1" 
      using A1' A2' Perp B1 A1 perp_not_eq_2 by blast
    have "A1' A2' ParStrict B1 B2"
    proof -
      {
        assume " I. Col I A1' A2'  Col I B1 B2"
        then obtain I where "Col I A1' A2'" and "Col I B1 B2" 
          by blast
        have "B1  I" 
          using Col I A1' A2' ¬ Col A1' A2' B1 
            not_col_permutation_2 by blast
        obtain B3 where "B3 Midpoint B1 I" 
          using midpoint_existence by presburger
        hence "B1  B3" 
          using B1  I l7_3_2 l7_9_bis by blast
        have "Bet B1 B3 I" 
          by (metis midpoint_bet B3 Midpoint B1 I)
        hence "Col B1 B3 I" 
          using bet_col by auto
        {
          assume "Col A1' A2' B3"
          have "Col B1 B3 A1'" 
            by (metis A1'  A2' B3 Midpoint B1 I 
                Col A1' A2' B3 Col B1 B3 I Col I A1' A2' col2__eq 
                col_permutation_4 midpoint_distinct_1 not_col_distincts)
          moreover
          have "Col B1 B3 A2'"       
            by (metis A1'  A2' B3 Midpoint B1 I 
                Col A1' A2' B3 Col B1 B3 I Col I A1' A2' col2__eq
                col_permutation_4 midpoint_distinct_1 not_col_distincts)
          moreover
          have "Col B1 B3 B1" 
            by (simp add: col_trivial_3)
          ultimately
          have "Col A1' A2' B1" 
            using B1  B3 col3 by blast
          hence False 
            using ¬ Col A1' A2' B1 by auto
        }
        then obtain A3 where "Col A1' A2' A3" and "A1' A2' Perp B3 A3" 
          using l8_18_existence by blast
        have "Cong A1 B1 A3 B3" 
        proof -
          have "Col A1' A2' A1" 
            by (simp add: Col A1' A2' A1)
          moreover
          have "Col B1 B2 B1" 
            using col_trivial_3 by blast
          moreover
          have "A1' A2' Perp A1 B1" 
            using Perp_cases A1' A2' Perp B1 A1 by blast
          moreover  
          have "Col A1' A2' A3" 
            by (simp add: Col A1' A2' A3)
          moreover
          have "Col B1 B2 B3" 
            by (metis B1  I Col B1 B3 I Col I B1 B2
                col_permutation_3 col_permutation_5 col_transitivity_2)
          moreover
          have "A1' A2' Perp A3 B3" 
            using Perp_perm A1' A2' Perp B3 A3 by blast
          ultimately
          show ?thesis 
            using H1 by blast
        qed
        have "Cong B1 I B3 I" 
        proof -
          {
            assume "A3 = I" 
            have "A3 B3 Perp A1' A2'" 
              using Perp_cases A1' A2' Perp B3 A3 by blast
            hence "A1' A2' Perp B1 A3" 
              by (metis between_symmetry A3 = I B1  B3
                  B1  I Bet B1 B3 I bet_col bet_col1
                  col3 perp_col0)
            hence "A1 = A3" 
              using A1' A2' Perp B1 A1 Col A1' A2' A1 
                Col A1' A2' A3 l8_18_uniqueness
              by blast
            have "B3  B1" 
              using B1  B3 by blast
            hence False 
              using A1 = A3 A3 = I Bet B1 B3 I
                Cong A1 B1 A3 B3 between_cong between_symmetry
                cong_inner_transitivity cong_reflexivity by blast
          }
          hence "A3  I" 
            by auto
          have "B3  I" 
            using B1  I B3 Midpoint B1 I
              midpoint_distinct_1 by blast
          {
            assume "A1 = I"
            hence "A3 = A1" 
            proof -
              have "¬ Col A1' A2' B3" 
                using Col A1' A2' B3  False by auto
              moreover
              have "A1' A2' Perp B3 A1" 
              proof -
                have "Col B1 A1 B3" 
                  using A1 = I Col B1 B3 I
                    col_permutation_5 by blast
                moreover
                have "Col B1 A1 A1" 
                  by (simp add: col_trivial_2)
                ultimately
                show ?thesis 
                  using A1' A2' Perp B1 A1 Col A1' A2' A1 
                    ¬ Col A1' A2' B3 perp_col2_bis by blast
              qed
              ultimately
              show ?thesis 
                using Col A1' A2' B3  False 
                  Col A1' A2' A3 A1' A2' Perp B3 A3 Col A1' A2' A1 
                  l8_18_uniqueness by blast
            qed
            hence False 
              using A1 = I A3  I by auto
          }
          hence "A1  I" 
            by blast
          {
            assume "Col B1 A1 I"
            hence "A3 = I" 
              by (metis A1 = I  False Col A1' A2' A1 
                  Col I A1' A2' ¬ Col A1' A2' B1 
                  l6_21 not_col_distincts)
            hence False 
              using A3  I by blast
          }
          moreover
          have "Bet I A3 A1" 
          proof -
            have "A3 B3 TS I A1" 
            proof -
              have "¬ Col A3 B3 B1" 
                by (meson A3 = I  False B1  B3 
                    Col A1' A2' A3 Col B1 B3 I Col I A1' A2' 
                    ¬ Col A1' A2' B1 col_permutation_3 
                    col_permutation_4 l6_21)
              have "A3 B3 TS B1 I" 
                using Col_perm B3  I Bet B1 B3 I 
                  ¬ Col A3 B3 B1 bet__ts 
                  invert_two_sides by blast
              moreover
              have "A3 B3 OS B1 A1" 
              proof -
                have "A3 B3 Par B1 A1" 
                proof -
                  have "Coplanar A1' A2' A3 B1" 
                    by (simp add: Col A1' A2' A3 col__coplanar)
                  moreover
                  have "Coplanar A1' A2' A3 A1" 
                    using Col A1' A2' A3 ncop__ncols by blast
                  moreover
                  have "Coplanar A1' A2' B3 B1" 
                    using Coplanar_def Col B1 B3 I 
                      Col I A1' A2' col_permutation_4 
                      not_col_permutation_2 by blast
                  moreover
                  have "Coplanar A1' A2' B3 A1" 
                    using Col A1' A2' A1 ncop__ncols by blast
                  moreover
                  have "A3 B3 Perp A1' A2'" 
                    using Perp_perm A1' A2' Perp B3 A3 by blast
                  moreover
                  have "B1 A1 Perp A1' A2'" 
                    using Perp_perm A1' A2' Perp B1 A1 by blast
                  ultimately
                  show ?thesis 
                    using l12_9 by blast
                qed
                moreover
                have "Col B1 A1 B1" 
                  by (simp add: col_trivial_3)
                ultimately
                show ?thesis 
                  by (meson  ¬ Col A3 B3 B1 col_trivial_2 
                      par_not_col_strict par_strict_one_side)
              qed
              ultimately
              show ?thesis 
                using l9_2 l9_8_2 by blast
            qed
            moreover
            have "Col A1' A2' I" 
              using Col I A1' A2' not_col_permutation_2 by blast
            hence "Col A3 I A1" 
              using  Col A1' A2' A3  Col A1' A2' A1 
                A1'  A2' col3 by blast
            ultimately
            show ?thesis 
              using col_two_sides_bet by blast
          qed
          hence "I Out A3 A1" 
            by (simp add: A3  I bet_out)
          hence "A1 I B1 CongA A3 I B3" 
            by (simp add: B3  I Bet B1 B3 I bet_out_1 out2__conga)
          moreover
          have "B1 A1 I CongA B3 A3 I" 
          proof -
            have "Per B1 A1 I" 
            proof -
              have "A1' A2' Perp A1 B1" 
                using Perp_cases A1' A2' Perp B1 A1 by blast
              moreover
              have "Col A1' A2' I" 
                using Col I A1' A2' not_col_permutation_2 by blast
              ultimately
              show ?thesis 
                using Perp_cases Col A1' A2' A1 l8_16_1 by blast
            qed
            moreover
            have "Col A1' A2' I" 
              using Col_perm Col I A1' A2' by blast
            hence "Per B3 A3 I" 
              using  Col A1' A2' A3 A1' A2' Perp B3 A3 l8_16_1 by blast
            ultimately
            show ?thesis 
              by (metis A1  B1 A1  I A3  I 
                  Cong A1 B1 A3 B3 cong_diff l11_16)
          qed
          moreover
          have "Cong B1 A1 B3 A3" 
            using Cong A1 B1 A3 B3 not_cong_2143 by blast
          ultimately
          show ?thesis 
            using l11_50_2 by blast
        qed
        have "B3  B1" 
          using B1  B3 by auto
        hence False 
          by (metis Bet B1 B3 I Col B1 B3 I 
              Cong B1 I B3 I between_equality col_cong2_bet2 
              col_transitivity_1 not_cong_1243)
      }
      thus ?thesis 
        using ParStrict_def Coplanar A1' A2' B1 B2 by blast
    qed
    hence "¬ Col A1' A2' B2" 
      using col124__nos l12_6 by blast
    then obtain A2 where "Col A1' A2' A2" and "A1' A2' Perp B2 A2" 
      using l8_18_existence by blast
    {
      assume "A1 = A2" 
      have "A2' A1' ParStrict B2 B1" 
        using A1' A2' ParStrict B1 B2 par_strict_comm by blast
      hence "¬ Col A2 B2 B1" 
        using Col A1' A2' A2 not_col_permutation_3 par_not_col by blast
      moreover
      have "Col A1 B1 B2" 
        using A1 = A2 Perp_cases A1' A2' Perp B1 A1 
          A1' A2' Perp B2 A2 cop_perp2__col 
          Coplanar A1' A2' B1 B2 by blast
      ultimately
      have False 
        using A1 = A2 ¬ Col A2 B2 B1 not_col_permutation_5 by blast
    }
    hence "A1  A2" 
      by blast
    have "A1' A2' Perp A1 B1" 
      using Perp_cases A1' A2' Perp B1 A1 by blast
    have "A1' A2' Perp A2 B2" 
      by (simp add: A1' A2' Perp B2 A2 perp_right_comm)
    have "Per A2 A1 B1" 
      by (meson Col A1' A2' A1 Col A1' A2' A2 
          A1' A2' Perp A1 B1 A1  A2 perp_col2 perp_per_2)
    moreover
    have "Per A1 A2 B2" 
      by (metis Col A1' A2' A1 Col A1' A2' A2
          A1' A2' Perp A2 B2 A1  A2 
          perp_col2 perp_per_2)
    moreover
    have "Cong A1 B1 A2 B2" 
    proof -
      have "Col B1 B2 B1"
        by (simp add: col_trivial_3)
      moreover
      have "Col B1 B2 B2" 
        by (simp add: col_trivial_2)
      ultimately
      show ?thesis
        using Col A1' A2' A1 Col A1' A2' A2  
          A1' A2' Perp A1 B1 A1' A2' Perp A2 B2 H1 by blast
    qed
    moreover
    have "A1' A2' OS B1 B2" 
      using A1' A2' ParStrict B1 B2 l12_6 by force
    hence "A1 A2 OS B1 B2" 
      using Col A1' A2' A1 Col A1' A2' A2 A1  A2 col2_os__os by blast
    moreover
    {
      fix A3 B3
      assume "Col A1 A2 A3" and
        "Col B1 B2 B3" and
        "A1 A2 Perp A3 B3"
      have "Col A1' A2' A3" 
        using A1  A2 Col A1 A2 A3 Col A1' A2' A1 
          Col A1' A2' A2 colx by blast
      moreover
      have "A1' A2' Perp A3 B3" 
      proof -
        have "Col A1 A2 A1'" 
          by (metis A1'  A2' Col A1' A2' A1 
              Col A1' A2' A2 col_transitivity_2 
              not_col_permutation_2)
        moreover
        have "Col A1 A2 A2'" 
          by (meson A1'  A2' Col A1' A2' A1 
              Col A1' A2' A2 col_permutation_1 
              col_transitivity_2)
        ultimately
        show ?thesis 
          using A1 A2 Perp A3 B3 A1'  A2' perp_col2 by blast
      qed
      moreover
      have "Col B1 B2 B1" 
        by (simp add:col_trivial_3)
      ultimately
      have "Cong A3 B3 A1 B1" 
        using  Col B1 B2 B3 Col A1' A2' A1
          A1' A2' Perp A1 B1 H1 by blast
    }
    ultimately
    show ?thesis 
      by blast
  qed
  then obtain A D B C where "Per D A B" and 
    "Per A D C" and "Cong A B D C" and "A D OS B C" and
    H2: " A3 B3. (Col A D A3  Col B C B3  A D Perp A3 B3)  Cong A3 B3 A B"
    by blast
  have "Saccheri A B C D" 
    using Saccheri_def A D OS B C Cong A B D C 
      Per A D C Per D A B l8_2 not_cong_1243 by blast
  have "Per A B C" 
  proof -
    obtain M where "M Midpoint B C" 
      using midpoint_existence by blast
    hence "Bet B M C" 
      using midpoint_bet by auto
    moreover
    obtain N where "N Midpoint A D" 
      using midpoint_existence by blast
    hence "Bet A N D" 
      by (simp add: midpoint_bet)
    moreover
    have "A D Perp M N" 
      using mid2_sac__perp_lower M Midpoint B C 
        N Midpoint A D Saccheri A B C D by blast
    have "A  N" 
      using A D Perp M N N Midpoint A D 
        is_midpoint_id perp_distinct by blast
    moreover
    have "N  D" 
      by (metis N Midpoint A D calculation(3) midpoint_distinct_2)
    moreover
    have "Per M N A" 
    proof -
      have "M N Perp A D" 
        using Perp_cases A D Perp M N by blast
      moreover
      have "Col A D N" 
        using Bet A N D bet_col col_permutation_5 by blast
      ultimately
      show ?thesis 
        by (meson Perp_cases col_trivial_3 l8_16_1)
    qed
    moreover
    have "Cong M N A B" 
    proof -
      have "Col A D N" 
        using bet_col calculation(2) not_col_permutation_5 by blast
      moreover
      have "Col B C M" 
        by (meson Bet B M C bet_col not_col_permutation_5)
      ultimately
      show ?thesis 
        using Cong_perm A D Perp M N 
          H2 perp_right_comm by blast
    qed
    ultimately
    show ?thesis 
      using Saccheri A B C D t22_7__per by blast
  qed
  thus ?thesis 
    using Saccheri A B C D existential_saccheri__rah 
      postulate_of_existence_of_a_right_saccheri_quadrilateral_def 
    by blast
qed

lemma playfair__existential_playfair:
  assumes "playfair_s_postulate" 
  shows "existential_playfair_s_postulate"
proof -
  obtain PA PB PC where "¬ Bet PA PB PC" and "¬ Bet PB PC PA" and "¬ Bet PC PA PB"
    using lower_dim_ex by blast
  hence "¬ Col PA PB PC" 
    using Col_def by presburger
  moreover
  {
    fix B1 B2 C1 C2
    assume "PA PB Par B1 B2" and "Col PC B1 B2" and
      "PA PB Par C1 C2" and
      "Col PC C1 C2"
    have "Col C1 B1 B2  Col C2 B1 B2" 
      using assms Col PC B1 B2 Col PC C1 C2 PA PB Par B1 B2 
        PA PB Par C1 C2 playfair_s_postulate_def by blast
  }
  ultimately show ?thesis 
    using existential_playfair_s_postulate_def by blast
qed

subsection "Equivalences" 

lemma proclus__aristotle:
  assumes "proclus_postulate" 
  shows "aristotle_s_axiom"
proof -
  {
    fix P Q A B C
    assume "¬ Col A B C" and
      "Acute A B C"
    have "(Col B A B  ¬ Col B A C)  ( Q. B A Perp Q B  B A OS C Q)" 
      using l10_15 by blast
    then obtain D0 where "B A Perp D0 B" and "B A OS C D0"
      using Col_cases ¬ Col A B C col_trivial_3 by blast
    obtain D where "Bet B D0 D" and "Cong D0 D P Q" 
      using segment_construction by blast 
    have "¬ Col B A D0" 
      using B A OS C D0 one_side_not_col124 by auto
    have "A  B" 
      using ¬ Col B A D0 col_trivial_1 by blast
    have "D0  B" 
      using ¬ Col B A D0 col_trivial_3 by auto
    have "B  D" 
      using Bet B D0 D D0  B between_identity by blast
    have "¬ Col D B A" 
      by (metis B  D Bet B D0 D ¬ Col B A D0 
          bet_col col_transitivity_1 not_col_permutation_1)
    have "(Col D B D  ¬ Col D B A)  ( Q. D B Perp Q D  D B OS A Q)" 
      using l10_15 by blast
    then obtain Y0 where "D B Perp Y0 D" and "D B OS A Y0" 
      using ¬ Col D B A col_trivial_3 by blast
    have "B A Perp B D" 
      by (metis Perp_perm os_distincts B A OS C D0 
          B A Perp D0 B Bet B D0 D bet_col1 
          bet_neq21__neq l5_1 perp_col1)
    have "B A Par Y0 D" 
    proof -
      have "Coplanar D B B Y0" 
        using ncop_distincts by auto
      moreover
      have "Coplanar D B B D" 
        using ncop_distincts by blast
      moreover
      have "Coplanar D B A Y0" 
        by (meson D B OS A Y0 inangle__coplanar ncop__ncols 
            ncoplanar_perm_14 ncoplanar_perm_20 one_side_symmetry 
            os_ts__inangle two_sides_cases)
      moreover
      have "Coplanar D B A D" 
        using ncop_distincts by blast
      moreover
      have "B A Perp D B" 
        by (simp add: Perp_perm B A Perp B D)
      moreover
      have "Y0 D Perp D B" 
        using Perp_perm D B Perp Y0 D by blast
      ultimately
      show ?thesis 
        using l12_9 by blast
    qed
    have " Y. Col B C Y  Col Y0 D Y"
    proof -
      have "(B A Par Y0 D  Col B A B  
             ¬ Col B A C  Coplanar Y0 D B C)
                  
            ( Y. Col B C Y  Col Y0 D Y)"
        using assms proclus_postulate_def by blast
      moreover
      have "Coplanar Y0 D B C" 
      proof -
        have "Coplanar A D B Y0" 
          using B A Par Y0 D ncoplanar_perm_13 
            par__coplanar by blast
        moreover have "Coplanar A D B D" 
          using ncop_distincts by blast
        moreover have "Coplanar A D B B" 
          using ncop_distincts by blast
        moreover have "Coplanar A D B C" 
        proof -
          have "Coplanar A B C D0" 
            using B A OS C D0 coplanar_perm_6
              os__coplanar by blast
          thus ?thesis 
            using Bet B D0 D D0  B bet_col 
              col_cop__cop coplanar_perm_2 coplanar_perm_5 by blast
        qed
        ultimately show ?thesis
          using ¬ Col D B A col_permutation_1 
            coplanar_pseudo_trans by blast
      qed
      moreover
      have "B A Par Y0 D" 
        using B A Par Y0 D by auto
      moreover
      have "Col B A B" 
        by (simp add: col_trivial_3)
      moreover
      have "¬ Col B A C" 
        using Col_cases ¬ Col A B C by blast
      ultimately
      show ?thesis 
        using Col_cases ¬ Col A B C col_trivial_3 by blast
    qed
    then obtain Y where "Col B C Y" and "Col Y0 D Y" 
      by blast
    have "B A ParStrict Y0 D" 
      using Col_perm Par_def B A Par Y0 D 
        D B OS A Y0 col124__nos by blast
    have "¬ Col Y B A" 
      by (meson B A ParStrict Y0 D Col Y0 D Y 
          col_permutation_2 par_not_col)
    have "¬ Col A B Y  ( X. Col A B X  A B Perp Y X)" 
      using l8_18_existence by blast
    then obtain X where "Col A B X" and "A B Perp Y X" 
      using Col_cases ¬ Col Y B A by blast
    have "B A OS C D" 
      by (meson B A OS C D0 Bet B D0 D D0  B 
          bet_out out_out_one_side)
    have "A B C LtA A B D" 
      by (metis A  B Acute A B C B A Perp D0 B 
          B  D Bet B D0 D D0  B acute_per__lta 
          bet_col per_col perp_per_1)
    {
      assume "Col B C D"
      {
        assume "Bet C B D"
        hence "B A TS C D" 
          using Col_cases B  D ¬ Col A B C bet__ts by blast
        hence False 
          using B A OS C D l9_9 by blast
      }
      moreover
      {
        assume "¬ Bet C B D"
        hence "¬ A B C CongA A B D" 
          by (metis A  B Acute A B C B A Perp D0 B
              B  D Bet B D0 D D0  B acute_per__lta 
              bet_col lta_not_conga per_col perp_per_1)
        moreover
        have "A B C CongA A B D" 
        proof -
          have "B Out A A" 
            by (simp add: A  B out_trivial)
          moreover
          have "B Out D C" 
            using B A OS C D Col B C D 
              col_one_side_out l6_6 by blast
          ultimately
          show ?thesis 
            by (simp add: out2__conga)
        qed
        ultimately
        have False
          by blast
      }
      ultimately
      have False 
        by blast
    }
    hence "¬ Col B C D" 
      by auto
    have "Y  B" 
      using ¬ Col Y B A col_trivial_1 by blast
    have "Y  X" 
      using Col_cases Col A B X ¬ Col Y B A by blast
    have "Y0  D" 
      using D B OS A Y0 col_trivial_3 one_side_not_col124 by blast
    have "Y  D" 
      using Col B C Y ¬ Col B C D by auto
    have "B A OS C D" 
      using B A OS C D by auto
    have "B D ParStrict X Y" 
    proof -
      have "B D Par X Y" 
      proof -
        have "Coplanar B A B X" 
          using ncop_distincts by blast
        moreover
        have "Coplanar B A B Y" 
          using ncop_distincts by auto
        moreover
        have "Coplanar B A D X" 
          using NCol_perm Col A B X ncop__ncols by blast
        moreover
        have "Coplanar B A D Y" 
          using B A ParStrict Y0 D Col Y0 D Y 
            Y0  D col2_cop__cop col_trivial_2 
            pars__coplanar by blast
        moreover
        have "B D Perp B A" 
          using Perp_perm B A Perp B D by blast
        moreover
        have "X Y Perp B A" 
          using Perp_perm A B Perp Y X by blast
        ultimately
        show ?thesis 
          using l12_9 by blast
      qed
      moreover
      have "Col X Y Y" 
        by (simp add: col_trivial_2)
      moreover
      have "¬ Col B D Y" 
        by (meson Col B C Y Y  B ¬ Col B C D 
            col_transitivity_2 not_col_permutation_2)
      ultimately
      show ?thesis 
        using par_not_col_strict by blast
    qed
    have "C InAngle A B D" 
    proof -
      have "A B C LeA A B D" 
        by (simp add: A B C LtA A B D lta__lea)
      moreover
      have "A B OS D C" 
        using B A OS C D invert_one_side 
          one_side_symmetry by blast
      ultimately
      show ?thesis 
        by (simp add: lea_in_angle)
    qed
    have "B A OS D Y" 
      using B A ParStrict Y0 D Col Y0 D Y Y  D
        col_trivial_2 l12_6 par_strict_col2_par_strict by presburger
    hence "B A OS C Y" 
      using B A OS C D one_side_transitivity by blast
    have "B Out A X" 
    proof -
      have "Col B A X" 
        using Col_perm Col A B X by blast
      moreover
      have "B D OS X A" 
      proof -
        have "B D OS X Y" 
          using B D ParStrict X Y l12_6 by auto
        moreover
        have "B D OS Y A" 
          by (meson B A OS C D B A OS C Y 
              C InAngle A B D Col B C Y ¬ Col A B C 
              ¬ Col B C D col_one_side_out col_permutation_5
              in_angle_two_sides invert_two_sides 
              not_col_permutation_4 one_side_symmetry 
              os_ts1324__os out_out_one_side)
        ultimately
        show ?thesis 
          using one_side_transitivity by blast
      qed
      hence "B D OS A X" 
        using one_side_symmetry by blast
      ultimately
      show ?thesis 
        using col_one_side_out by blast
    qed
    moreover
    have "B Out C Y" 
    proof -
      have "D  Y" 
        using Y  D by auto
      moreover
      have "B A ParStrict D Y0" 
        using B A ParStrict Y0 D par_strict_right_comm by blast
      moreover
      have "Col D Y0 Y" 
        using Col_perm Col Y0 D Y by blast
      ultimately
      show ?thesis 
        using B A OS C Y Col B C Y col_one_side_out by blast
    qed
    moreover 
    have "¬ Col B D X" 
      by (metis Col A B X ¬ Col D B A 
          calculation(1) col_trivial_2 colx 
          not_col_permutation_3 not_col_permutation_5 out_diff2)
    hence "Per B X Y" 
    proof -
      have "B  X" 
        using ¬ Col B D X col_trivial_3 by auto
      moreover
      have "B A Perp Y X" 
        using Perp_perm A B Perp Y X by blast
      moreover
      have "Col B A X" 
        by (simp add: B Out A X out_col)
      ultimately
      show ?thesis 
        using Per_perm col_trivial_3 l8_16_1 by blast
    qed
    moreover
    have "X  B" 
      using ¬ Col B D X col_trivial_3 by auto
    have "Cong B D X Y" 
    proof -
      have "(¬ Col B Y D  Y D B CongA B X Y  
             B Y D CongA Y B X  Cong B Y Y B) 
          
             (Cong B D Y X  Cong Y D B X  D B Y CongA X Y B)" 
        using l11_50_2 by blast
      moreover
      have "¬ Col B Y D" 
        by (metis Col Y0 D Y D B OS A Y0 Y  D 
            col124__nos col_transitivity_1 
            not_col_permutation_2)
      moreover
      have "Per Y D B" 
      proof -
        have "D Y0 Perp D B" 
          using Perp_perm D B Perp Y0 D by blast
        moreover
        have "Col D Y0 Y" 
          using Col_perm Col Y0 D Y by blast
        ultimately
        show ?thesis 
          using Y  D perp_col perp_per_2 by presburger
      qed
      hence "Y D B CongA B X Y" 
        using Per B X Y B  D X  B Y  D 
          Y  X l11_16 by blast
      moreover
      have "D Y B CongA X B Y" 
      proof -
        have "Y B TS X D" 
        proof -
          have "Y B TS A D" 
          proof -
            have "Col C B Y" 
              using Col_perm Col B C Y by blast
            moreover
            have "Col C B B" 
              using col_trivial_2 by auto
            moreover
            have "C B TS A D" 
              using Col_cases B A OS C D 
                C InAngle A B D Col B C D  False 
                col123__nos in_angle_two_sides by blast
            ultimately
            show ?thesis 
              using Y  B col_preserves_two_sides by blast
          qed
          moreover
          have "¬ Col B Y A  ¬ Col B Y X" 
            using Col_cases ¬ Col Y B A by blast
          hence "Y B OS A X" 
            by (meson  B Out A X Y B TS A D 
                invert_one_side l9_8_1 out_out_one_side)
          ultimately
          show ?thesis 
            using l9_8_2 by blast
        qed
        hence "Y B TS D X" 
          using l9_2 by blast
        moreover
        have "D Y0 Par B A" 
          using Par_perm B A Par Y0 D by blast
        hence "D Y Par B A" 
          by (metis Col Y0 D Y Y  D 
              not_col_permutation_4 par_col_par par_symmetry)
        hence "D Y Par B X" 
          by (metis Col A B X X  B 
              col_permutation_4 par_col_par)
        hence "Y D Par B X" 
          using Par_perm by blast
        moreover
        have "alternate_interior_angles_postulate" 
          by (simp add: assms 
              playfair__alternate_interior 
              proclus_s_postulate_implies_strong_parallel_postulate
              strong_parallel_postulate_implies_tarski_s_euclid
              tarski_s_euclid_implies_playfair_s_postulate)
        ultimately
        show ?thesis 
          using alternate_interior_angles_postulate_def by blast
      qed
      hence "B Y D CongA Y B X" 
        by (simp add: conga_comm)
      moreover
      have "Cong B Y Y B" 
        by (simp add: cong_pseudo_reflexivity)
      ultimately
      show ?thesis 
        using not_cong_1243 by blast
    qed
    have "P Q Lt X Y" 
    proof -
      have "P Q Le B D" 
        by (meson Bet B D0 D Cong D0 D P Q 
            bet__le2313 cong__le3412 le_transitivity)
      hence "P Q Le X Y" 
        using Bet B D0 D Cong B D X Y Cong D0 D P Q 
          bet__le2313 l5_6 by blast
      moreover
      have "¬ Cong P Q X Y" 
        by (metis Bet B D0 D Cong B D X Y 
            Cong D0 D P Q D0  B bet_le_eq 
            cong__le cong_symmetry l5_6)
      ultimately
      show ?thesis 
        using Lt_def by blast
    qed
    ultimately
    have " X Y. B Out A X  B Out C Y  Per B X Y  P Q Lt X Y" 
      by blast
  }
  thus ?thesis 
    using aristotle_s_axiom_def by blast
qed

(** This proof is inspired by Several topics from geometry, by Franz Rothe *)

lemma aristotle__obtuse_case_elimination:
  assumes "aristotle_s_axiom"
  shows "¬ hypothesis_of_obtuse_saccheri_quadrilaterals" 
proof -
  {
    assume "hypothesis_of_obtuse_saccheri_quadrilaterals" 
    obtain Q' C' P Q where "Lambert Q' C' P Q" 
      using ex_lambert by blast
    have "Obtuse C' P Q" 
      using HypothesisObtuseSaccheriQuadrilaterals 
        Lambert Q' C' P Q lam_obtuse__oah by blast
    have "Q' Q ParStrict C' P" 
      using lam__pars1423 Lambert Q' C' P Q by force
    have " A'. P Q Perp A' P  P Q OS C' A'"
    proof -
      have "Col P Q P" 
        by (simp add: col_trivial_3)
      moreover
      have "¬ Col P Q C'" 
        by (meson Par_strict_cases Q' Q ParStrict C' P
            not_col_distincts not_col_permutation_4 par_not_col)
      ultimately
      show ?thesis 
        using l10_15 by force
    qed
    then obtain A' where "P Q Perp A' P" and "P Q OS C' A'" 
      by blast
    have "Q P A' LtA C' P Q" 
    proof -
      have "Obtuse C' P Q" 
        by (simp add: Obtuse C' P Q)
      moreover
      have "Q  P" 
        using calculation obtuse_distincts by blast
      moreover
      have "P  A'" 
        using P Q Perp A' P perp_not_eq_2 by blast
      moreover
      have "Per Q P A'" 
        using P Q Perp A' P perp_per_1 by auto
      ultimately
      show ?thesis 
        by (simp add: obtuse_per__lta)
    qed
    have "Q P A' LeA C' P Q" 
      by (simp add: Q P A' LtA C' P Q lta__lea)
    have "¬ Q P A' CongA C' P Q" 
      by (simp add: Q P A' LtA C' P Q lta_not_conga)
    have "A' InAngle Q P C'" 
    proof -
      have "Q P A' LeA Q P C'" 
        by (simp add: Q P A' LeA C' P Q lea_right_comm)
      moreover
      have "Q P OS C' A'" 
        by (simp add: P Q OS C' A' invert_one_side)
      ultimately
      show ?thesis 
        by (simp add: lea_in_angle)
    qed
    obtain C where "Bet C' P C" and "Cong P C C' P" 
      by (metis between_inner_transitivity 
          outer_transitivity_between 
          point_construction_different segment_construction_2)
    obtain A where "Bet A' P A" and "Cong P A A' P" 
      by (metis between_inner_transitivity 
          outer_transitivity_between point_construction_different 
          segment_construction_2)
    have "C InAngle A P Q" 
    proof -
      {
        assume "A = P"
        hence "A' = A" 
          using Cong P A A' P cong_diff_3 by blast
        hence "A' = P" 
          by (simp add: A = P)
        hence False 
          using P Q Perp A' P perp_not_eq_2 by blast
      }
      hence "A  P" 
        by auto
      moreover
      have "Bet A' P A" 
        by (simp add: Bet A' P A)
      moreover
      have "Q InAngle A' P C" 
      proof -
        {
          assume "C = P"
          hence "C = C'" 
            using Cong P C C' P cong_diff_4 by blast
          hence "C' = P" 
            using C = P by blast
          hence False 
            using Obtuse C' P Q obtuse_distincts by blast
        }
        hence "C  P" 
          by blast
        moreover
        have "A' InAngle C' P Q" 
          using A' InAngle Q P C' l11_24 by blast
        ultimately
        show ?thesis 
          by (meson Bet C' P C in_angle_reverse l11_24)
      qed
      ultimately
      show ?thesis 
        using in_angle_reverse by blast
    qed
    {
      assume "Col P C' A'"
      have "P Out Q Q" 
        using C InAngle A P Q inangle_distincts out_trivial by blast
      moreover
      have "P Out C' A'" 
        using Col P C' A' P Q OS C' A' col_one_side_out by auto
      ultimately
      have False 
        using conga_right_comm by (meson ¬ Q P A' CongA C' P Q out2__conga)
    }
    hence "¬ Col P C' A'" 
      by blast
    have "¬ Col P C A" 
      by (metis Bet A' P A Bet C' P C 
          Col P C' A'  False Cong P A A' P Cong P C C' P
          bet_col bet_col1 col_permutation_4 
          col_permutation_5 colx cong_diff_4)
    have "¬ Col P Q C" 
      by (metis (no_types, lifting) Bet C' P C 
          Cong P C C' P P Q OS C' A' bet_col bet_cong_eq 
          col_permutation_1 col_transitivity_1 
          one_side_not_col123)
    have "Per A P Q" 
      by (metis Perp_cases Bet A' P A P Q Perp A' P
          bet_col bet_col1 l8_20_1_R1 perp_col2 perp_per_2)
    have "A P OS C Q" 
      by (metis Bet A' P A C InAngle A P Q 
          P Q OS C' A' ¬ Col P C A bet_col col124__nos 
          col_permutation_5 colx in_angle_one_side 
          not_col_distincts)
    have " X Y. P Out A X  P Out C Y  Per P X Y  P Q Lt X Y" 
    proof -
      have "¬ Col A P C" 
        using ¬ Col P C A not_col_permutation_2 by blast
      moreover
      have "A P C LtA A P Q" 
      proof -
        have "A P C LeA A P Q" 
          by (simp add: C InAngle A P Q inangle__lea)
        moreover
        {
          assume "A P C CongA A P Q" 
          have "A P OS C Q" 
            by (simp add: A P OS C Q)
          hence "P Out C Q" 
            using conga_os__out A P C CongA A P Q by blast
          hence "Col P Q C" 
            by (meson not_col_permutation_5 out_col)
          hence False 
            using ¬ Col P Q C by auto
        }
        hence "¬ A P C CongA A P Q" 
          by blast
        ultimately
        show ?thesis 
          by (simp add: LtA_def)
      qed
      hence "Acute A P C" 
        using Per A P Q Acute_def by blast
      ultimately
      show ?thesis 
        using aristotle_s_axiom_def assms by blast
    qed
    then obtain X Y where "P Out A X" and "P Out C Y"
      and "Per P X Y" and "P Q Lt X Y"
      by blast
    have "¬ Col P Q Y" 
      by (metis Out_def P Out C Y ¬ Col P Q C
          colx not_col_distincts out_col)
    then obtain Z where "Col P Q Z" and "P Q Perp Y Z" 
      using l8_18_existence by blast
    have "X Y Lt P Q" 
    proof -
      have "X Y Lt P Z" 
      proof -
        {
          assume "P = Z" 
          have "P  Y" 
            using ¬ Col P Q Y not_col_distincts by blast
          moreover
          have "Per Q P Y"
            using P = Z P Q Perp Y Z perp_per_1 by auto
          moreover
          have "Col P Y C" 
            using P Out C Y l6_6 out_col by blast
          ultimately
          have "Per Q P C" 
            using per_col by blast
          have "Col P C A" 
          proof -
            have "Coplanar P Q C A" 
              by (meson C InAngle A P Q 
                  inangle__coplanar ncoplanar_perm_16)
            moreover
            have "P C Perp P Q" 
              using Per Q P C 
              by (metis Perp_perm os_distincts out_distinct
                  P Out C Y P Q OS C' A' per_perp)
            moreover
            have "P A Perp P Q" 
              by (metis Perp_cases bet_col1 l5_1
                  Bet A' P A Cong P A A' P P Q Perp A' P 
                  bet_cong_eq perp_col2 perp_distinct)
            ultimately
            show ?thesis 
              using cop_perp2__col by blast
          qed
          hence False 
            using ¬ Col P C A by auto
        }
        hence "P  Z" 
          by blast
        have "Lambert P X Y Z" 
        proof -
          have "P  X" 
            using P Out A X out_diff2 by blast
          moreover
          have "X  Y" 
            using P Q Lt X Y lt_diff by blast
          moreover
          have "Y  Z" 
            using Col P Q Z ¬ Col P Q Y by blast
          moreover
          have "P  Z" 
            using P  Z by blast
          moreover
          have "Per X P Z" 
          proof -
            have "P  Q" 
              using ¬ Col P Q Y col_trivial_1 by force
            moreover
            have "Per X P Q" 
              by (metis out_distinct P Out A X Per A P Q l8_3 out_col)
            ultimately
            show ?thesis 
              using Col P Q Z per_col by blast
          qed
          moreover
          have "Per P Z Y" 
          proof -
            have "P  Z" 
              using calculation(4) by blast
            moreover
            have "P Q Perp Y Z" 
              using P Q Perp Y Z by auto
            ultimately
            show ?thesis 
              by (meson Col P Q Z perp_col perp_comm perp_per_2)
          qed
          moreover
          have "Y InAngle X P Q" 
          proof -
            have "P Out X A" 
              using Out_cases P Out A X by blast
            moreover
            have "P Out Q Q" 
              using A' InAngle Q P C' inangle_distincts out_trivial by blast
            moreover
            have "P Out Y C" 
              by (simp add: P Out C Y l6_6)
            ultimately
            show ?thesis 
              using C InAngle A P Q l11_25 by blast
          qed
          hence "Coplanar P X Y Z" 
            using Col P Q Z ¬ Col P Q Y col_cop__cop 
              inangle__coplanar ncoplanar_perm_14 
              not_col_distincts by blast
          ultimately
          show ?thesis 
            using Lambert_def Per P X Y by blast
        qed
        hence "Obtuse X Y Z" 
          using HypothesisObtuseSaccheriQuadrilaterals
            lam_obtuse__oah_2 by blast
        thus ?thesis 
          by (simp add: Lambert P X Y Z lam_obtuse__lt)
      qed
      moreover
      have "P Z Lt P Q" 
      proof -
        have "Q Out P Z" 
        proof -
          have "Col Q P Z" 
            using Col_cases Col P Q Z by auto
          moreover
          have "Q Q' OS P Z" 
          proof -
            have "Q Q' ParStrict P Y" 
              by (metis Bet C' P C P Out C Y 
                  Q' Q ParStrict C' P ¬ Col P Q C
                  bet_col not_col_distincts out_col 
                  out_diff2 par_strict_col2_par_strict 
                  par_strict_left_comm)
            hence "Q Q' OS P Y" 
              using l12_6 by blast
            moreover
            have "Q Q' OS Y Z" 
            proof -
              have "Q Q' Par Y Z" 
              proof -
                have "Coplanar P Q Q Y" 
                  using ncop_distincts by blast
                moreover
                have "Coplanar P Q Q Z" 
                  using ncop_distincts by blast
                moreover
                have "Coplanar P Q Q' Y" 
                  by (meson Q Q' OS P Y cop2_os__osp
                      ncop_distincts one_side_symmetry osp_distincts)
                moreover
                have "Coplanar P Q Q' Z" 
                  using Col P Q Z ncop__ncols by blast
                moreover
                have "Lambert Q' C' P Q" 
                  by (simp add: Lambert Q' C' P Q)
                hence "Per C' Q' Q  Per Q' Q P  Per Q' C' P" 
                  using Lambert_def by blast
                hence "Q Q' Perp P Q" 
                  by (metis os_distincts Lambert Q' C' P Q 
                      P Q OS C' A' lam__os per_perp perp_comm)
                moreover
                have "Y Z Perp P Q" 
                  by (meson Perp_perm P Q Perp Y Z)
                ultimately
                show ?thesis 
                  using l12_9 by blast
              qed
              moreover
              have "Col Y Z Y" 
                by (simp add: col_trivial_3)
              moreover
              have "¬ Col Q Q' Y" 
              proof -
                have "P C' ParStrict Q Q'" 
                  using Par_strict_perm Q' Q ParStrict C' P by blast
                moreover
                have "Col Y P C" 
                  using P Out C Y not_col_permutation_1 out_col by blast
                ultimately
                show ?thesis 
                  using Q Q' OS P Y one_side_not_col124 by blast
              qed
              ultimately
              show ?thesis 
                by (meson l12_6 par_not_col_strict)
            qed
            ultimately
            show ?thesis 
              using one_side_transitivity by blast
          qed
          ultimately
          show ?thesis 
            using col_one_side_out by blast
        qed
        have "P Out Z Q" 
        proof -
          have "Col P Z Q" 
            using NCol_perm Col P Q Z by blast
          moreover
          have "P A OS Z Q" 
          proof -
            have "P A OS Z Y" 
            proof -
              have "P A Par Z Y" 
              proof -
                have "Coplanar P Q P Z" 
                  using ncop_distincts by blast
                moreover
                have "Coplanar P Q P Y" 
                  using ncop_distincts by blast
                moreover
                have "Coplanar P Q A Z" 
                  using Col P Q Z ncop__ncols by blast
                moreover
                have "Coplanar P Q A Y" 
                proof -
                  have "Coplanar Q A P C" 
                    by (meson C InAngle A P Q inangle__coplanar ncoplanar_perm_21)
                  moreover
                  have "P  C" 
                    using ¬ Col P C A not_col_distincts by blast
                  ultimately
                  show ?thesis 
                    by (meson P Out C Y col_cop__cop 
                        ncoplanar_perm_8 out_col)
                qed
                moreover
                have "P A Perp P Q" 
                  by (metis Perp_cases Bet A' P A 
                      Cong P A A' P P Q Perp A' P bet_col 
                      bet_col1 cong_diff_3 perp_col2)
                moreover
                have "Z  Y Perp P Q" 
                  using Perp_perm P Q Perp Y Z by blast
                ultimately
                show ?thesis 
                  using l12_9 by blast
              qed
              moreover
              have "Col Z Y Y" 
                using col_trivial_2 by auto
              moreover
              have "¬ Col P A Y" 
                by (metis Out_def P Out C Y ¬ Col P C A 
                    colx not_col_distincts 
                    not_col_permutation_5 out_col)
              ultimately
              show ?thesis 
                using l12_6 par_not_col_strict by blast
            qed
            moreover
            have "P A OS Y Q" 
              by (meson A P OS C Q P Out C Y 
                  invert_one_side not_col_distincts os_out_os)
            ultimately
            show ?thesis 
              using one_side_transitivity by blast
          qed
          ultimately
          show ?thesis 
            using col_one_side_out by blast
        qed
        hence "Bet P Z Q" 
          using Q Out P Z out2__bet by blast
        thus ?thesis 
          by (metis P Q Lt X Y bet__lt1213 calculation lt_transitivity)
      qed
      ultimately
      show ?thesis 
        by (meson lt_transitivity)
    qed
    hence False 
      using P Q Lt X Y not_and_lt by blast
  }
  thus ?thesis 
    by auto
qed


lemma aristotle__acute_or_right:
  assumes "aristotle_s_axiom" 
  shows "hypothesis_of_acute_saccheri_quadrilaterals 
            
         hypothesis_of_right_saccheri_quadrilaterals" 
proof -
  {
    assume "hypothesis_of_obtuse_saccheri_quadrilaterals" 
    have "hypothesis_of_acute_saccheri_quadrilaterals  
          hypothesis_of_right_saccheri_quadrilaterals" 
      using aristotle__obtuse_case_elimination assms
        saccheri_s_three_hypotheses by blast
  }
  thus ?thesis
    using saccheri_s_three_hypotheses 
      aristotle__obtuse_case_elimination assms by blast
qed

lemma Axiom1ProofIsabelleHOL:
  shows "Axiom1" 
  using Axiom1_def by blast

theorem equivalent_postulates_without_decidability_of_intersection_of_lines:
  shows "(Postulate07  Postulate12)  
         (Postulate12  Postulate08) 
         (Postulate08  Postulate06)  
         (Postulate06  Postulate09) 
         (Postulate09  Postulate02)  
         (Postulate02  Postulate11) 
         (Postulate11  Postulate10)  
         (Postulate10  Postulate05)" 
proof - 
  have "Postulate09  Postulate10" 
  proof -
    have "Postulate09  Postulate10" 
      using Postulate09_def Postulate10_def 
        par_perp_perp_implies_par_perp_2_par by auto
    moreover
    have "Postulate10  Postulate09" 
      using Postulate09_def Postulate10_def 
        par_perp_2_par_implies_par_perp_perp by blast
    ultimately
    show ?thesis
      by blast
  qed
  moreover
  have "Postulate09  Postulate02" 
    by (simp add: Postulate02_def Postulate09_def 
        par_perp_perp_implies_playfair)
  moreover
  have "Postulate02  Postulate11" 
    using Postulate02_def Postulate11_def 
      playfair__universal_posidonius_postulate by blast
  moreover
  have "Postulate11  Postulate09" 
    by (simp add: Postulate09_def Postulate11_def 
        universal_posidonius_postulate__perpendicular_transversal_postulate)
  moreover
  have "Postulate02  Postulate05" 
  proof -
    have "Postulate02  Postulate05" 
      using Postulate02_def Postulate05_def 
        playfair_implies_par_trans by auto
    moreover
    have "Postulate05  Postulate02" 
      using Postulate02_def Postulate05_def 
        par_trans_implies_playfair by blast
    ultimately
    show ?thesis 
      by blast
  qed
  moreover
  have "Postulate02  Postulate07" 
    using Postulate07_def Postulate11_def calculation(3) 
      par_perp_perp_implies_playfair playfair__alternate_interior 
      universal_posidonius_postulate__perpendicular_transversal_postulate by blast
  moreover
  have "Postulate07  Postulate12" 
    using Postulate07_def Postulate12_def 
      alternate_interior__playfair_bis by blast
  moreover
  have "Postulate12  Postulate02" 
    using Postulate11_def Postulate12_def calculation(2) 
      calculation(4) playfair__universal_posidonius_postulate 
      playfair_bis__playfair by blast
  moreover
  have "Postulate07  Postulate08" 
  proof -
    have "Postulate07  Postulate08" 
      using Postulate07_def Postulate08_def 
        alternate_interior__consecutive_interior by auto
    moreover
    have "Postulate08  Postulate07" 
      using Postulate07_def Postulate08_def 
        consecutive_interior__alternate_interior by blast
    ultimately
    show ?thesis
      by blast
  qed
  moreover
  have "Postulate02  Postulate06"
  proof -
    have "Postulate02  Postulate06" 
      using Postulate02_def Postulate06_def 
        playfair_s_postulate_implies_midpoint_converse_postulate by blast
    moreover
    have "Postulate06  Postulate02" 
      using Postulate02_def Postulate06_def 
        midpoint_converse_postulate_implies_playfair by auto
    ultimately
    show ?thesis
      by blast
  qed
  ultimately
  show ?thesis 
    by blast
qed

lemma Cycle_1:
  shows "(Postulate01  Postulate02)  
         (Postulate09  Postulate15) 
         (Postulate15  Postulate01)" 
proof -
  have "Postulate01  Postulate02" 
    by (simp add: Postulate01_def Postulate02_def 
        tarski_s_euclid_implies_playfair_s_postulate)
  moreover
  have "Postulate09  Postulate15" 
    using inter_dec_plus_par_perp_perp_imply_triangle_circumscription 
      Postulate09_def Postulate15_def by fastforce
  moreover
  have "Postulate15  Postulate01" 
    by (simp add: Postulate01_def Postulate15_def 
        triangle_circumscription_implies_tarski_s_euclid)
  ultimately
  show ?thesis 
    by auto
qed

lemma Cycle_2:
  shows "(Postulate01  Postulate13)  
         (Postulate13  Postulate14) 
         (Postulate14  Postulate16)  
         (Postulate16  Postulate17)  
         (Postulate17  Postulate18) 
         (Postulate18  Postulate19)  
         (Postulate19  Postulate20)  
         (Postulate20  Postulate01)"
proof -
  have "Postulate01  Postulate17" 
    using Postulate01_def Postulate17_def 
      tarski_s_euclid_implies_euclid_5 by blast
  moreover
  have "Postulate17  Postulate20" 
    by (simp add: Postulate17_def Postulate20_def 
        euclid_5__original_euclid)
  moreover
  have "Postulate20  Postulate19" 
    using Postulate19_def Postulate20_def 
      original_euclid__original_spp by blast
  moreover
  have "Postulate19  Postulate16" 
    by (simp add: Postulate16_def Postulate19_def 
        original_spp__inverse_projection_postulate)
  moreover
  have "Postulate16  Postulate14" 
    using Postulate14_def Postulate16_def 
      inverse_projection_postulate__proclus_bis by blast
  moreover
  have "Postulate14  Postulate13" 
    by (simp add: Postulate13_def Postulate14_def
        proclus_bis__proclus)
  moreover
  have "Postulate13  Postulate18" 
    by (simp add: Postulate13_def Postulate18_def
        proclus_s_postulate_implies_strong_parallel_postulate)
  moreover
  have "Postulate18  Postulate01" 
    using Postulate01_def Postulate18_def 
      strong_parallel_postulate_implies_tarski_s_euclid by blast
  ultimately
  show ?thesis 
    by auto
qed

lemma Cycle_3:
  shows "(Postulate03  Postulate21)  
         (Postulate21  Postulate22) 
         (Postulate22  Postulate23)  
         (Postulate23  Postulate24)  
         (Postulate24  Postulate25) 
         (Postulate25  Postulate26)  
         (Postulate26  Postulate27)  
         (Postulate27  Postulate28)  
         (Postulate28  Postulate29)  
         (Postulate29  Postulate30) 
         (Postulate30  Postulate03)"
proof -
  have "Postulate03  Postulate21" 
    using Postulate03_def Postulate21_def 
      triangle__existential_triangle by blast
  moreover
  have "Postulate21  Postulate27" 
    using Postulate21_def Postulate27_def 
      existential_triangle__rah by fastforce
  moreover
  have "Postulate27  Postulate03" 
    by (simp add: Postulate03_def 
        Postulate27_def rah__triangle)
  moreover
  have "Postulate27  Postulate28" 
  proof -
    have "Postulate27  Postulate28" 
      by (simp add: Postulate27_def Postulate28_def 
          rah__existential_saccheri)
    moreover
    have "Postulate28  Postulate27" 
      by (simp add: Postulate27_def Postulate28_def 
          existential_saccheri__rah) 
    ultimately show ?thesis
      by auto
  qed
  moreover
  have "Postulate27  Postulate29" 
    using Postulate27_def Postulate29_def 
      rah__rectangle_principle by fastforce
  moreover
  have "Postulate29  Postulate30" 
    using Postulate29_def Postulate30_def 
      rectangle_principle__rectangle_existence by blast
  moreover
  have "Postulate30  Postulate27" 
    by (simp add: Postulate27_def Postulate30_def 
        rectangle_existence__rah)
  moreover
  have "Postulate27  Postulate22" 
  proof -
    have "Postulate27  Postulate22" 
      using Postulate22_def Postulate27_def 
        rah__posidonius by blast
    moreover
    have "Postulate22  Postulate27" 
      using Postulate22_def Postulate27_def 
        posidonius_postulate__rah by blast
    ultimately
    show ?thesis 
      by auto
  qed
  moreover
  have "Postulate27  Postulate24" 
    using Postulate24_def Postulate27_def 
      rah__thales_postulate by presburger
  moreover
  have "Postulate24  Postulate25" 
    by (simp add: Postulate24_def Postulate25_def 
        thales_postulate__thales_converse_postulate)
  moreover
  have "Postulate25  Postulate26" 
    using Postulate25_def Postulate26_def 
      thales_converse_postulate__thales_existence by fastforce
  moreover
  have "Postulate26  Postulate27" 
    using Postulate26_def Postulate30_def calculation(7)
      rah__rectangle_principle 
      rectangle_principle__rectangle_existence thales_existence__rah by blast
  moreover
  have "Postulate27  Postulate23" 
  proof -
    have "Postulate27  Postulate23" 
      using Postulate23_def Postulate26_def calculation(10)
        calculation(11) calculation(9) rah__similar 
        thales_existence__rah by blast
    moreover
    have "Postulate23  Postulate27" 
      using Postulate22_def Postulate23_def 
        Postulate27 = Postulate22 rah__posidonius 
        similar__rah by blast 
    ultimately
    show ?thesis 
      by auto
  qed
  ultimately
  show ?thesis by blast
qed

lemma InterCycle1:
  assumes "greenberg_s_axiom" and "Postulate03"
  shows "Postulate12" 
  using greenberg_s_axiom_def Postulate03_def Postulate12_def 
    assms(1) assms(2) triangle__playfair_bis by blast

lemma InterCycle2:
  assumes "Postulate07"
  shows "Postulate03" 
  using Postulate03_def Postulate07_def 
    alternate_interior__triangle assms by blast

lemma InterCycle3:
  assumes "Postulate01"
  shows "Postulate02" 
  using Postulate01_def Postulate02_def assms 
    tarski_s_euclid_implies_playfair_s_postulate by blast

lemma InterCycle4:
  assumes "Postulate09"
  shows "Postulate15" 
  using Postulate09_def Postulate15_def assms 
    inter_dec_plus_par_perp_perp_imply_triangle_circumscription 
  by auto

lemma InterAx1_R1:
  assumes "Postulate13"
  shows "aristotle_s_axiom" 
  using proclus__aristotle aristotle_s_axiom_def 
    Postulate13_def assms by blast

lemma InterAx1:
  assumes "Postulate01"
  shows "aristotle_s_axiom" 
  using InterAx1_R1 Postulate01_def Postulate13_def 
    assms euclid_5__original_euclid 
    inverse_projection_postulate__proclus_bis 
    original_euclid__original_spp original_spp__inverse_projection_postulate 
    proclus_bis__proclus 
    tarski_s_euclid_implies_euclid_5 by blast

lemma InterAx3:
  assumes "greenberg_s_axiom" and "Postulate02"
  shows "Postulate01" 
proof -
  have "Postulate03" 
    using Postulate02_def Postulate03_def alternate_interior__triangle 
      assms(2) playfair__alternate_interior by blast
  hence "Postulate12" 
    using InterCycle1 assms(1) by auto
  thus ?thesis 
    using greenberg_s_axiom_def Postulate01_def Postulate07_def 
      alternate_interior__proclus assms(1) 
      equivalent_postulates_without_decidability_of_intersection_of_lines 
      proclus_s_postulate_implies_strong_parallel_postulate 
      strong_parallel_postulate_implies_tarski_s_euclid by blast
qed

lemma InterAx4:
  assumes "Postulate01"
  shows "Axiom1" 
  by (simp add: Axiom1ProofIsabelleHOL)

lemma InterAx5:
  assumes (*"Axiom1" and*) "Postulate02"
  shows "Postulate01" 
proof -
  have "Postulate15" 
    using InterCycle4 Postulate02_def Postulate09_def 
      assms playfair__universal_posidonius_postulate 
      universal_posidonius_postulate__perpendicular_transversal_postulate
    by blast
  thus ?thesis 
    using Postulate01_def Postulate15_def 
      triangle_circumscription_implies_tarski_s_euclid by blast
qed

lemma PPR_Theorem_4_bis: 
  assumes "Postulate01"
  shows "greenberg_s_axiom" 
  using aristotle_s_axiom_def greenberg_s_axiom_def InterAx1 InterAx5 
    aristotle__greenberg assms by blast

lemma PPR_Proposition_6:
  assumes "archimedes_axiom"
  shows "aristotle_s_axiom"
  using t22_24 archimedes_axiom_def aristotle_s_axiom_def assms by blast

lemma InterCycle1bis: 
  assumes "Postulate01"
  shows "Postulate03  Postulate12" 
  using Cycle_1 assms 
    equivalent_postulates_without_decidability_of_intersection_of_lines by blast

lemma weak_inverse_projection_postulate__weak_tarski_s_parallel_postulate:
  assumes "weak_inverse_projection_postulate"
  shows "weak_tarski_s_parallel_postulate" 
proof -
  {
    fix A B C P T
    assume "Per A B C" and
      "T InAngle A B C" and
      "P  T" and
      "P B A CongA P B C" and
      "Per B P T" and 
      "Coplanar A B C P" 
    have "B  P" 
      using P B A CongA P B C conga_diff45 by blast
    have "B  A" 
      using P B A CongA P B C conga_diff2 by blast
    have "B  C" 
      using T InAngle A B C inangle_distincts by blast
    have "P InAngle A B C" 
      by (meson conga_inangle_per2__inangle 
          Coplanar A B C P P B A CongA P B C Per A B C 
          Per B P T T InAngle A B C)
    have "P B A P B A SumA A B C" 
    proof -
      have "A B P P B C SumA A B C" 
        by (simp add: inangle__suma P InAngle A B C)
      moreover have "A B P CongA P B A" 
        using B  A B  P conga_pseudo_refl by auto
      moreover have "P B C CongA P B A" 
        using P B A CongA P B C conga_sym_equiv by force
      moreover have "A B C CongA A B C" 
        using B  A B  C conga_refl by auto
      ultimately show ?thesis 
        using conga3_suma__suma by blast
    qed
    have "Acute P B A" 
      by (meson conga_inangle_per__acute P B A CongA P B C 
          P InAngle A B C Per A B C acute_sym)
    have "B Out P P" 
      using B  P out_trivial by auto
    {
      assume "Col A B C" 
      hence "¬ Per A B C" 
        using B  A B  C per_not_col by force
      hence False 
        using Per A B C by blast
    }
    hence "¬ Col A B C" 
      by blast
    have "Coplanar P B A T" 
      by (metis Col_cases Coplanar A B C P T InAngle A B C ¬ Col A B C 
          coplanar_perm_12 coplanar_perm_21 coplanar_trans_1 inangle__coplanar)
    hence " X. B Out A X  Col P T X" 
      using Acute P B A Per A B C P B A P B A SumA A B C B Out P P
        P  T Per B P T
        assms weak_inverse_projection_postulate_def
      by blast
    then obtain X where "B Out A X" and "Col P T X" 
      by blast
    have " Y. B Out C Y  Col P T Y" 
    proof -
      have "Acute P B C" 
        using Acute P B A P B A CongA P B C acute_conga__acute by blast
      moreover have "Per C B A" 
        using Per_perm Per A B C by blast
      moreover have "P B C P B C SumA C B A" 
        by (metis Tarski_neutral_dimensionless.conga3_suma__suma 
            Tarski_neutral_dimensionless_axioms B  A B  C 
            P B A CongA P B C P B A P B A SumA A B C conga_pseudo_refl)
      moreover have "Coplanar P B C T" 
        by (meson Col A B C  False Coplanar A B C P 
            T InAngle A B C coplanar_pseudo_trans inangle__coplanar 
            ncop_distincts ncoplanar_perm_18)
      ultimately show ?thesis
        using B Out P P P  T  Per B P T
          assms weak_inverse_projection_postulate_def
        by blast
    qed
    then obtain Y where "B Out C Y" and "Col P T Y" 
      by blast
    hence " X Y. (B Out A X  Col T P X  B Out C Y  Col T P Y)" 
      using B Out A X Col P T X not_col_permutation_4 by blast
  }
  moreover
  {
    assume LEMME: " A B C P T. Per A B C  T InAngle A B C 
                                P  T  P B A CongA P B C  Per B P T 
                                Coplanar A B C P
                    
                   ( X Y. (B Out A X  Col T P X  B Out C Y  Col T P Y))"
    {
      fix A B C T
      assume "Per A B C" and "T InAngle A B C"
      obtain P0 where "P0 InAngle A B C" and "P0 B A CongA P0 B C"  
        using T InAngle A B C angle_bisector inangle_distincts by blast
      have "A  B" 
        using P0 B A CongA P0 B C conga_diff2 by auto
      have "C  B" 
        using T InAngle A B C inangle_distincts by blast
      have "T  B" 
        using T InAngle A B C inangle_distincts by blast
      have "P0  B" 
        using P0 B A CongA P0 B C conga_diff45 by blast
      {
        assume "Col A B C"
        hence "¬ Per A B C" 
          using A  B C  B per_not_col by force
        hence False 
          by (simp add: Per A B C)
      }
      hence "¬ Col A B C" 
        by blast
      have "¬ Col P0 B A" 
      proof -
        have "P0 B A P0 B A SumA A B C" 
        proof -
          have "A B P0 P0 B C SumA A B C" 
            using P0 InAngle A B C inangle__suma by force
          moreover have "A B P0 CongA P0 B A" 
            using A  B P0  B conga_pseudo_refl by auto
          moreover have "P0 B C CongA P0 B A" 
            using P0 B A CongA P0 B C not_conga_sym by blast
          moreover have "A B C CongA A B C" 
            by (simp add: A  B C  B conga_refl)
          ultimately show ?thesis
            using conga3_suma__suma by blast
        qed
        thus ?thesis 
          using ¬ Col A B C col2_suma__col by blast
      qed
      {
        assume "Col B P0 T"
        have " T'. T' InAngle A B C  B T Perp T T'" 
        proof -
          obtain T0 where "B P0 Perp T0 T" and "B P0 OS A T0" 
            using Col_cases Col B P0 T ¬ Col P0 B A l10_15 by blast
          have " T'. T' InAngle A B C  T  T'  Col T T0 T'"
          proof -
            have "¬ B Out A C" 
              using Col_cases ¬ Col A B C out_col by blast
            moreover have "T InAngle A B C" 
              by (simp add: T InAngle A B C)
            moreover have "Coplanar A B C T0" 
            proof -
              have "Coplanar P0 B A A" 
                using ncop_distincts by auto
              moreover have "Coplanar P0 B A B"
                using ncop_distincts by auto
              moreover have "Coplanar P0 B A C" 
                using P0 InAngle A B C inangle__coplanar ncoplanar_perm_2 by blast
              moreover have "Coplanar P0 B A T0" 
                by (simp add: B P0 OS A T0 invert_one_side os__coplanar)
              ultimately show ?thesis 
                using ¬ Col P0 B A coplanar_perm_6 coplanar_trans_1 by blast
            qed
            ultimately show ?thesis
              using cop_inangle__ex_col_inangle by blast
          qed
          then obtain T' where "T' InAngle A B C" and 
            "T  T'" and "Col T T0 T'" by blast
          have "B P0 Perp T T'" 
            by (metis B P0 Perp T0 T Col T T0 T' T  T' 
                not_col_distincts perp_col2_bis)
          hence "B T Perp T T'" 
            by (metis perp_col  Col B P0 T T  B)
          thus ?thesis 
            using T' InAngle A B C by blast
        qed
        then obtain T' where "T' InAngle A B C" and "B T Perp T T'" 
          by blast
        have "T  T'" 
          using B T Perp T T' perp_not_eq_2 by auto
        have " X Y. B Out A X  Col T' T X  B Out C Y  Col T' T Y"
        proof -
          have "T B A CongA T B C"
            using T  B P0 B A CongA P0 B C Col B P0 T col_conga__conga by blast
          moreover have "Per B T T'" 
            using Perp_cases B T Perp T T' perp_per_1 by blast
          moreover have "Coplanar A B C T" 
            using T InAngle A B C coplanar_perm_9 inangle__coplanar by blast
          ultimately show ?thesis 
            using LEMME Per A B C T' InAngle A B C  T  T' by blast
        qed
        then obtain X Y where "B Out A X" and "Col T' T X" and "B Out C Y" and "Col T' T Y"
          by blast
        hence " X Y. B Out A X  B Out C Y  Col X T Y" 
          by (metis Col_cases T  T' col_transitivity_2)
      }
      moreover
      {
        assume "¬ Col B P0 T"
        obtain P where "Col B P0 P" and "B P0 Perp T P" 
          using ¬ Col B P0 T l8_18_existence by blast
        have "B Out P P0" 
        proof - 
          have "Acute T B P0"
            using Per A B C T InAngle A B C P0 B A CongA P0 B C  
              P0 InAngle A B C acute_sym conga_inangle2_per__acute by blast
          thus ?thesis 
            by (meson B P0 Perp T P Col B P0 P acute_col_perp__out)
        qed
        have "P  T" 
          using Col B P0 P ¬ Col B P0 T by blast
        have "P  B" 
          using B Out P P0 l6_3_1 by auto
        have " X Y. B Out A X  B Out C Y  Col X T Y" 
        proof -
          have " X Y. (B Out A X  Col T P X  B Out C Y  Col T P Y)"
          proof -
            have "P B A CongA P B C" 
              by (metis col_conga__conga Col B P0 P P  B P0 B A CongA P0 B C)
            moreover have "Per B P T" 
            proof -
              have "B  P" 
                using P  B by auto
              moreover have "B P0 Perp T P" 
                by (simp add: B P0 Perp T P)
              moreover have "Col B P0 P"  
                by (simp add: Col B P0 P)
              ultimately show ?thesis    
                using col_trivial_3 l8_16_1 l8_2 by blast
            qed
            moreover have "Coplanar A B C P" 
              using Col B P0 P P0 InAngle A B C P0  B col_cop__cop 
                coplanar_perm_11 inangle__coplanar ncoplanar_perm_2 by blast
            ultimately show ?thesis 
              using Per A B C T InAngle A B C P  T LEMME by blast
          qed
          then obtain X Y where "B Out A X  Col T P X  B Out C Y  Col T P Y" by blast
          thus ?thesis 
            using P  T col2__eq col_permutation_2 by blast
        qed
      }
      ultimately
      have " X Y. B Out A X  B Out C Y  Col X T Y" 
        by blast
      then obtain X Y where "B Out A X" and "B Out C Y" and "Col X T Y" 
        by blast
      have "Y  B" 
        using Out_def B Out C Y by auto
      have "X  B" 
        using Out_def B Out A X by auto
      have "¬ Col A B Y" 
        using Out_cases A  B B Out C Y ¬ Col A B C col_out2_col out_trivial by blast
      have "X  Y" 
        using B Out A X ¬ Col A B Y not_col_permutation_4 out_col by blast
      have "Bet X T Y" 
      proof -
        {
          assume "T = X" and "T = Y" 
          have "Bet X T Y" 
            using T = X T = Y X  Y by auto
        }
        moreover
        {
          assume "T  X" and "T  Y" 
          have "B A OS T C" 
            by (metis Col_cases B Out A X Col X T Y T InAngle A B C T  X 
                ¬ Col A B C ¬ Col A B Y colx in_angle_one_side invert_one_side out_col)
          hence "B A OS T Y" 
            using B Out C Y out_out_one_side by blast
          hence "X B OS T Y" 
            by (meson B Out A X X  B col2_os__os not_col_distincts out_col)
          hence "X Out T Y" 
            using Col X T Y col_one_side_out by blast
          have "B C OS T A"
          proof -
            have "¬ Col C B A" 
              using ¬ Col A B C not_col_permutation_3 by blast
            moreover have "¬ Col B C T" 
              by (metis Col_def Out_def B Out A X B Out C Y Col X T Y T  Y 
                  ¬ Col A B C col_permutation_1 colx not_col_distincts)
            moreover have "T InAngle C B A" 
              using T InAngle A B C l11_24 by blast
            ultimately show ?thesis
              using in_angle_one_side invert_one_side by blast
          qed
          hence "B C OS X T" 
            using B Out A X col_trivial_3 one_side_symmetry os_out_os by blast
          hence "Y B OS X T" 
            using B Out C Y Y  B col2_os__os col_trivial_3 out_col by blast
          moreover hence "Y Out X T" 
            using Col_def Col X T Y col_one_side_out by blast
          ultimately have "Bet X T Y" 
            using out2__bet X Out T Y by blast
        }
        moreover
        {
          assume "T  X" and "T = Y" 
          have "Bet X T Y" 
            by (simp add: T = Y between_trivial)
        }
        moreover
        {
          assume "T = X" and "T  Y" 
          have "Bet X T Y" 
            by (simp add: T = X between_trivial2)
        }
        ultimately show ?thesis 
          by auto
      qed
      hence " X Y. B Out A X  B Out C Y  Bet X T Y" 
        using B Out A X B Out C Y by auto
    }
    hence "weak_tarski_s_parallel_postulate" 
      using weak_tarski_s_parallel_postulate_def by blast
  }
  ultimately
  have "weak_tarski_s_parallel_postulate" 
    by blast
  thus ?thesis 
    by blast
qed


(** Formalization of a proof from Bachmann's article "Zur Parallelenfrage" *)
lemma weak_tarski_s_parallel_postulate__weak_inverse_projection_postulate_aux :
  assumes "weak_tarski_s_parallel_postulate"
  shows " A B C P T.
    Per A B C  T InAngle A B C 
    P  T  P B A CongA P B C  Per B P T  Coplanar A B C P 

    (( X. (B Out A X  Col T P X))  ( Y. (B Out C Y  Col T P Y)))" 
proof -
  {
    fix A B C P T
    assume "Per A B C" and "T InAngle A B C" and
      "P  T" and "P B A CongA P B C" and "Per B P T" and "Coplanar A B C P"
    have "P InAngle A B C" 
      by (metis conga_inangle_per2__inangle Coplanar A B C P 
          P B A CongA P B C Per A B C Per B P T T InAngle A B C)
    have "Acute P B A" 
      by (meson conga_inangle_per__acute P B A CongA P B C 
          P InAngle A B C Per A B C acute_sym)
    have "Acute P B C" 
      by (meson acute_conga__acute Acute P B A P B A CongA P B C)
    have "B  P" 
      using Acute P B C acute_distincts by blast
    have "B  A" 
      using T InAngle A B C inangle_distincts by blast
    have "B  C" 
      using P B A CongA P B C conga_distinct by blast
    have "B P Perp P T" 
      by (simp add: B  P P  T Per B P T per_perp)
    have "¬ Col A B C" 
      using Per A B C B  A B  C per_not_col by auto
    have "¬ Col B P T" 
      using Per B P T B  P P  T per_col_eq by blast
    {
      assume "Col A B T"
      hence "B Out A T" 
        using T InAngle A B C ¬ Col A B C bet_col 
          bet_in_angle_bet or_bet_out by blast
      hence "( X. (B Out A X  Col T P X))  ( Y. (B Out C Y  Col T P Y))" 
        using col_trivial_3 by blast
    } 
    moreover
    {
      assume "¬ Col A B T"
      have " U V. (B Out A U  B Out C V  Bet U T V)" 
        using assms weak_tarski_s_parallel_postulate_def  
          Per A B C T InAngle A B C by blast
      then obtain U V where "B Out A U" and "B Out C V" and "Bet U T V" 
        by blast
      have "Col B A U"         
        by (simp add: B Out A U out_col)
      have "Col B C V"         
        using B Out C V out_col by blast
      have "Coplanar A C U V"
        using Coplanar_def Col B A U Col B C V not_col_permutation_2 by blast
      have "Coplanar A B C T" 
        using T InAngle A B C coplanar_perm_9 inangle__coplanar by blast
      have "Coplanar B U V T" 
        using Bet U T V bet__coplanar ncoplanar_perm_11 by blast
      have "( X. (B Out A X  Col T P X))  ( Y. (B Out C Y  Col T P Y))" 
      proof -
        {
          assume "Col P T U"
          hence "( X. (B Out A X  Col T P X))  ( Y. (B Out C Y  Col T P Y))" 
            using B Out A U not_col_permutation_4 by blast
        }
        moreover
        {
          assume "¬ Col P T U"
          have "( X. (B Out A X  Col T P X))  ( Y. (B Out C Y  Col T P Y))" 
          proof -
            {
              assume "Col P T V"
              hence "( X. (B Out A X  Col T P X))  ( Y. (B Out C Y  Col T P Y))" 
                using B Out C V not_col_permutation_4 by blast
            }
            moreover
            {
              assume "¬ Col P T V"
              have "P T TS B U  P T OS B U"
              proof -
                have "Coplanar P T B U" 
                proof -
                  have "Coplanar A B C B" 
                    using ncop_distincts by blast
                  moreover have "Coplanar A B C U" 
                    using Col_cases Col B A U ncop__ncols by blast
                  ultimately show ?thesis 
                    using ¬ Col A B C Coplanar A B C P  Coplanar A B C T 
                      coplanar_pseudo_trans by blast
                qed
                moreover have "¬ Col U P T" 
                  using ¬ Col P T U col_permutation_1 by blast
                ultimately show ?thesis 
                  using ¬ Col B P T cop_nos__ts by blast
              qed
              have "( X. (B Out A X  Col T P X))  ( Y. (B Out C Y  Col T P Y))" 
              proof -
                {
                  assume "P T TS B U"
                  then obtain X where "Col X P T" and "Bet B X U" 
                    using TS_def by blast
                  have "X  B" 
                    using Col X P T ¬ Col B P T by blast
                  hence "B Out U X" 
                    using Out_def B Out A U Bet B X U by presburger
                  hence "B Out A X" 
                    using B Out A U l6_7 by blast
                  hence "( X. (B Out A X  Col T P X))  ( Y. (B Out C Y  Col T P Y))" 
                    using Col X P T col_permutation_3 by blast
                }
                moreover
                {
                  assume "P T OS B U"
                  have "P T TS B V" 
                  proof - 
                    have "P T TS U V" 
                      by (metis Bet U T V ¬ Col P T U ¬ Col P T V 
                          bet__ts col_trivial_2 invert_two_sides 
                          not_col_permutation_4)
                    moreover have "P T OS U B" 
                      using P T OS B U one_side_symmetry by blast
                    ultimately show ?thesis
                      using l9_8_2 by blast
                  qed
                  then obtain Y where "Col Y P T" and "Bet B Y V" 
                    using TS_def by blast
                  have "B Out C Y" 
                    by (metis Col_def B Out C V Bet B Y V Col Y P T 
                        P T OS B U between_equality 
                        between_symmetry col123__nos l6_7 not_out_bet)
                  hence "( X. (B Out A X  Col T P X))  ( Y. (B Out C Y  Col T P Y))" 
                    using Col Y P T not_col_permutation_3 by blast
                }
                ultimately show ?thesis 
                  using P T TS B U  P T OS B U by blast
              qed
            }
            ultimately show ?thesis by blast
          qed
        }
        ultimately show ?thesis by blast
      qed
    }
    ultimately have "( X. (B Out A X  Col T P X))  ( Y. (B Out C Y  Col T P Y))" 
      by blast
  }
  thus ?thesis by blast
qed

lemma weak_tarski_s_parallel_postulate__weak_inverse_projection_postulate:
  assumes "weak_tarski_s_parallel_postulate"
  shows "weak_inverse_projection_postulate" 
proof -
  {
    fix A B C P T
    assume "Per A B C" and "T InAngle A B C" and
      "P  T" and "P B A CongA P B C" and "Coplanar A B C P" and "Per B P T"
    have "¬ B Out A C" 
      by (metis Col_def Out_def Bet_perm per_not_col Per A B C)
    have "B P Perp P T" 
      using CongA_def P B A CongA P B C P  T Per B P T per_perp by auto
    have "(( X. (B Out A X  Col T P X))  ( Y. (B Out C Y  Col T P Y)))" 
      using assms weak_tarski_s_parallel_postulate__weak_inverse_projection_postulate_aux
        Coplanar A B C P P B A CongA P B C P  T 
        Per A B C Per B P T T InAngle A B C by blast
    moreover
    { 
      assume " X. (B Out A X  Col T P X)"
      then obtain X where "B Out A X" and "Col T P X" 
        by blast
      obtain Y where "P Midpoint X Y" 
        using symmetric_point_construction by blast
      {
        assume "X = Y"
        hence "B Out A P" 
          using B Out A X P Midpoint X Y l8_20_2 by blast
        hence "B Out P C" 
          by (metis Col_def Out_def P B A CongA P B C ¬ B Out A C 
              between_symmetry col_conga__conga eq_conga_out)
        hence False 
          using B Out A P ¬ B Out A C l6_7 by blast
      }
      hence "X  Y" 
        by blast
      have "Y X ReflectL B P" 
      proof -
        have "( X0. X0 Midpoint X Y  Col B P X0)" 
          using P Midpoint X Y col_trivial_2 by blast
        moreover have "(B P Perp X Y  X = Y)" 
          by (metis Perp_perm perp_col0
              B P Perp P T Col T P X P Midpoint X Y 
              col_trivial_2 midpoint_col midpoint_distinct_1)
        ultimately show ?thesis 
          by (simp add: ReflectL_def)
      qed
      hence "X Y ReflectL B P" 
        using l10_4_spec by blast
      moreover hence "B Out C Y" 
        using B Out A X P B A CongA P B C ¬ B Out A C Coplanar A B C P 
          conga_cop_out_reflectl__out by blast
      moreover have "Col T P X" 
        by (simp add: Col T P X)
      hence "Col P X T" 
        using not_col_permutation_2 by blast
      have "P  X" 
        using P Midpoint X Y X = Y  False is_midpoint_id by blast
      hence "Col P X Y" 
        using P Midpoint X Y midpoint_col by blast
      moreover hence "Col T P Y" 
        using Col T P X P  X col_trivial_2 colx by blast
      ultimately
      have " X Y. (B Out A X  Col T P X  B Out C Y  Col T P Y)" 
        using B Out A X Col T P X by blast
    }
    moreover
    {
      assume " Y. (B Out C Y  Col T P Y)"
      then obtain Y where "B Out C Y" and "Col T P Y" 
        by blast
      obtain X where "P Midpoint Y X" 
        using symmetric_point_construction by blast
      {
        assume "X = Y"
        hence "X = P" 
          using P Midpoint Y X l7_17_bis l7_3_2 by blast
        hence "Y = P" 
          by (simp add: X = Y)
        have "B Out A P"
        proof -
          have "B Out P C" 
            using B Out C Y Y = P l6_6 by blast
          moreover have "P B C CongA P B A" 
            using P B A CongA P B C conga_sym_equiv by auto
          ultimately show ?thesis
            using Out_cases out_conga_out by blast
        qed
        have "B Out C P" 
          using B Out C Y X = P X = Y by blast
        moreover hence "B Out P C" 
          using l6_6 by blast
        ultimately have False 
          using ¬ B Out A C l6_7 B Out A P by blast
      }
      hence "X  Y" 
        by blast
      have "B Out A X"
      proof -
        have "¬ B Out C A" 
          using ¬ B Out A C l6_6 by blast
        moreover have "Coplanar C B A P" 
          using Coplanar A B C P coplanar_perm_14 by presburger
        moreover have "P B C CongA P B A" 
          using P B A CongA P B C conga_sym_equiv by auto
        moreover have "Y X ReflectL B P"
        proof -
          have " X0. X0 Midpoint Y X  Col B P X0" 
            using P Midpoint Y X col_trivial_2 by blast
          moreover have "B P Perp Y X  Y = X" 
            by (metis col_permutation_4 col_trivial_3 midpoint_distinct_1 
                B P Perp P T Col T P Y P Midpoint Y X colx 
                midpoint_col perp_col2_bis)
          ultimately show ?thesis
            by (metis ReflectL_def l10_4_spec)
        qed
        ultimately show ?thesis
          using B Out C Y conga_cop_out_reflectl__out by blast
      qed
      have "P  X" 
        using P Midpoint Y X X = Y  False is_midpoint_id_2 by blast
      have "Col P X Y" 
        using P Midpoint Y X Col_def Midpoint_def by blast
      hence "Col P X T" 
        by (metis Col T P Y P Midpoint Y X col_permutation_1 
            col_trivial_3 colx l7_2 midpoint_distinct_2)
      moreover hence "Col T P X" 
        using not_col_permutation_1 by blast
      moreover have "Col T P Y" 
        by (simp add: Col T P Y)
      ultimately
      have " X Y. (B Out A X  Col T P X  B Out C Y  Col T P Y)"    
        using B Out C Y B Out A X by blast
    }
    ultimately have " X Y. (B Out A X  Col T P X  B Out C Y  Col T P Y)" 
      by blast
  }
  hence LEMME: " A B C P T.
       Per A B C  T InAngle A B C 
       P  T  P B A CongA P B C  Coplanar A B C P  Per B P T 
       ( X Y. (B Out A X  Col T P X  B Out C Y  Col T P Y))" 
    by blast
  moreover
  {
    assume " A B C P T.
       Per A B C  T InAngle A B C 
       P  T  P B A CongA P B C  Coplanar A B C P  Per B P T 
       ( X Y. (B Out A X  Col T P X  B Out C Y  Col T P Y))" 
    {
      fix A B C D E F P Q
      assume "Acute A B C" and "Per D E F" and "A B C A B C SumA D E F" and 
        "B Out A P" and "P  Q" and "Per B P Q" and "Coplanar A B C Q"
      have "¬ Col A B C" 
        using Per D E F 
        by (metis col2_suma__col suma_distincts A B C A B C SumA D E F per_not_col)
      have "¬ Col B P Q" 
        by (metis Col_def per_col_eq B Out A P P  Q 
            Per B P Q between_trivial l6_4_1)
      have "A B C CongA P B C" 
        by (metis Acute A B C B Out A P acute_distincts bet_out_1 
            conga_sym_equiv not_bet_distincts out2__conga)
      have "¬ Col P B C" 
        by (metis Out_def B Out A P ¬ Col A B C col_out2_col 
            col_permutation_3 col_trivial_3 l6_16_1 out_trivial)
      have "B P Perp P Q" 
        by (metis B Out A P P  Q Per B P Q out_diff2 per_perp)
      have "C B A A B C SumA D E F" 
        by (simp add: A B C A B C SumA D E F suma_left_comm)
      then obtain J where "A B J CongA A B C" and "¬ B A OS C J" and 
        "Coplanar C B A J" and "C B J CongA D E F" 
        using SumA_def by blast
      have " Q'. (P  Q')  Col P Q Q'  Q' InAngle C B P" 
      proof -
        have " Q0. Col Q P Q0  B P OS C Q0"
        proof -
          have "Q  P" 
            using P  Q by blast
          moreover have "Col B P P" 
            by (simp add: col_trivial_2)
          moreover have "Col Q P P"  
            by (simp add: col_trivial_2)
          moreover have "¬ Col B P C" 
            using ¬ Col P B C not_col_permutation_4 by blast
          moreover have "Coplanar B P Q C" 
            by (metis (no_types, opaque_lifting) Col_def Out_def B Out A P 
                Coplanar A B C Q ¬ Col A B C 
                coplanar_pseudo_trans_lem1 ncop__ncols ncop_distincts)
          ultimately show ?thesis 
            using ¬ Col B P Q cop_not_par_same_side by blast
        qed
        then obtain Q0 where "Col Q P Q0" and "B P OS C Q0"
          by blast
        {
          assume "B C OS P Q0"
          hence " Q'. (P  Q')  Col P Q Q'  Q' InAngle C B P" 
            using B P OS C Q0 Col Q P Q0 not_col_permutation_4 
              os2__inangle os_distincts by blast
        }
        moreover
        {
          assume "¬ B C OS P Q0"
          have " Q'. Col P Q Q'  Col B C Q'" 
          proof (cases "Col B C Q0")
            case True
            thus ?thesis 
              using Col Q P Q0 not_col_permutation_4 by blast
          next
            case False
            have " Q'. Col Q' B C  Bet P Q' Q0" 
            proof -
              have "Coplanar B C P Q0" 
                using False B P OS C Q0 inangle__coplanar ncoplanar_perm_22 
                  os_ts__inangle ts__coplanar two_sides_cases by blast
              moreover have "¬ Col P B C" 
                using ¬ Col P B C by auto
              moreover have "¬ Col Q0 B C" 
                by (simp add: False not_col_permutation_2)
              moreover have "¬ B C OS P Q0" 
                using ¬ B C OS P Q0 by auto
              ultimately show ?thesis 
                using TS_def cop__one_or_two_sides by blast
            qed
            then obtain Q' where "Col Q' B C" and "Bet P Q' Q0"
              by blast
            have  "Col P Q Q'" 
              using P  Q Bet P Q' Q0 Col Q P Q0 bet_col bet_neq12__neq col2__eq 
                col_permutation_4 by blast
            moreover have "Col B C Q'" 
              using Col Q' B C not_col_permutation_2 by blast
            ultimately show ?thesis
              by blast
          qed
          then obtain Q' where "Col P Q Q'" and "Col B C Q'" 
            by blast
          have "P  Q'" 
            using Col B C Q' ¬ Col P B C col_permutation_2 by blast
          moreover have "Col P Q Q'" 
            using Col P Q Q' by auto
          moreover have "Q' InAngle C B P"
          proof -
            have "P  B" 
              using B P OS C Q0 os_distincts by blast
            moreover have "B Out C Q'"
            proof -
              have "Acute P B C"               
                by (meson acute_conga__acute A B C CongA P B C Acute A B C)
              moreover have "B P Perp P Q'"               
                by (meson perp_col1 B P Perp P Q Col P Q Q' P  Q')
              ultimately show ?thesis
                using Col B C Q' acute_col_perp__out_1 l6_6 by blast
            qed
            ultimately show ?thesis
              using out321__inangle by auto
          qed
          ultimately have " Q'. (P  Q')  Col P Q Q'  Q' InAngle C B P" 
            by blast
        }
        ultimately show ?thesis 
          by blast
      qed
      then obtain Q' where "P  Q'" and "Col P Q Q'" and "Q' InAngle C B P" 
        by blast
      have "B Out P A" 
        by (simp add: B Out A P l6_6)
      have "C  B" 
        using ¬ Col P B C col_trivial_2 by auto
      have "P  B" 
        using B Out A P out_distinct by presburger
      have "J  B" 
        using A B J CongA A B C conga_diff2 by blast
      have "D  E" 
        using C B J CongA D E F conga_diff45 by auto
      {
        assume "E = F"
        hence "A B C A B C SumA D E E" 
          using A B C A B C SumA D E F by blast
        hence False 
          using C B J CongA D E F E = F conga_diff56 by blast
      }
      hence "F  E" 
        by blast
      have "A B C CongA A B J"         
        using A B J CongA A B C conga_sym_equiv by auto
      hence "¬ Col A B J" 
        using ¬ Col A B C A B J CongA A B C col_conga_col by blast
      have "P InAngle C B J" 
      proof -
        have "A InAngle C B J"
        proof -
          have "B A TS C J"
          proof -
            have "Coplanar B A C J" 
              using Coplanar C B A J coplanar_perm_8 by presburger
            moreover have "¬ Col C B A" 
              using NCol_cases ¬ Col A B C by blast
            moreover have "¬ Col J B A" 
              using Col_cases ¬ Col A B J by blast
            ultimately show ?thesis
              using  ¬ B A OS C J cop_nts__os by blast
          qed
          moreover have "B C OS J A" 
          proof -
            have "Coplanar C B A J" 
              by (simp add: Coplanar C B A J)
            moreover have "¬ Col A C B" 
              using NCol_cases ¬ Col A B C by blast
            have "¬ Col C B J"
            proof -
              have "¬ Col D E F" 
                using D  E F  E Per D E F per_not_col by auto
              moreover have "D E F CongA C B J" 
                by (simp add: C B J CongA D E F conga_sym_equiv)
              ultimately show ?thesis
                by (meson col_conga_col C B J CongA D E F)
            qed
            moreover hence "¬ Col J C B" 
              using col_permutation_1 by blast
            have "SAMS C B A A B C" 
              using Acute A B C acute2__sams acute_sym by blast
            moreover hence "¬ C B TS A J" 
              using A B J CongA A B C ¬ B A OS C J conga_sams_nos__nts by blast
            ultimately show ?thesis
              using invert_one_side one_side_symmetry cop_nts__os 
                ¬ Col A C B ¬ Col J C B by blast
          qed
          ultimately show ?thesis
            using os_ts__inangle by blast
        qed
        moreover have "B Out C C"
          using C  B out_trivial by auto
        moreover have "B Out J J" 
          using J  B out_trivial by auto
        ultimately show ?thesis 
          using B Out P A l11_25 by blast
      qed
      hence "Q' InAngle C B J"
        using Q' InAngle C B P in_angle_trans by blast
      have " Y. B Out C Y  Col Q' P Y" 
      proof -
        have "D E F CongA C B J" 
          by (simp add: C B J CongA D E F conga_sym_equiv)
        hence "Per C B J" 
          using Per D E F l11_17 by blast
        moreover have "Q' InAngle C B J" 
          using Q' InAngle C B J by auto
        moreover have "P  Q'" 
          by (simp add: P  Q')
        moreover have "P B C CongA P B J" 
          by (metis col_conga__conga not_conga_sym out_col 
              A B J CongA A B C B Out A P P  B)
        moreover have "Coplanar C B J P" 
          by (meson P InAngle C B J coplanar_perm_9 inangle__coplanar)
        moreover have "Per B P Q'" 
          using Col P Q Q' P  Q Per B P Q per_col by blast
        ultimately show ?thesis 
          using LEMME by blast
      qed
      then obtain Y where "B Out C Y" and "Col Q' P Y" 
        by blast
      hence " Y. B Out C Y  Col P Q Y" 
        by (metis Col P Q Q' P  Q' col_trivial_3 colx)
    }
    hence " A B C D E F P Q.
    Acute A B C  Per D E F  A B C A B C SumA D E F  
    B Out A P  P  Q  Per B P Q  Coplanar A B C Q

    ( Y. B Out C Y  Col P Q Y)" 
      by blast
  }
  ultimately show ?thesis 
    using weak_inverse_projection_postulate_def by fastforce
qed

lemma P31_P32:
  shows "Postulate31  Postulate32" 
  using Postulate31_def Postulate32_def 
    weak_inverse_projection_postulate__weak_tarski_s_parallel_postulate 
    weak_tarski_s_parallel_postulate__weak_inverse_projection_postulate by blast

lemma P31_P04:
  shows "Postulate31  Postulate04" 
  using Postulate04_def Postulate31_def 
    bachmann_s_lotschnittaxiom__weak_inverse_projection_postulate 
    weak_inverse_projection_postulate__bachmann_s_lotschnittaxiom by blast

lemma P04_P33:
  shows "Postulate04  Postulate33" 
  using Postulate04_def Postulate33_def 
    bachmann_s_lotschnittaxiom__weak_triangle_circumscription_principle 
    weak_triangle_circumscription_principle__bachmann_s_lotschnittaxiom by blast

lemma equivalent_postulates_without_any_continuity_bis:
  shows "Postulate04  Postulate33 
Postulate31  Postulate04 
Postulate31  Postulate32"
proof -
  have "Postulate31  Postulate32" 
    using Postulate31_def Postulate32_def 
      weak_inverse_projection_postulate__weak_tarski_s_parallel_postulate 
      weak_tarski_s_parallel_postulate__weak_inverse_projection_postulate by blast
  moreover have "Postulate31  Postulate04" 
    using Postulate04_def Postulate31_def 
      bachmann_s_lotschnittaxiom__weak_inverse_projection_postulate 
      weak_inverse_projection_postulate__bachmann_s_lotschnittaxiom by blast
  moreover have "Postulate04  Postulate33" 
    using Postulate04_def Postulate33_def 
      bachmann_s_lotschnittaxiom__weak_triangle_circumscription_principle 
      weak_triangle_circumscription_principle__bachmann_s_lotschnittaxiom by blast
  ultimately show ?thesis
    by blast
qed

lemma P4_P34:
  assumes "Postulate04"
  shows "Postulate34" 
  using P31_P04 P31_P32 Postulate32_def Postulate34_def 
    assms bachmann_s_lotschnittaxiom__legendre_s_parallel_postulate
    weak_inverse_projection_postulate__bachmann_s_lotschnittaxiom 
    weak_tarski_s_parallel_postulate__weak_inverse_projection_postulate by blast

lemma P01__P35:
  assumes "Postulate01"
  shows "Postulate35"  
  using Postulate01_def Postulate35_def playfair__existential_playfair 
    tarski_s_euclid_implies_playfair_s_postulate assms by blast

lemma P35__P01:
  assumes "greenberg_s_axiom" and
    "Postulate01" 
  shows "Postulate35" 
proof -
  have "Postulate35  Postulate27" 
    by (simp add: Postulate27_def Postulate35_def existential_playfair__rah)
  moreover 
  have "Postulate27  Postulate03" 
    using Cycle_3 by blast 
  moreover
  have "Postulate03  Postulate12" 
    by (simp add: InterCycle1 assms(1))
  moreover have "Postulate12  Postulate09" 
    by (simp add: Postulate09_def Postulate12_def playfair__universal_posidonius_postulate
        playfair_bis__playfair 
        universal_posidonius_postulate__perpendicular_transversal_postulate)
  moreover
  have "Postulate09  Postulate01"
    using Cycle_1 Cycle_2  by blast
  ultimately show ?thesis 
    using P01__P35 assms(2) by fastforce
qed

theorem stronger_legendre_s_first_theorem:
  assumes "aristotle_s_axiom" 
  shows " A B C D E F. C A B A B C SumA D E F  SAMS D E F B C A"
  using aristotle__obtuse_case_elimination assms t22_20 by blast

theorem legendre_s_first_theorem:
  assumes "archimedes_axiom" 
  shows " A B C D E F. C A B A B C SumA D E F  SAMS D E F B C A" 
  using assms stronger_legendre_s_first_theorem t22_24 by blast

theorem legendre_s_second_theorem:
  assumes "postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights"
  shows "triangle_postulate" 
  using assms rah__triangle existential_triangle__rah by blast

lemma legendre_s_third_theorem_aux:
  assumes "aristotle_s_axiom" and
    "triangle_postulate"
  shows "euclid_s_parallel_postulate" 
  using Cycle_2 Postulate01_def Postulate13_def 
    alternate_interior__proclus aristotle__greenberg 
    assms(1) assms(2) playfair__alternate_interior 
    playfair_bis__playfair tarski_s_implies_euclid_s_parallel_postulate 
    triangle__playfair_bis by fastforce

theorem legendre_s_third_theorem:
  assumes "archimedes_axiom" and
    "triangle_postulate"
  shows "euclid_s_parallel_postulate" 
  by (simp add: assms(1) assms(2) legendre_s_third_theorem_aux t22_24)

lemma legendre_aux:
  assumes "¬ hypothesis_of_obtuse_saccheri_quadrilaterals" 
  shows " A B C D B1 C1 P Q R S T U V W X.
    ¬ Col A B C  A C B CongA C B D 
    Cong A C B D  B C TS A D  A Out B B1  A Out C C1  Bet B1 D C1 
    Defect A B C P Q R  Defect A B1 C1 S T U  P Q R P Q R SumA V W X 
    (SAMS P Q R P Q R  V W X LeA S T U)"
proof -
  {
    fix A B C D B1 C1 P Q R S T U V W X
    assume "¬ Col A B C" and "A C B CongA C B D" and
      "Cong A C B D" and "B C TS A D" and "A Out B B1" and
      "A Out C C1" and "Bet B1 D C1" and
      "Defect A B C P Q R" and "Defect A B1 C1 S T U" and
      "P Q R P Q R SumA V W X"
    have "A  B" 
      using B C TS A D ts_distincts by blast
    have "Cong A B D C  (A  B)  (C A B CongA B D C  C B A CongA B C D)"
    proof -
      have "A C B CongA D B C" 
        using A C B CongA C B D conga_right_comm by blast
      moreover have "Cong C A B D" 
        using Cong A C B D not_cong_2134 by blast
      moreover have "Cong C B B C" 
        by (simp add: cong_pseudo_reflexivity)
      ultimately show ?thesis 
        using A  B l11_49 by blast
    qed
    have "Cong A B D C" 
      by (metis cong2_conga_cong A C B CongA C B D Cong A C B D 
          cong_pseudo_reflexivity cong_right_commutativity conga_right_comm)
    have "C A B CongA B D C" 
      by (simp add: A  B Cong A B D C
          Cong A B D C  A  B  C A B CongA B D C  C B A CongA B C D ) 
    have "C B A CongA B C D" 
      by (simp add: A  B Cong A B D C
          Cong A B D C  A  B  C A B CongA B D C  C B A CongA B C D ) 
    have "A C ParStrict B D" 
    proof -
      have "A C Par B D" 
        by (meson conga_right_comm  A C B CongA C B D B C TS A D
            invert_two_sides l12_21_b par_left_comm)
      moreover have "Col B D B" 
        by (simp add: col_trivial_3)
      moreover have "¬ Col A C B" 
        using ¬ Col A B C col_permutation_5 by blast
      ultimately show ?thesis 
        using par_not_col_strict by blast
    qed
    have "A B ParStrict C D" 
    proof -
      have "A B Par C D" 
      proof -
        have "B C TS A D" 
          using B C TS A D by auto
        moreover have "A B C CongA D C B" 
          by (simp add: C B A CongA B C D conga_comm)
        ultimately show ?thesis
          using l12_21_b par_left_comm by blast
      qed
      moreover have "Col C D C" 
        by (simp add: col_trivial_3)
      moreover have "¬ Col A B C" 
        using ¬ Col A B C by blast
      ultimately show ?thesis 
        using par_not_col_strict by blast
    qed
    have "¬ Col B C D" 
      using A B ParStrict C D par_strict_not_col_2 by auto
    have "¬ Col C D A" 
      using A B ParStrict C D col_trivial_3 l9_19 pars__os3412 by blast
    have "¬ Col A B D" 
      by (meson Par_strict_perm A B ParStrict C D l12_6 one_side_not_col123)
    have "B D ParStrict A C1" 
      by (metis Par_strict_cases A C ParStrict B D A Out C C1 
          out_col out_diff2 par_strict_col_par_strict)
    have "¬ Col B D C1" 
      by (metis Par_strict_perm A Out C C1 B D ParStrict A C1
          diff_bet_ex3 l6_16_1 l6_3_1 l9_19 pars__os3412)
    have "B  B1" 
      using Bet B1 D C1 ¬ Col B D C1 bet_col by blast
    have "¬ Col B1 B D" 
      by (metis A Out B B1 B  B1 ¬ Col A B D col_trivial_2 colx out_col)
    have "B D TS B1 C1" 
      using TS_def Bet B1 D C1 ¬ Col B D C1 ¬ Col B1 B D
        col_trivial_3 not_col_permutation_2 by blast
    hence "¬ Col B1 B D  B D TS B1 C1  Bet A B B1" 
      by (metis A Out B B1 B D ParStrict A C1 ¬ Col B1 B D 
          col_trivial_3 l12_6 l9_9 not_out_bet out_col out_two_sides_two_sides)
    have "Bet A B B1" 
      by (simp add: ¬ Col B1 B D  B D TS B1 C1  Bet A B B1)
    have "C D ParStrict A B1" 
      by (metis Col_def A B ParStrict C D Bet A B B1
          between_identity col_trivial_3 par_strict_col2_par_strict
          par_strict_symmetry)
    have "¬ Col C D B1" 
      by (meson Par_strict_perm C D ParStrict A B1 l12_6 one_side_not_col123)
    have "C  C1" 
      using Bet B1 D C1 ¬ Col C D B1 bet_col between_symmetry by blast
    have "C D TS A C1" 
    proof -
      have "C D TS B1 C1" 
        by (metis Bet B1 D C1 ¬ Col B D C1 ¬ Col C D B1 
            bet__ts col_trivial_2 invert_two_sides not_col_permutation_4)
      moreover have "C D OS B1 A" 
        using C D ParStrict A B1 l12_6 one_side_symmetry by blast
      ultimately show ?thesis
        using l9_8_2 by blast
    qed
    hence "Bet A C C1" 
      using A Out C C1 col_two_sides_bet not_out_bet out_col by blast
    have " Z. Bet B Z D  Bet C Z B1" 
    proof -
      have "B D TS C B1" 
      proof -
        have "B D TS C1 B1" 
          using B D TS B1 C1 l9_2 by blast
        moreover have "B D OS C1 C" 
          by (metis bet_col1 l12_6 par_strict_col2_par_strict 
              B D ParStrict A C1 Bet A C C1 C  C1 not_bet_distincts)
        ultimately show ?thesis
          using l9_8_2 by blast
      qed
      moreover have "C B1 TS B D" 
      proof -
        have "C D OS B1 B" 
        proof -
          have "C D ParStrict B A" 
            using Par_strict_perm A B ParStrict C D by blast
          moreover have "Col B A B1" 
            using A Out B B1 col_permutation_4 out_col by blast
          ultimately show ?thesis
            using B  B1 one_side_symmetry par_strict_all_one_side by blast
        qed
        have "C B OS B1 C1" 
        proof -
          have "C B TS B1 A"                             
            by (meson B  B1 Bet A B B1 ¬ Col A B C bet__ts invert_two_sides
                l9_2 not_col_permutation_1)
          moreover have "C B TS C1 A"                            
            using Col_cases Bet A C C1 C  C1 ¬ Col A B C bet__ts l9_2 by blast
          ultimately show ?thesis
            using OS_def by blast
        qed
        hence "C B OS B1 D" 
          using Bet B1 D C1 l9_17 by blast
        moreover 
        have "C D OS B1 B" 
          using C D OS B1 B by blast
        ultimately show ?thesis
          using  l9_31 by auto
      qed
      ultimately show ?thesis 
        using ts2__ex_bet2 by blast
    qed
    then obtain Z where "Bet B Z D" and "Bet C Z B1" 
      by blast
    obtain G H I where "Defect A B1 C G H I"
      using ex_defect 
      by (metis Col_def A Out B B1 Bet A B B1 ¬ Col A B C 
          not_col_distincts out_diff2)
    obtain J K L where "Defect B1 C C1 J K L"
      using ex_defect 
      by (metis Col_def TS_def B C TS A D Bet B Z D Bet C Z B1 
          C  C1 Defect A B1 C1 S T U bet_neq12__neq defect_distincts)
    have "C  B1" 
      using ¬ Col C D B1 col_trivial_3 by blast
    have "B1  B" 
      using B  B1 by auto
    have "C  B" 
      using ¬ Col B C D col_trivial_1 by fastforce
    obtain M N O0 where "Defect C B B1 M N O0"
      using ex_defect C  B C  B1 B  B1 by blast
    have "B1  C" 
      using C  B1 by auto
    have "C  D" 
      using ¬ Col B C D col_trivial_2 by blast
    have "B1  D" 
      using B D TS B1 C1 ts_distincts by blast
    obtain A' B' C' where "Defect B1 C D A' B' C'" 
      using ex_defect B1  D C  B1 C  D by presburger
    have "D  C1" 
      using C D TS A C1 ts_distincts by blast
    obtain D' E' F' where "Defect C D C1 D' E' F'" 
      using ex_defect C  C1 C  D D  C1 by presburger
    obtain M' N' O' where "Defect B1 B D M' N' O'" 
      using ex_defect B  B1 B1  D C A B CongA B D C 
        conga_distinct by presburger
    have "G  H" 
      using Defect A B1 C G H I defect_distincts by blast
    have "I  H" 
      using Defect A B1 C G H I defect_distincts by blast
    have "M  N" 
      using Defect C B B1 M N O0 defect_distincts by blast
    have "N  O0" 
      using Defect C B B1 M N O0 defect_distincts by blast
    have "A'  B'" 
      using Defect B1 C D A' B' C' defect_distincts by blast
    have "C'  B'" 
      using Defect B1 C D A' B' C' defect_distincts by blast
    obtain G' H' I' where "G H I A' B' C' SumA G' H' I'" 
      using A'  B' C'  B' G  H I  H ex_suma by presburger
    have "O0  N" 
      using N  O0 by blast
    then obtain J' K' L' where "M N O0 A' B' C' SumA J' K' L'"
      using A'  B' C'  B' M  N ex_suma by presburger
    have "SAMS G H I J K L  G H I J K L SumA S T U" 
      using assms Bet A C C1 t22_16_1bis Defect A B1 C G H I Defect A B1 C1 S T U
        Defect B1 C C1 J K L by force
    hence "SAMS G H I J K L" 
      by blast
    have "G H I J K L SumA S T U" 
      using SAMS G H I J K L  G H I J K L SumA S T U by auto    
    have "SAMS A' B' C' D' E' F'  A' B' C' D' E' F' SumA J K L" 
      using assms Bet B1 D C1 t22_16_1bis Defect B1 C C1 J K L Defect B1 C D A' B' C' 
        Defect C D C1 D' E' F' by blast
    hence "SAMS A' B' C' D' E' F'" 
      by blast
    have "A' B' C' D' E' F' SumA J K L" 
      by (simp add: SAMS A' B' C' D' E' F'  A' B' C' D' E' F' SumA J K L)
    have "SAMS P Q R M N O0  P Q R M N O0 SumA G H I"
    proof -
      have "Defect A C B P Q R" 
        using Defect A B C P Q R defect_perm_132 by blast
      moreover have "Defect A C B1 G H I" 
        using Defect A B1 C G H I defect_perm_132 by blast
      ultimately show ?thesis
        using Bet A B B1 Defect C B B1 M N O0 assms t22_16_1bis by blast
    qed
    hence "SAMS P Q R M N O0" 
      by blast
    have "P Q R M N O0 SumA G H I" 
      by (simp add: SAMS P Q R M N O0  P Q R M N O0 SumA G H I)
    have "SAMS G H I A' B' C'"
    proof -
      have "G H I LeA G H I" 
        by (simp add: G  H I  H lea_refl)
      moreover have "A' B' C' LeA J K L" 
        using SAMS A' B' C' D' E' F' A' B' C' D' E' F' SumA J K L 
          sams_suma__lea123789 by blast
      ultimately show ?thesis
        using SAMS G H I J K L sams_lea2__sams by blast
    qed
    have "SAMS M N O0 A' B' C'" 
    proof -
      have "M N O0 LeA G H I"      
        using SAMS P Q R M N O0 P Q R M N O0 SumA G H I 
          sams_suma__lea456789 by auto
      moreover have "A' B' C' LeA A' B' C'"        
        using A'  B' C'  B' lea_refl by auto
      ultimately show ?thesis
        using SAMS G H I A' B' C' sams_lea2__sams by blast
    qed
    have "G' H' I' D' E' F' SumA S T U"
      using SAMS G H I A' B' C' SAMS A' B' C' D' E' F' 
        G H I A' B' C' SumA G' H' I' A' B' C' D' E' F' SumA J K L 
        G H I J K L SumA S T U suma_assoc by blast
    have "SAMS G' H' I' D' E' F'"
      using SAMS G H I A' B' C' SAMS A' B' C' D' E' F' 
        G H I A' B' C' SumA G' H' I' A' B' C' D' E' F' SumA J K L  
        SAMS G H I J K L sams_assoc by blast
    have "P Q R J' K' L' SumA G' H' I'" 
      using SAMS P Q R M N O0 SAMS M N O0 A' B' C' 
        P Q R M N O0 SumA G H I M N O0 A' B' C' SumA J' K' L' 
        G H I A' B' C' SumA G' H' I' suma_assoc_1 by blast
    have "SAMS P Q R J' K' L'" 
      using SAMS P Q R M N O0 SAMS M N O0 A' B' C' 
        P Q R M N O0 SumA G H I M N O0 A' B' C' SumA J' K' L' 
        SAMS G H I A' B' C' sams_assoc_1 by blast
    have "P  Q" 
      using P Q R P Q R SumA V W X suma_distincts by auto
    have "Q  R" 
      using P Q R P Q R SumA V W X suma_distincts by blast
    have "SAMS P Q R M' N' O'  P Q R M' N' O' SumA J' K' L'" 
    proof -
      have "Defect C B D P Q R" 
      proof -
        have "A B C CongA D C B" 
          by (simp add: C B A CongA B C D conga_comm)
        moreover have "B C A CongA C B D" 
          using A C B CongA C B D conga_left_comm by blast
        ultimately show ?thesis
          using Defect A B C P Q R C A B CongA B D C conga3_defect__defect 
            defect_perm_231 by blast
      qed
      moreover have "Defect C D B1 A' B' C'" 
        by (simp add: Defect B1 C D A' B' C' defect_perm_231)
      ultimately show ?thesis 
        using Defect C B B1 M N O0 Defect B1 B D M' N' O' Bet C Z B1 
          Bet B Z D SAMS M N O0 A' B' C' M N O0 A' B' C' SumA J' K' L'
          assms t22_16_2 by blast
    qed
    have "P Q R LeA J' K' L'" 
      using SAMS P Q R M' N' O'  P Q R M' N' O' SumA J' K' L' 
        sams_suma__lea123789 by blast
    have "SAMS P Q R P Q R" 
    proof -
      have "P Q R LeA P Q R" 
        using P  Q Q  R lea_refl by force
      thus ?thesis
        using  SAMS P Q R J' K' L' P Q R LeA J' K' L' sams_lea2__sams by blast
    qed
    moreover have "V W X LeA S T U" 
    proof -
      have "V W X LeA G' H' I'" 
        using P Q R LeA J' K' L' SAMS P Q R J' K' L' 
          P Q R P Q R SumA V W X P Q R J' K' L' SumA G' H' I' 
          sams_lea456_suma2__lea by blast
      moreover have "G' H' I' LeA S T U" 
        using G' H' I' D' E' F' SumA S T U SAMS G' H' I' D' E' F' 
          sams_suma__lea123789 by blast
      ultimately show ?thesis 
        using lea_trans by blast
    qed
    ultimately have "SAMS P Q R P Q R  V W X LeA S T U" 
      by blast
  }
  thus ?thesis 
    by blast
qed

lemma legendre_aux1:
  shows " A B C B' C'.
  ¬ Col A B C  A Out B B'  A Out C C' 
  ( D'. D' InAngle B A C  A C' B' CongA C' B' D' 
             Cong A C' B' D'  B' C' TS A D')" 
proof -
  {
    fix A B C B' C'
    assume "¬ Col A B C" and "A Out B B'" and "A Out C C'" 
    have "A  B'" 
      using Out_def A Out B B' by force
    have "A  C'" 
      using A Out C C' out_diff2 by blast
    have "B'  C'" 
      using A Out B B' A Out C C' ¬ Col A B C l6_6 l6_7 out_col by blast
    {
      assume "Col A B' C'"
      hence "Col A B C" 
        by (metis Col_perm A Out B B' A Out C C' A  B' 
            A  C' col_transitivity_1 out_col)
      hence False 
        using ¬ Col A B C by blast
    }
    hence "¬ Col A B' C'" 
      by blast
    obtain M where "M Midpoint B' C'" 
      using midpoint_existence by blast
    have "A  M" 
      using Bet_cases Col_def Midpoint_def Col A B' C'  False 
        M Midpoint B' C' by blast
    have "M  B'" 
      using Col A B' C'  False M Midpoint B' C' 
        col_trivial_2 is_midpoint_id by blast
    have "M  C'" 
      using M Midpoint B' C' M  B' is_midpoint_id_2 by blast
    obtain D' where "M Midpoint A D'" 
      using symmetric_point_construction by blast
    {
      assume "Col A M B'"
      hence "Col A B' C'" 
        by (metis Col_def Midpoint_def M Midpoint B' C' M  B' l6_16_1)
      hence False 
        using  Col A B' C'  False by blast
    }
    hence "¬ Col A M B'" 
      by blast
    have "A  D'" 
      using M Midpoint A D' ¬ Col A M B' col_trivial_1 l7_3 by blast
    hence "M  D'" 
      using M Midpoint A D' is_midpoint_id_2 by blast
    have "Col A D' M" 
      using Bet_cases Col_def Midpoint_def M Midpoint A D' by blast
    have "Col B' C' M" using M Midpoint B' C' 
      by (meson midpoint_col not_col_permutation_2)
    {
      assume "Col D' B' C'"
      hence "Col A B' C'" 
        by (metis (full_types) Col A D' M Col B' C' M 
            M  D' col_permutation_2 colx)
      hence False 
        using  Col A B' C'  False by blast
    }
    hence "¬ Col D' B' C'" 
      by blast
    have "D' InAngle B A C"
    proof -
      have "D' InAngle B' A C'" 
      proof -
        have "Bet B' M C'" 
          using Midpoint_def M Midpoint B' C' by blast
        moreover have "Bet A M D'" 
          using Midpoint_def M Midpoint A D' by auto
        moreover hence "M = A  A Out M D'" 
          using bet_out by blast
        ultimately show ?thesis
          using InAngle_def A  B' A  C' A  D' by auto
      qed
      moreover have "A Out D' D'"   
        using A  D' out_trivial by auto
      ultimately show ?thesis
        using  A Out B B' A Out C C' l11_25 by blast
    qed
    moreover have "A C' B' CongA C' B' D'" 
    proof -
      have "A M C' CongA D' M B'" 
      proof -
        have "Bet A M D'" 
          using M Midpoint A D' by (simp add: Midpoint_def)
        moreover have "Bet C' M B'" 
          using Bet_cases Midpoint_def M Midpoint B' C' by blast
        ultimately show ?thesis
          using M  B' M  C' M  D' A  M l11_14 by blast
      qed
      moreover have "Cong M A M D'" 
        using Cong_cases M Midpoint A D' midpoint_cong by blast
      moreover have "Cong M C' M B'" 
        using M Midpoint B' C' midpoint_cong not_cong_4312 by blast
      ultimately show ?thesis
        by (meson Mid_cases A  C' B'  C' M Midpoint A D' 
            M Midpoint B' C' conga_right_comm symmetry_preserves_conga)
    qed
    moreover have "Cong A C' B' D'" 
      by (metis l7_13 M Midpoint A D' M Midpoint B' C' cong_3421 l7_2)
    moreover have "B' C' TS A D'" 
      using Midpoint_def TS_def Col A B' C'  False Col B' C' M 
        M Midpoint A D' ¬ Col D' B' C' not_col_permutation_1 by blast
    ultimately have " D'. D' InAngle B A C  A C' B' CongA C' B' D' 
             Cong A C' B' D'  B' C' TS A D'" 
      by blast
  }
  thus ?thesis 
    by blast
qed

lemma legendre_aux2:
  assumes "¬ hypothesis_of_obtuse_saccheri_quadrilaterals"
  shows " A B C.
    ¬ Col A B C  Acute B A C 
    ( T. T InAngle B A C  ( X Y. A Out B X  A Out C Y  Bet X T Y)) 
       
    ( P Q R S T U. Defect A B C P Q R  GradAExp P Q R S T U 
      ( B' C' P' Q' R'. (A Out B B'  A Out C C' 
         Defect A B' C' P' Q' R'  S T U LeA P' Q' R')))" 
proof -
  {
    fix A B C
    assume "¬ Col A B C" and 
      "Acute B A C" and
      " T. T InAngle B A C  ( X Y. A Out B X  A Out C Y  Bet X T Y)" 
    {
      fix P Q R S T U
      assume "Defect A B C P Q R" and
        "GradAExp P Q R S T U"
      let ?th = " ( B' C' P' Q' R'. (A Out B B'  A Out C C' 
         Defect A B' C' P' Q' R'  S T U LeA P' Q' R'))"
      have ?th 
      proof (rule GradAExp.induct [OF GradAExp P Q R S T U])
        show "D E F.
       P Q R CongA D E F 
       B' C' P' Q' R'.
          A Out B B' 
          A Out C C'  Defect A B' C' P' Q' R'   D E F LeA P' Q' R'" 
          by (metis Defect A B C P Q R bet_out_1 conga__lea456123 
              defect_distincts not_bet_distincts)
        {
          fix S T U G H I
          assume "GradAExp P Q R S T U" and
            P1: "B' C' P' Q' R'. A Out B B'  A Out C C'  Defect A B' C' P' Q' R'  
                                  S T U LeA P' Q' R'" and
            "SAMS S T U S T U" and
            "S T U S T U SumA G H I" 
          obtain B' C' P' Q' R' where "A Out B B'" and "A Out C C'" and 
            "Defect A B' C' P' Q' R'" and "S T U LeA P' Q' R'" using P1 by blast
          obtain D' where "D' InAngle B A C" and "A C' B' CongA C' B' D'" and
            "Cong A C' B' D'" and "B' C' TS A D'" 
            using legendre_aux1 A Out B B' A Out C C' ¬ Col A B C by blast
          have "¬ Col A B' C'" 
            using TS_def B' C' TS A D' by presburger
          obtain B'' C'' where "A Out B B''" and "A Out C C''" and "Bet B'' D' C''"
            using D' InAngle B A C 
              T. T InAngle B A C  (X Y. A Out B X  A Out C Y  Bet X T Y) by blast
          have "Q'  P'" 
            using Defect A B' C' P' Q' R' defect_distincts by blast
          have "Q'  R'" 
            using Defect A B' C' P' Q' R' defect_distincts by blast
          have "A  C''" 
            using A Out C C'' l6_3_1 by blast
          have "A  B''" 
            using A Out B B'' out_distinct by blast
          have "B''  C''" 
            by (metis Col_def Out_def A Out B B'' A Out C C''
                ¬ Col A B C between_symmetry l6_7)
          then obtain P'' Q'' R'' where "Defect A B'' C'' P'' Q'' R''"
            using ex_defect A  B'' A  C'' by presburger
          moreover 
          obtain V W X where "P' Q' R' P' Q' R' SumA V W X"
            using ex_suma Q'  P' Q'  R' by presburger
          have "SAMS P' Q' R' P' Q' R'  V W X LeA P'' Q'' R''"
          proof -
            have "A Out B' B''" 
              using A Out B B'' A Out B B' l6_6 l6_7 by blast
            moreover have "A Out C' C''" 
              using A Out C C'' A Out C C' l6_6 l6_7 by blast
            ultimately show ?thesis
              using assms ¬ Col A B' C' A C' B' CongA C' B' D' Cong A C' B' D'
                B' C' TS A D' P' Q' R' P' Q' R' SumA V W X Bet B'' D' C''
                Defect A B' C' P' Q' R' Defect A B'' C'' P'' Q'' R'' legendre_aux by blast
          qed
          have "G H I LeA P'' Q'' R''" 
          proof -
            have "G H I LeA V W X" 
              using sams_lea2_suma2__lea [where ?A="S" and ?B="T" and ?C="U" and
                  ?D="S" and ?E="T" and ?F="U" and ?A'="P'" and ?B'="Q'" and ?C'="R'" and
                  ?D'="P'" and ?E'="Q'" and ?F'="R'"] S T U LeA P' Q' R' S T U LeA P' Q' R'
                SAMS P' Q' R' P' Q' R'  V W X LeA P'' Q'' R'' 
                S T U S T U SumA G H I P' Q' R' P' Q' R' SumA V W X
              by blast
            moreover have "V W X LeA P'' Q'' R''" 
              using SAMS P' Q' R' P' Q' R'  V W X LeA P'' Q'' R'' by blast
            ultimately show ?thesis
              using lea_trans by blast
          qed
          ultimately have "B' C' P' Q' R'. A Out B B'  A Out C C'  
                               Defect A B' C' P' Q' R'  G H I LeA P' Q' R'" 
            using A Out B B'' A Out C C'' by blast
        }
        thus "D E F G H I.
       GradAExp P Q R D E F 
       B' C' P' Q' R'.
          A Out B B'  A Out C C'  Defect A B' C' P' Q' R'  D E F LeA P' Q' R' 
       SAMS D E F D E F 
       D E F D E F SumA G H I 
       B' C' P' Q' R'.
          A Out B B' 
          A Out C C'  Defect A B' C' P' Q' R'   G H I LeA P' Q' R'" 
          by blast
      qed
    }
    hence "( P Q R S T U.
      Defect A B C P Q R  GradAExp P Q R S T U 
      ( B' C' P' Q' R'.
        (A Out B B'  A Out C C' 
         Defect A B' C' P' Q' R'  S T U LeA P' Q' R')))" by blast
  }
  thus ?thesis
    by blast
qed

lemma legendre_s_fourth_theorem_aux:
  assumes "archimedes_axiom" and
    "legendre_s_parallel_postulate"
  shows "postulate_of_right_saccheri_quadrilaterals" 
proof -
  obtain A B C where "¬ Col B A C" and "Acute B A C" and
    " T. (T InAngle B A C)  ( X Y. A Out B X  A Out C Y  Bet X T Y)" 
    using assms(2) legendre_s_parallel_postulate_def by blast
  have "A  B" 
    using Acute B A C acute_distincts by auto
  have "A  C" 
    using ¬ Col B A C not_col_distincts by auto
  have "B  C" 
    using ¬ Col B A C col_trivial_3 by auto
  obtain P Q R where "Defect A B C P Q R" 
    using A  B A  C B  C ex_defect by presburger
  {
    assume "Col P Q R"
    hence "¬ hypothesis_of_obtuse_saccheri_quadrilaterals" 
      using archi__obtuse_case_elimination assms(1) by presburger
    moreover have "¬ Col A B C" 
      by (simp add: ¬ Col B A C not_col_permutation_4)
    moreover have "Q Out P R" 
    proof -
      {
        assume "Bet P Q R"
        have "Defect B A C P Q R" 
          using Defect A B C P Q R defect_perm_213 by blast
        then obtain D E F G H I where "B A C A C B SumA G H I" and
          "G H I C B A SumA D E F" and "D E F SuppA P Q R"
          using Defect_def TriSumA_def by auto
        have "Col B A C"
        proof -
          have "P Q R SuppA D E F" 
            by (simp add: D E F SuppA P Q R suppa_sym)
          hence "E Out D F"
            using Bet P Q R bet_suppa__out by blast
          moreover 
          have "SAMS G H I C B A" 
            using B A C A C B SumA G H I assms(1) legendre_s_first_theorem by blast
          hence "C B A LeA D E F"
            using G H I C B A SumA D E F sams_suma__lea456789 by blast
          ultimately show ?thesis 
            using l6_6 out_col out_lea__out by blast
        qed
        hence False 
          by (simp add: ¬ Col B A C)
      }
      hence "¬ Bet P Q R" 
        by blast
      thus ?thesis 
        using Col P Q R l6_4_2 by blast
    qed
    ultimately
    have "postulate_of_right_saccheri_quadrilaterals" 
      using Defect A B C P Q R defect_ncol_out__rah 
        existential_playfair__rah_1 by blast
  }
  moreover
  {
    assume "¬ Col P Q R"
    obtain S T U where "GradAExp P Q R S T U" and "Obtuse S T U" 
      using  archi__gradaexp_destruction ¬ Col P Q R assms(1) by blast
    have "¬ hypothesis_of_obtuse_saccheri_quadrilaterals" 
      by (simp add: archi__obtuse_case_elimination assms(1))
    hence P2: " A B C.
    ¬ Col A B C  Acute B A C 
    ( T. T InAngle B A C  ( X Y. A Out B X  A Out C Y  Bet X T Y)) 
       
    ( P Q R S T U. Defect A B C P Q R  GradAExp P Q R S T U 
      ( B' C' P' Q' R'. (A Out B B'  A Out C C' 
         Defect A B' C' P' Q' R'  S T U LeA P' Q' R')))" 
      using legendre_aux2 by blast
    moreover have "¬ Col A B C" 
      by (simp add: ¬ Col B A C not_col_permutation_4)
    ultimately have " B' C' P' Q' R'. (A Out B B'  A Out C C' 
         Defect A B' C' P' Q' R'  S T U LeA P' Q' R')" 
      using T. T InAngle B A C  (X Y. A Out B X  A Out C Y  Bet X T Y) Acute B A C 
        Defect A B C P Q R GradAExp P Q R S T U by blast
    then obtain B' C' P' Q' R' where "A Out B B'" and "A Out C C'" and  
      "Defect A B' C' P' Q' R'" and " S T U LeA P' Q' R'" 
      by blast
    have "¬ SAMS P' Q' R' P' Q' R'" 
      using lea_obtuse_obtuse Obtuse S T U S T U LeA P' Q' R' obtuse__nsams by blast
    obtain D' where "D' InAngle B A C" and "A C' B' CongA C' B' D'" and 
      "Cong A C' B' D'" and "B' C' TS A D'" 
      using legendre_aux1 A Out B B' A Out C C' ¬ Col A B C by blast
    have "¬ Col A B' C'" 
      using TS_def B' C' TS A D' by auto
    obtain B'' C'' where "A Out B B''" and "A Out C C''" and "Bet B'' D' C''" 
      using D' InAngle B A C 
        T. T InAngle B A C  (X Y. A Out B X  A Out C Y  Bet X T Y) 
      by blast
    have "A  B''" 
      using Out_def A Out B B'' by auto
    have "A  C''" 
      using A Out C C'' l6_3_1 by blast
    have "B''  C''" 
      using A Out B B'' A Out C C'' ¬ Col A B C l6_6 l6_7 out_col by blast
    then obtain S' T' U' where "Defect A B'' C'' S' T' U'" 
      using ex_defect A  B'' A  C'' by presburger
    have "P'  Q'" 
      using Defect A B' C' P' Q' R' defect_distincts by blast
    have "R'  Q'" 
      using S T U LeA P' Q' R' lea_distincts by blast
    then obtain V W X where "P' Q' R' P' Q' R' SumA V W X"
      using ex_suma P'  Q' by presburger
    have " SAMS P' Q' R' P' Q' R'" 
    proof -
      have "A Out B' B''" 
        using Out_cases A Out B B'' A Out B B' l6_7 by blast
      moreover have "A Out C' C''" 
        using A Out C C'' A Out C C' l6_6 l6_7 by blast
      ultimately show ?thesis
        using legendre_aux P' Q' R' P' Q' R' SumA V W X Defect A B' C' P' Q' R' 
          Defect A B'' C'' S' T' U' ¬ Col A B' C' A C' B' CongA C' B' D'
          Cong A C' B' D' B' C' TS A D' Bet B'' D' C''
          ¬ HypothesisObtuseSaccheriQuadrilaterals by blast
    qed
    hence "False" using ¬ SAMS P' Q' R' P' Q' R' by blast
    hence " A B C D. Saccheri A B C D  Per A B C" 
      by blast
  }
  ultimately show ?thesis 
    using postulate_of_right_saccheri_quadrilaterals_def by blast
qed

theorem legendre_s_fourth_theorem:
  assumes "archimedes_axiom" and
    "legendre_s_parallel_postulate" 
  shows "postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights" 
  using assms(1) assms(2) legendre_s_fourth_theorem_aux rah__triangle 
    triangle__existential_triangle by blast

lemma P34_P21:
  assumes "archimedes_axiom" and 
    "Postulate34"
  shows "Postulate21"
  using assms(1) assms(2) legendre_s_fourth_theorem Postulate21_def Postulate34_def by blast

lemma P34_P27:
  assumes "archimedes_axiom" and 
    "Postulate34"
  shows "Postulate27" 
proof -
  have "Postulate21"
    using P34_P21 assms(1) assms(2) by blast
  thus ?thesis
    using Cycle_3 by blast
qed

lemma P25_33:
  assumes "Postulate25"
  shows "Postulate33" 
  using Postulate25_def Postulate33_def assms 
    thales_converse_postulate__weak_triangle_circumscription_principle by auto

lemma P23_33:
  assumes "Postulate23"
  shows "Postulate33" 
proof -
  have "Postulate25" 
    using assms(1) Cycle_3 by blast
  thus ?thesis
    using P25_33 by blast
qed

lemma P01_35:
  assumes "Postulate01"
  shows "Postulate35" 
  using Postulate01_def Postulate35_def assms playfair__existential_playfair 
    tarski_s_euclid_implies_playfair_s_postulate by blast

lemma P35_27:
  assumes "Postulate35"
  shows "Postulate27"
  using Postulate27_def Postulate35_def assms existential_playfair__rah by blast

lemma Thm10_1:
  assumes "archimedes_axiom" 
  shows "(Postulate01  Postulate02) 
         (Postulate01  Postulate03) 
         (Postulate01  Postulate04) 
         (Postulate01  Postulate05) 
         (Postulate01  Postulate06) 
         (Postulate01  Postulate07) 
         (Postulate01  Postulate08) 
         (Postulate01  Postulate09) 
         (Postulate01  Postulate10)" 
  using InterAx5 InterCycle3 Postulate01_def Postulate03_def playfair__alternate_interior 
    tarski_s_euclid_implies_playfair_s_postulate alternate_interior__triangle
    Cycle_2 Postulate03_def Postulate20_def assms legendre_s_third_theorem InterAx5 
    Cycle_3 P04_P33 P25_33 P34_P27 P4_P34 assms InterCycle1bis Postulate02_def 
    Postulate12_def playfair_bis__playfair Postulate07_def Postulate08_def 
    alternate_interior__consecutive_interior  consecutive_interior__alternate_interior 
    equivalent_postulates_without_decidability_of_intersection_of_lines 
    equivalent_postulates_without_decidability_of_intersection_of_lines
  by blast

lemma Thm10_2:
  assumes "archimedes_axiom" 
  shows "(Postulate01  Postulate11) 
         (Postulate01  Postulate12) 
         (Postulate01  Postulate13) 
         (Postulate01  Postulate14) 
         (Postulate01  Postulate15) 
         (Postulate01  Postulate16) 
         (Postulate01  Postulate17) 
         (Postulate01  Postulate18) 
         (Postulate01  Postulate19) 
         (Postulate01  Postulate20)" 
  using InterAx5 InterCycle1bis InterCycle3 Postulate02_def Postulate03_def
    Postulate12_def playfair__alternate_interior alternate_interior__triangle 
    playfair_bis__playfair equivalent_postulates_without_decidability_of_intersection_of_lines 
    Cycle_2 Cycle_1 Postulate11_def Postulate15_def
    inter_dec_plus_par_perp_perp_imply_triangle_circumscription 
    universal_posidonius_postulate__perpendicular_transversal_postulate
  by blast

lemma Thm10_3:
  assumes "archimedes_axiom" 
  shows "(Postulate01  Postulate21) 
         (Postulate01  Postulate22) 
         (Postulate01  Postulate23) 
         (Postulate01  Postulate24) 
         (Postulate01  Postulate25) 
         (Postulate01  Postulate26) 
         (Postulate01  Postulate27) 
         (Postulate01  Postulate28) 
         (Postulate01  Postulate29) 
         (Postulate01  Postulate30)" 
  using Postulate03_def Postulate21_def legendre_s_second_theorem 
    triangle__existential_triangle assms Thm10_1 Cycle_3 by blast

lemma Thm10_4:
  assumes "archimedes_axiom" 
  shows "(Postulate01  Postulate31) 
         (Postulate01  Postulate32) 
         (Postulate01  Postulate33) 
         (Postulate01  Postulate34) 
         (Postulate01  Postulate35)"
  using assms Thm10_1 P31_P04 P31_P04 P31_P32 P04_P33 P4_P34 P34_P27 Thm10_3 
    P01__P35 P35_27 by blast

(*
Pierre Boutry, Charly Gries, Julien Narboux, Pascal Schreck. Parallel postulates and continuity
axioms: a mechanized study in intuitionistic logic using Coq. Journal of Automated Reasoning,
Springer Verlag, 2019, 62 (1), pp.68. ff10.1007/s10817-017-9422-8ff. ffhal-01178236v2f

Theorem 10 In Archimedean neutral geometry, Postulates 1-34 are equivalent
*)
theorem Thm10:
  assumes "archimedes_axiom" 
  shows "(Postulate01  Postulate02) 
         (Postulate01  Postulate03) 
         (Postulate01  Postulate04) 
         (Postulate01  Postulate05) 
         (Postulate01  Postulate06) 
         (Postulate01  Postulate07) 
         (Postulate01  Postulate08) 
         (Postulate01  Postulate09) 
         (Postulate01  Postulate10) 
         (Postulate01  Postulate11) 
         (Postulate01  Postulate12) 
         (Postulate01  Postulate13) 
         (Postulate01  Postulate14) 
         (Postulate01  Postulate15) 
         (Postulate01  Postulate16) 
         (Postulate01  Postulate17) 
         (Postulate01  Postulate18) 
         (Postulate01  Postulate19) 
         (Postulate01  Postulate20) 
         (Postulate01  Postulate21) 
         (Postulate01  Postulate22) 
         (Postulate01  Postulate23) 
         (Postulate01  Postulate24) 
         (Postulate01  Postulate25) 
         (Postulate01  Postulate26) 
         (Postulate01  Postulate27) 
         (Postulate01  Postulate28) 
         (Postulate01  Postulate29) 
         (Postulate01  Postulate30) 
         (Postulate01  Postulate31) 
         (Postulate01  Postulate32) 
         (Postulate01  Postulate33) 
         (Postulate01  Postulate34) 
         (Postulate01  Postulate35)"
  using InterAx5 InterCycle3 Postulate01_def Postulate03_def playfair__alternate_interior 
    tarski_s_euclid_implies_playfair_s_postulate alternate_interior__triangle
    Cycle_2 Postulate03_def Postulate20_def assms legendre_s_third_theorem InterAx5 
    Cycle_3 P04_P33 P25_33 P34_P27 P4_P34 assms InterCycle1bis Postulate02_def 
    Postulate12_def playfair_bis__playfair Postulate07_def Postulate08_def 
    alternate_interior__consecutive_interior  consecutive_interior__alternate_interior 
    equivalent_postulates_without_decidability_of_intersection_of_lines 
    equivalent_postulates_without_decidability_of_intersection_of_lines
    InterAx5 InterCycle1bis InterCycle3 Postulate02_def Postulate03_def
    Postulate12_def playfair__alternate_interior alternate_interior__triangle 
    playfair_bis__playfair equivalent_postulates_without_decidability_of_intersection_of_lines 
    Cycle_2 Cycle_1 Postulate11_def Postulate15_def
    inter_dec_plus_par_perp_perp_imply_triangle_circumscription 
    universal_posidonius_postulate__perpendicular_transversal_postulate
    Postulate03_def Postulate21_def legendre_s_second_theorem 
    triangle__existential_triangle assms Thm10_1 Cycle_3 assms Thm10_1 P31_P04 
    P31_P04 P31_P32 P04_P33 P4_P34 P34_P27 Thm10_3 P01__P35 P35_27 by blast (* 3 sec *)

theorem equivalent_postulates_assuming_greenberg_s_axiom:
  assumes "greenberg_s_axiom"
  shows "(tarski_s_parallel_postulate  alternate_interior_angles_postulate) 
         (tarski_s_parallel_postulate  alternative_playfair_s_postulate) 
         (tarski_s_parallel_postulate  alternative_playfair_s_postulate) 
         (tarski_s_parallel_postulate  alternative_proclus_postulate) 
         (tarski_s_parallel_postulate  alternative_strong_parallel_postulate) 
         (tarski_s_parallel_postulate  consecutive_interior_angles_postulate) 
         (tarski_s_parallel_postulate  euclid_5) 
         (tarski_s_parallel_postulate  euclid_s_parallel_postulate) 
         (tarski_s_parallel_postulate  existential_playfair_s_postulate) 
         (tarski_s_parallel_postulate  existential_thales_postulate) 
         (tarski_s_parallel_postulate  inverse_projection_postulate) 
         (tarski_s_parallel_postulate  midpoint_converse_postulate) 
         (tarski_s_parallel_postulate  perpendicular_transversal_postulate) 
         (tarski_s_parallel_postulate  postulate_of_transitivity_of_parallelism) 
         (tarski_s_parallel_postulate  playfair_s_postulate) 
         (tarski_s_parallel_postulate  posidonius_postulate) 
         (tarski_s_parallel_postulate  universal_posidonius_postulate) 
         (tarski_s_parallel_postulate 
               postulate_of_existence_of_a_right_lambert_quadrilateral) 
         (tarski_s_parallel_postulate 
               postulate_of_existence_of_a_right_saccheri_quadrilateral) 
         (tarski_s_parallel_postulate 
               postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights) 
         (tarski_s_parallel_postulate  postulate_of_existence_of_similar_triangles) 
         (tarski_s_parallel_postulate 
               postulate_of_parallelism_of_perpendicular_transversals) 
         (tarski_s_parallel_postulate  postulate_of_right_lambert_quadrilaterals) 
         (tarski_s_parallel_postulate  postulate_of_right_saccheri_quadrilaterals) 
         (tarski_s_parallel_postulate  postulate_of_transitivity_of_parallelism) 
         (tarski_s_parallel_postulate  proclus_postulate) 
         (tarski_s_parallel_postulate  strong_parallel_postulate) 
         (tarski_s_parallel_postulate  tarski_s_parallel_postulate) 
         (tarski_s_parallel_postulate  thales_postulate) 
         (tarski_s_parallel_postulate  thales_converse_postulate) 
         (tarski_s_parallel_postulate  triangle_circumscription_principle) 
         (tarski_s_parallel_postulate  triangle_postulate)" 
proof -
  have "aristotle_s_axiom" 
    using aristotle_s_axiom_def assms greenberg__aristotle by blast
  have "tarski_s_parallel_postulate  alternate_interior_angles_postulate" 
    using InterAx5 Postulate01_def Postulate02_def alternate_interior__playfair_bis 
      playfair__alternate_interior playfair_bis__playfair 
      tarski_s_euclid_implies_playfair_s_postulate by blast
  moreover have "tarski_s_parallel_postulate  alternative_playfair_s_postulate" 
    using alternate_interior__playfair_bis calculation playfair__alternate_interior 
      playfair_bis__playfair by blast
  moreover have "tarski_s_parallel_postulate  alternative_proclus_postulate" 
    using inverse_projection_postulate__proclus_bis original_euclid__original_spp 
      original_spp__inverse_projection_postulate proclus_bis__proclus 
      proclus_s_postulate_implies_strong_parallel_postulate 
      strong_parallel_postulate_implies_tarski_s_euclid 
      tarski_s_implies_euclid_s_parallel_postulate by blast
  moreover have "tarski_s_parallel_postulate  alternative_strong_parallel_postulate" 
    using calculation(3) inverse_projection_postulate__proclus_bis 
      original_euclid__original_spp original_spp__inverse_projection_postulate 
      tarski_s_implies_euclid_s_parallel_postulate by blast
  moreover have "tarski_s_parallel_postulate  consecutive_interior_angles_postulate" 
    using alternate_interior__consecutive_interior calculation(1) 
      consecutive_interior__alternate_interior by blast
  moreover have "tarski_s_parallel_postulate  euclid_5" 
    using calculation(4) euclid_5__original_euclid original_euclid__original_spp 
      tarski_s_euclid_implies_euclid_5 by blast
  moreover have "tarski_s_parallel_postulate  euclid_s_parallel_postulate" 
    using calculation(4) original_euclid__original_spp 
      tarski_s_implies_euclid_s_parallel_postulate by linarith
  moreover have "tarski_s_parallel_postulate  existential_playfair_s_postulate" 
    using Postulate35_def Cycle_3 InterCycle1 P01__P35 P35_27 Postulate01_def 
      Postulate12_def greenberg_s_axiom calculation(2) by blast
  moreover have "tarski_s_parallel_postulate  existential_thales_postulate"  
    using Postulate26_def Cycle_3  InterCycle1 P01__P35 P35_27 Postulate01_def 
      Postulate12_def greenberg_s_axiom calculation(2) by blast
  moreover have "tarski_s_parallel_postulate  inverse_projection_postulate" 
    using calculation(3) calculation(4) inverse_projection_postulate__proclus_bis 
      original_spp__inverse_projection_postulate by blast
  moreover have "tarski_s_parallel_postulate  midpoint_converse_postulate" 
    using Postulate06_def calculation(2) calculation(8) 
      midpoint_converse_postulate_implies_playfair playfair__existential_playfair 
      playfair_bis__playfair playfair_s_postulate_implies_midpoint_converse_postulate by blast
  moreover have "tarski_s_parallel_postulate  perpendicular_transversal_postulate"
    using Postulate09_def inter_dec_plus_par_perp_perp_imply_triangle_circumscription 
      playfair__universal_posidonius_postulate 
      tarski_s_euclid_implies_playfair_s_postulate 
      triangle_circumscription_implies_tarski_s_euclid 
      universal_posidonius_postulate__perpendicular_transversal_postulate by blast
  moreover have "tarski_s_parallel_postulate  postulate_of_transitivity_of_parallelism" 
    using InterAx5 Postulate01_def Postulate02_def par_trans_implies_playfair 
      playfair_implies_par_trans tarski_s_euclid_implies_playfair_s_postulate by blast
  moreover have "tarski_s_parallel_postulate  playfair_s_postulate" 
    using calculation(13) playfair_implies_par_trans 
      tarski_s_euclid_implies_playfair_s_postulate by blast
  moreover have "tarski_s_parallel_postulate  posidonius_postulate" 
    using Postulate22_def Cycle_3 Postulate26_def calculation(9) by blast
  moreover have "tarski_s_parallel_postulate  universal_posidonius_postulate" 
    using Postulate11_def calculation(12) playfair__universal_posidonius_postulate 
      tarski_s_euclid_implies_playfair_s_postulate 
      universal_posidonius_postulate__perpendicular_transversal_postulate by blast
  moreover have "tarski_s_parallel_postulate 
        postulate_of_existence_of_a_right_lambert_quadrilateral" 
    using Cycle_3 Postulate22_def Postulate30_def calculation(15) by blast
  moreover have "tarski_s_parallel_postulate 
        postulate_of_existence_of_a_right_saccheri_quadrilateral" 
    using Cycle_3 Postulate28_def Postulate30_def calculation(17) by blast
  moreover have "tarski_s_parallel_postulate 
        postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights" 
    using Cycle_3 Postulate21_def Postulate22_def calculation(15) by blast
  moreover have "tarski_s_parallel_postulate 
        postulate_of_existence_of_similar_triangles" 
    using Cycle_3 Postulate22_def Postulate23_def calculation(15) by blast
  moreover have "tarski_s_parallel_postulate 
        postulate_of_parallelism_of_perpendicular_transversals" 
    using calculation(12) par_perp_2_par_implies_par_perp_perp 
      par_perp_perp_implies_par_perp_2_par by blast
  moreover have "tarski_s_parallel_postulate  postulate_of_right_lambert_quadrilaterals" 
    using Cycle_3 Postulate26_def Postulate29_def calculation(9) by blast
  moreover have "tarski_s_parallel_postulate  postulate_of_right_saccheri_quadrilaterals" 
    using calculation(18) calculation(9) rah__existential_saccheri thales_existence__rah by blast
  moreover have "tarski_s_parallel_postulate  proclus_postulate" 
    using Cycle_2 Postulate13_def Postulate01_def by blast
  moreover have "tarski_s_parallel_postulate  strong_parallel_postulate" 
    using calculation(24) proclus_s_postulate_implies_strong_parallel_postulate 
      strong_parallel_postulate_implies_tarski_s_euclid by blast
  moreover have "tarski_s_parallel_postulate  thales_postulate" 
    using Cycle_3 Postulate24_def Postulate26_def calculation(9) by blast
  moreover have "tarski_s_parallel_postulate  thales_converse_postulate" 
    using Cycle_3 Postulate25_def Postulate30_def calculation(17) by blast
  moreover have "tarski_s_parallel_postulate  triangle_circumscription_principle" 
    using inter_dec_plus_par_perp_perp_imply_triangle_circumscription  calculation(12) 
      triangle_circumscription_implies_tarski_s_euclid by blast
  moreover have "tarski_s_parallel_postulate  triangle_postulate" 
    using Cycle_3 Postulate03_def Postulate30_def calculation(17) by blast
  ultimately show ?thesis 
    by blast
qed

theorem equivalent_postulates_assuming_archimesdes_axiom:
  assumes "archimedes_axiom" 
  shows "alternate_interior_angles_postulate  alternative_playfair_s_postulate 
         alternative_playfair_s_postulate  alternative_proclus_postulate 
         alternative_proclus_postulate  alternative_strong_parallel_postulate 
         alternative_strong_parallel_postulate  bachmann_s_lotschnittaxiom 
         bachmann_s_lotschnittaxiom  consecutive_interior_angles_postulate 
         consecutive_interior_angles_postulate  euclid_5 
         euclid_5  euclid_s_parallel_postulate 
         euclid_s_parallel_postulate  existential_playfair_s_postulate 
         existential_playfair_s_postulate  existential_thales_postulate 
         existential_thales_postulate  inverse_projection_postulate 
         inverse_projection_postulate  legendre_s_parallel_postulate 
         legendre_s_parallel_postulate  midpoint_converse_postulate 
         midpoint_converse_postulate  perpendicular_transversal_postulate 
         perpendicular_transversal_postulate  postulate_of_transitivity_of_parallelism 
         postulate_of_transitivity_of_parallelism  playfair_s_postulate 
         playfair_s_postulate  posidonius_postulate 
         posidonius_postulate  universal_posidonius_postulate 
         universal_posidonius_postulate  
           postulate_of_existence_of_a_right_lambert_quadrilateral 
         postulate_of_existence_of_a_right_lambert_quadrilateral  
           postulate_of_existence_of_a_right_saccheri_quadrilateral 
         postulate_of_existence_of_a_right_saccheri_quadrilateral  
           postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights 
         postulate_of_existence_of_a_triangle_whose_angles_sum_to_two_rights  
           postulate_of_existence_of_similar_triangles 
         postulate_of_existence_of_similar_triangles  
           postulate_of_parallelism_of_perpendicular_transversals 
         postulate_of_parallelism_of_perpendicular_transversals  
           postulate_of_right_lambert_quadrilaterals 
         postulate_of_right_lambert_quadrilaterals  postulate_of_right_saccheri_quadrilaterals 
         postulate_of_right_saccheri_quadrilaterals  postulate_of_transitivity_of_parallelism 
         postulate_of_transitivity_of_parallelism  proclus_postulate 
         proclus_postulate  strong_parallel_postulate 
         strong_parallel_postulate  tarski_s_parallel_postulate 
         tarski_s_parallel_postulate  thales_postulate 
         thales_postulate  thales_converse_postulate 
         thales_converse_postulate  triangle_circumscription_principle 
         triangle_circumscription_principle  triangle_postulate 
         triangle_postulate  weak_inverse_projection_postulate 
         weak_inverse_projection_postulate  weak_tarski_s_parallel_postulate 
         weak_tarski_s_parallel_postulate  weak_triangle_circumscription_principle"
  using alternate_interior__consecutive_interior alternate_interior__playfair_bis assms
    bachmann_s_lotschnittaxiom__legendre_s_parallel_postulate consecutive_interior__alternate_interior
    euclid_5__original_euclid existential_playfair__rah existential_saccheri__rah
    inter_dec_plus_par_perp_perp_imply_triangle_circumscription
    inverse_projection_postulate__proclus_bis legendre_s_fourth_theorem_aux legendre_s_second_theorem
    legendre_s_third_theorem midpoint_converse_postulate_implies_playfair original_euclid__original_spp
    original_spp__inverse_projection_postulate par_perp_2_par_implies_par_perp_perp
    par_perp_perp_implies_par_perp_2_par playfair__alternate_interior playfair__existential_playfair
    playfair__universal_posidonius_postulate playfair_bis__playfair
    playfair_s_postulate_implies_midpoint_converse_postulate posidonius_postulate__rah
    proclus_bis__proclus proclus_s_postulate_implies_strong_parallel_postulate
    rah__existential_saccheri rah__posidonius rah__rectangle_principle rah__similar
    rah__thales_postulate rah__triangle rectangle_existence__rah
    rectangle_principle__rectangle_existence similar__rah
    strong_parallel_postulate_implies_tarski_s_euclid tarski_s_euclid_implies_euclid_5
    tarski_s_euclid_implies_playfair_s_postulate thales_converse_postulate__thales_existence
    thales_converse_postulate__weak_triangle_circumscription_principle thales_existence__rah
    thales_postulate__thales_converse_postulate triangle__existential_triangle
    triangle_circumscription_implies_tarski_s_euclid
    universal_posidonius_postulate__perpendicular_transversal_postulate
    weak_inverse_projection_postulate__weak_tarski_s_parallel_postulate
    weak_tarski_s_parallel_postulate__weak_inverse_projection_postulate
    weak_triangle_circumscription_principle__bachmann_s_lotschnittaxiom by argo 

section "Szmielew: hyperbolic plane postulate"

subsection "Definition"

definition hyperbolic_plane_postulate ::
  "bool"
  ("HyperbolicPlanePostulate") where
  "hyperbolic_plane_postulate 

   A1 A2 P.
  ¬ Col A1 A2 P 
 
  ( B1 B2 C1 C2. 
   A1 A2 Par B1 B2  Col P B1 B2  A1 A2 Par C1 C2  Col P C1 C2  ¬ Col C1 B1 B2)"

subsection "Propositions"

lemma hpp__nP35:
  assumes "greenberg_s_axiom"
  shows "hyperbolic_plane_postulate  ¬ Postulate35"
proof -
  have "hyperbolic_plane_postulate  ¬ existential_playfair_s_postulate" 
    using existential_playfair_s_postulate_def hyperbolic_plane_postulate_def by blast
  moreover
  have "(greenberg_s_axiom  ¬ existential_playfair_s_postulate)  hyperbolic_plane_postulate" 
    using existential_playfair_s_postulate_def hyperbolic_plane_postulate_def 
      col_permutation_5 par_right_comm by blast
  ultimately show ?thesis 
    using Postulate35_def assms by blast
qed

lemma aah__hpp:
  assumes "hypothesis_of_acute_saccheri_quadrilaterals"
  shows "hyperbolic_plane_postulate"
proof -
  {
    fix A1 A2 P
    assume "¬ Col A1 A2 P"
    then obtain Q where "Col A1 A2 Q" and "A1 A2 Perp P Q" 
      using l8_18_existence ¬ Col A1 A2 P by blast
    then obtain X where "A1  X" and "A2  X" and "Q  X" and "Col A1 A2 X" 
      using diff_col_ex3 by blast
    obtain Y where "Bet X Q Y" and "Cong X Q Q Y" 
      using cong_4312 segment_construction by blast
    have "A1  A2" 
      using A1 A2 Perp P Q perp_not_eq_1 by blast
    have "Q  Y" 
      using Cong X Q Q Y Q  X cong_identity_inv by auto
    have "P  Q" 
      using Col A1 A2 Q ¬ Col A1 A2 P by auto
    have "Col A1 A2 Y" 
      by (metis Bet X Q Y Col A1 A2 Q Col A1 A2 X Q  X bet_col colx)
    have "Per P Q X" 
      by (meson l8_16_1 A1 A2 Perp P Q Col A1 A2 Q Col A1 A2 X)
    then obtain B1 where "Saccheri Q P B1 X" 
      using P  Q Q  X per__ex_saccheri by blast
    hence "Q X Par P B1" 
      by (simp add: sac__par1423)
    have "Per P Q Y" 
      by (meson l8_16_1 A1 A2 Perp P Q Col A1 A2 Q Col A1 A2 Y)
    then obtain C1 where "Saccheri Q P C1 Y" 
      using P  Q Q  Y per__ex_saccheri by blast
    hence "Q Y Par P C1" 
      using sac__par1423 by blast
    have "A1 A2 Par B1 P" 
      using Par_cases A1  A2 Col A1 A2 Q Col A1 A2 X Q X Par P B1 
        par_col2_par_bis by blast
    moreover have "Col P B1 P" 
      using col_trivial_3 by auto
    moreover have "A1 A2 Par C1 P" 
      using Par_cases A1  A2 Col A1 A2 Q Col A1 A2 Y Q Y Par P C1 
        par_col2_par_bis by blast
    moreover have "Col P C1 P" 
      by (simp add: col_trivial_3)
    moreover
    {
      assume "Col C1 B1 P" 
      have "Q P ParStrict B1 X" 
        by (simp add: Saccheri Q P B1 X sac__pars1234)
      have "Q P ParStrict C1 Y" 
        using Saccheri Q P C1 Y sac__pars1234 by auto
      have "P Q TS Y X" 
        by (metis NCol_perm invert_two_sides Bet X Q Y Col A1 A2 Q 
            Col A1 A2 X Q  X Q  Y ¬ Col A1 A2 P bet__ts col_trivial_2 l6_21 l9_2)
      hence "P Q TS X C1" 
        by (meson Par_strict_cases l9_8_2 Q P ParStrict C1 Y l12_6 l9_2)
      hence "P Q TS B1 C1" 
        using Q P ParStrict B1 X l12_6 l9_8_2 par_strict_comm by blast
      hence "Bet B1 P C1" 
        using Col_cases Col C1 B1 P col_two_sides_bet by blast
      have "B1  P" 
        using calculation(1) par_distincts by auto
      have "C1  P" 
        using calculation(3) par_distinct by blast
      have "¬ B1 P C1 LtA X Q Y" 
        using Bet B1 P C1 Bet X Q Y bet2_lta__lta lta_distincts by blast
      moreover
      have "B1 P C1 LtA X Q Y"
      proof -
        have "¬ Col P Q X" 
          using TS_def P Q TS X C1 not_col_permutation_1 by presburger
        have "Q P TS X Y" 
          using P Q TS Y X invert_two_sides l9_2 by blast
        have "Acute B1 P Q" 
          using Saccheri Q P B1 X acute_sym assms 
            hypothesis_of_acute_saccheri_quadrilaterals_def by blast
        hence "B1 P Q LtA P Q X" 
          using acute_per__lta P  Q Q  X Per P Q X by blast
        moreover have "Acute Q P C1" 
          using Saccheri Q P C1 Y assms hypothesis_of_acute_saccheri_quadrilaterals_def by blast
        hence "Q P C1 LtA P Q Y" 
          using acute_per__lta P  Q Per P Q Y Q  Y by blast
        moreover have "SAMS P Q X P Q Y" 
          using P  Q Per P Q X Per P Q Y Q  X Q  Y per2__sams by force
        moreover have "B1 P Q Q P C1 SumA B1 P C1" 
          using B1  P Bet B1 P C1 C1  P P  Q bet__suma by force
        moreover have "P Q X P Q Y SumA X Q Y" 
          using Bet X Q Y P  Q Q  X Q  Y bet__suma suma_left_comm by presburger
        ultimately show ?thesis 
          using sams_lta2_suma2__lta by blast
      qed
      ultimately have False 
        by blast
    }
    ultimately have " B1 B2 C1 C2. 
   A1 A2 Par B1 B2  Col P B1 B2  A1 A2 Par C1 C2  Col P C1 C2  ¬ Col C1 B1 B2" 
      by blast
  }
  thus ?thesis 
    using hyperbolic_plane_postulate_def by blast
qed


theorem szmielew_s_theorem:
  assumes "aristotle_s_axiom"
  shows " P:: bool.
         (playfair_s_postulate  P)  (hyperbolic_plane_postulate  ¬ P) 
          
         (P  playfair_s_postulate)" 
proof -
  {
    fix P:: bool
    assume "playfair_s_postulate  P" and
      "hyperbolic_plane_postulate  ¬ P" 
    have "hypothesis_of_acute_saccheri_quadrilaterals  
               hypothesis_of_right_saccheri_quadrilaterals" 
      by (simp add: aristotle__acute_or_right assms)
    moreover
    have "greenberg_s_axiom" 
      by (simp add: aristotle__greenberg assms)
    hence "playfair_s_postulate  postulate_of_existence_of_a_right_saccheri_quadrilateral" 
      using equivalent_postulates_assuming_greenberg_s_axiom assms by blast
    {
      assume "hypothesis_of_acute_saccheri_quadrilaterals" 
      hence "P  playfair_s_postulate" 
        using HyperbolicPlanePostulate  ¬ P aah__hpp by blast
    }
    moreover
    {
      assume "hypothesis_of_right_saccheri_quadrilaterals" 
      assume P
      have "¬ hyperbolic_plane_postulate" 
        using HyperbolicPlanePostulate  ¬ P P by fastforce
      hence "Postulate35" 
        using hpp__nP35 assms by (simp add: GreenBergsAxiom)
      hence "playfair_s_postulate" 
        using equivalent_postulates_assuming_greenberg_s_axiom assms 
          Postulate35_def GreenBergsAxiom by fastforce
    }
    ultimately
    have "P  playfair_s_postulate" 
      by blast
    hence "P  playfair_s_postulate" 
      using PlayfairSPostulate  P by blast
  }
  thus ?thesis
    by blast
qed

end
end