Definition: geo-point
Point ==  g."Point"

Definition: geo-primitives
GeometryPrimitives ==  "Point":Type"O":Point ⟶ Point ⟶ Point ⟶ Point ⟶ ℙ"L":Point ⟶ Point ⟶ Point ⟶ ℙ

Lemma: geo-primitives_wf
GeometryPrimitives ∈ 𝕌'

Definition: mk-eu-prim
Point=P O=O Left=L ==  λx.x["Point" := P]["O" := O]["L" := L]

Lemma: mk-eu-prim_wf
[P:Type]. ∀[O:P ⟶ P ⟶ P ⟶ P ⟶ ℙ]. ∀[L:P ⟶ P ⟶ P ⟶ ℙ].  (Point=P O=O Left=L ∈ GeometryPrimitives)

Lemma: geo-point_wf
[g:GeometryPrimitives]. (Point ∈ Type)

Definition: geo-gt-prim
ab>cd ==  g."O" d

Lemma: geo-gt-prim_wf
[g:GeometryPrimitives]. ∀[a,b,c,d:Point].  (ab>cd ∈ ℙ)

Definition: geo-sep
==  ab>aa

Lemma: geo-sep_wf
[g:GeometryPrimitives]. ∀[a,b:Point].  (a b ∈ ℙ)

Definition: geo-left
leftof bc ==  g."L" c

Lemma: geo-left_wf
[g:GeometryPrimitives]. ∀[a,b,c:Point].  (a leftof bc ∈ ℙ)

Definition: geo-lsep
bc ==  leftof bc ∨ leftof cb

Lemma: geo-lsep_wf
[g:GeometryPrimitives]. ∀[a,b,c:Point].  (a bc ∈ ℙ)

Definition: geo-between
B(abc) ==  ((¬ab>ac) ∧ bc>ac)) ∧ bc)

Lemma: geo-between_wf
[g:GeometryPrimitives]. ∀[a,b,c:Point].  (B(abc) ∈ ℙ)

Definition: geo-length-sep
ab cd) ==  cd>ab ∨ ab>cd

Lemma: geo-length-sep_wf
[g:GeometryPrimitives]. ∀[a,b,c,d:Point].  (ab cd) ∈ ℙ)

Definition: geo-congruent
ab ≅ cd ==  ¬ab cd)

Lemma: geo-congruent_wf
[g:GeometryPrimitives]. ∀[a,b,c,d:Point].  (ab ≅ cd ∈ ℙ)

Definition: geo-eq
a ≡ ==  ¬b

Lemma: geo-eq_wf
[g:GeometryPrimitives]. ∀[a,b:Point].  (a ≡ b ∈ ℙ)

Definition: geo-ge
ab ≥ cd ==  ¬cd>ab

Lemma: geo-ge_wf
[g:GeometryPrimitives]. ∀[c,d,a,b:Point].  (cd ≥ ab ∈ ℙ)

Lemma: stable__geo-ge
[g:GeometryPrimitives]. ∀[c,d,a,b:Point].  Stable{cd ≥ ab}

Lemma: sq_stable__geo-ge
[g:GeometryPrimitives]. ∀[c,d,a,b:Point].  SqStable(cd ≥ ab)

Definition: geo-gt
cd > ab ==  ↓∃w:Point. (B(cwd) ∧ cw ≅ ab ∧ d)

Lemma: geo-gt_wf
[g:GeometryPrimitives]. ∀[c,d,a,b:Point].  (cd > ab ∈ ℙ)

Lemma: sq_stable__geo-gt
[g:GeometryPrimitives]. ∀[c,d,a,b:Point].  SqStable(cd > ab)

Definition: geo-strict-between
a-b-c ==  B(abc) ∧ b ∧ c

Lemma: geo-strict-between_wf
[g:GeometryPrimitives]. ∀[a,b,c:Point].  (a-b-c ∈ ℙ)

Definition: geo-colinear
Colinear(a;b;c) ==  ¬bc

Lemma: geo-colinear_wf
[e:GeometryPrimitives]. ∀[a,b,c:Point].  (Colinear(a;b;c) ∈ ℙ)

Lemma: stable__colinear
e:GeometryPrimitives. ∀[a,b,c:Point].  Stable{Colinear(a;b;c)}

Lemma: sq_stable__colinear
e:GeometryPrimitives. ∀[a,b,c:Point].  SqStable(Colinear(a;b;c))

Definition: geo-midpoint
a=m=b ==  B(amb) ∧ am ≅ mb

Lemma: geo-midpoint_wf
[e:GeometryPrimitives]. ∀[m,a,b:Point].  (a=m=b ∈ ℙ)

Definition: right-angle
Rabc ==  ∀c':Point. (c'=b=c  ac ≅ ac')

Lemma: right-angle_wf
[e:GeometryPrimitives]. ∀[a,b,c:Point].  (Rabc ∈ ℙ)

Definition: acute-angle
Acute(a;b;c) ==  ∀c':Point. (c'=b=c  ac' > ac)

Lemma: acute-angle_wf
[e:GeometryPrimitives]. ∀[a,b,c:Point].  (Acute(a;b;c) ∈ ℙ)

Definition: obtuse-angle
Obtuse(a;b;c) ==  ∀c':Point. (c'=b=c  ac > ac')

Lemma: obtuse-angle_wf
[e:GeometryPrimitives]. ∀[a,b,c:Point].  (Obtuse(a;b;c) ∈ ℙ)

Definition: basic-geo-axioms
BasicGeometryAxioms(g) ==
  ((∀a,b,c,d:Point.  (ab>cd  ab ≥ cd)) ∧ (∀a,b,c:Point.  (ba>ac  c)) ∧ (∀a,b,c:Point.  bc ≥ aa))
  ∧ (∀a,b,c,d,e,f:Point.  (ab>cd  cd ≥ ef  ab>ef))
  ∧ (∀a,b,c,d,e,f:Point.  (ab ≥ cd  cd>ef  ab>ef))
  ∧ (∀a,b,c:Point.  (B(abc)   ac>ab))
  ∧ (∀a,b,c:Point.  (a leftof bc  leftof ca))
  ∧ (∀a,b,c:Point.  (a leftof bc  c))
  ∧ (∀a,b,c,d:Point.  (B(abd)  B(bcd)  B(abc)))
  ∧ (∀a,b,c,d,A,B,C,D:Point.  (a  B(abc)  B(ABC)  ab ≅ AB  bc ≅ BC  ad ≅ AD  bd ≅ BD  cd ≅ CD))
  ∧ (∀a,b,c,x,y:Point.  (ax ≅ ay  bx ≅ by  cx ≅ cy   bc)))
  ∧ (∀a,b,x,y,z:Point.  (x leftof ab  leftof ab  B(xzy)  leftof ab))
  ∧ (∀a,b,c,y:Point.  (a bc   ab)  bc))

Lemma: basic-geo-axioms_wf
[g:GeometryPrimitives]. (BasicGeometryAxioms(g) ∈ ℙ)

Lemma: sq_stable-geo-axioms-if
[g:GeometryPrimitives]
  ((∀a,b,c:Point.  SqStable(B(abc)))
   (∀a,b,c,d:Point.  SqStable(ab ≅ cd))
   (∀a,b,c,d:Point.  SqStable(ab>cd))
   (∀a,b,c:Point.  (SqStable(a bc) ∧ (BasicGeometryAxioms(g)  leftof bc  leftof cb))))
   SqStable(BasicGeometryAxioms(g)))

Definition: geo-left-axioms
geo-left-axioms(g) ==
  (∀a,b,c:Point.  bc ⇐⇒ Colinear(a;b;c)))
  ∧ (∀a,b,c:Point.  (a leftof bc  leftof ca))
  ∧ (∀a,b,c:Point.  (a leftof bc  c))
  ∧ (∀a,b,x,y,z:Point.  (x leftof ab  leftof ab  B(xzy)  ab))
  ∧ (∀a,b,c,y:Point.  (a bc   Colinear(y;a;b)  bc))

Lemma: geo-left-axioms_wf
[g:GeometryPrimitives]. (geo-left-axioms(g) ∈ ℙ)

Lemma: basic-geo-cong-preserves-gt-prim
e:GeometryPrimitives. (BasicGeometryAxioms(e)  (∀a,b,c,d,x,y:Point.  (ab ≅ cd  cd>xy  ab>xy)))

Lemma: basic-geo-cong-preserves-gt-prim2
g:GeometryPrimitives. (BasicGeometryAxioms(g)  (∀a,b,c,d,e,f:Point.  (ab>cd  cd ≅ ef  ab>ef)))

Lemma: geo-sep-irreflexive
e:GeometryPrimitives. (BasicGeometryAxioms(e)  (∀a:Point. a)))

Lemma: geo-axiom-contrapositive
g:GeometryPrimitives. (BasicGeometryAxioms(g)  (∀a,b,c:Point.  ((¬c)  ba>ac))))

Lemma: geo-gt-prim-irreflexive
e:GeometryPrimitives. (BasicGeometryAxioms(e)  (∀a,b:Point.  ab>ba)))

Lemma: geo-congruent-flip
e:GeometryPrimitives. (BasicGeometryAxioms(e)  (∀[a,b:Point].  ab ≅ ba))

Lemma: basic-geo-sep-sym
e:GeometryPrimitives. (BasicGeometryAxioms(e)  (∀a,b:Point.  (a  a)))

Lemma: geo-axioms-imply
g:GeometryPrimitives
  (BasicGeometryAxioms(g)
   ((∀a:Point. a))
     ∧ (∀a,b,x,y:Point.  ((¬b)  B(xay)  B(xby)))
     ∧ (∀a,b,c:Point.  ((¬b)  ac ≅ cb))
     ∧ (∀a,b,c,d:Point.  ((¬¬(∃w:Point. (B(cwd) ∧ cw ≅ ab)))   d))
     ∧ (∀a,b,c:Point.  ((¬b)  B(abc)))
     ∧ (∀a,b,c:Point.  (B(abc)  B(cba)))
     ∧ (∀a,b,c,d:Point.  (B(abd)  B(bcd)  B(abc)))
     ∧ (∀a,b:Point.  aa ≅ bb)
     ∧ (∀a,b,p,q,r,s:Point.  (ab ≅ pq  ab ≅ rs  pq ≅ rs))
     ∧ (∀a,b,c,d,A,B,C,D:Point.  (a  B(abc)  B(ABC)  ab ≅ AB  bc ≅ BC  ad ≅ AD  bd ≅ BD  cd ≅ CD))
     ∧ (∀a,b,c,x,y:Point.  (ax ≅ ay  bx ≅ by  cx ≅ cy   bc)))))

Lemma: geo-gt-prim-symmetry
g:GeometryPrimitives. (BasicGeometryAxioms(g)  (∀a,b,c,d:Point.  (ab>cd  (ba>cd ∧ ab>dc ∧ ba>dc))))

Lemma: stable_geo-eq
[e:GeometryPrimitives]. ∀[a,b:Point].  Stable{a ≡ b}

Lemma: sq_stable__geo-eq
[e:GeometryPrimitives]. ∀[a,b:Point].  SqStable(a ≡ b)

Definition: circle-overlap
Overlap(a;b;c;d) ==  ↓∃p,q:Point. ((ab ≅ ap ∧ cd ≥ cp) ∧ cd ≅ cq ∧ ab ≥ aq)

Lemma: circle-overlap_wf
[g:GeometryPrimitives]. ∀[a,b,c,d:Point].  (Overlap(a;b;c;d) ∈ ℙ)

Lemma: sq_stable__circle-overlap
[g:GeometryPrimitives]. ∀[a,b,c,d:Point].  SqStable(Overlap(a;b;c;d))

Definition: circle-strict-overlap
StrictOverlap(a;b;c;d) ==  ↓∃p,q:Point. ((ab ≅ ap ∧ cd>cp) ∧ cd ≅ cq ∧ ab>aq)

Lemma: circle-strict-overlap_wf
[g:GeometryPrimitives]. ∀[a,b,c,d:Point].  (StrictOverlap(a;b;c;d) ∈ ℙ)

Lemma: sq_stable__circle-strict-overlap
[g:GeometryPrimitives]. ∀[a,b,c,d:Point].  SqStable(StrictOverlap(a;b;c;d))

Definition: euclidean-plane-structure
EuclideanPlaneStructure ==
  GeometryPrimitives
  "Ssquashstable":∀a,b,c,d:Point.  SqStable(ab>cd)
  "Lorsquashstable":∀a,b,c:Point.  SqStable(a leftof bc ∨ leftof cb)
  "SepOr":∀a:Point. ∀b:{b:Point| b} . ∀c:Point.  (a c ∨ c)
  "nontrivial":∃a:Point. (∃b:Point [a b])
  "SS":∀a,b:Point. ∀u:{u:Point| leftof ab} . ∀v:{v:Point| leftof ba} .  (∃x:Point [((¬bx) ∧ B(uxv))])
  "SC":∀c,d,a:Point. ∀b:{b:Point| a ∧ B(cbd)} .  (∃u:Point [(cu ≅ cd ∧ B(abu) ∧ (b  u))])
  "CC":∀a,b:Point. ∀c:{c:Point| c} . ∀d:{d:Point| StrictOverlap(a;b;c;d)} .
         (∃u:Point [(ab ≅ au ∧ cd ≅ cu ∧ leftof ac)])

Lemma: euclidean-plane-structure_wf
EuclideanPlaneStructure ∈ 𝕌'

Comment: old-def-of-CC
This is the version we had.
But it seems we can at least simplify CC to construct just the point on the left.

EuclideanPlaneStructure ==
   GeometryPrimitives
   "Bstable":∀[a,b,c:Point].  Stable{B(abc)}
   "Estable":∀[a,b,c,d:Point].  Stable{ab ≅ cd}
   "Ssquashstable":∀a,b:Point.  SqStable(a b)
   "Lorsquashstable":∀a,b,c:Point.  SqStable(a leftof bc ∨ leftof cb)
   "SepOr":∀a:Point. ∀b:{b:Point| b} . ∀c:Point.  (a c ∨ c)
   "nontrivial":∃a:Point. (∃b:Point [a b])
   "SS":∀a,b:Point. ∀u:{u:Point| leftof ab} . ∀v:{v:Point| leftof ba} .  (∃x:Point [(Colinear(a;b;x) ∧ B(uxv))])
   "SC":∀c,d,a:Point. ∀b:{b:Point| a ∧ B(cbd)} .
          ∃u:{u:Point| cu ≅ cd ∧ B(abu)} (∃v:Point [(cv ≅ cd ∧ B(vbu) ∧ Colinear(a;b;v) ∧ (b  u))])
   "CC":∀a,b:Point. ∀c:{c:Point| c} . ∀d:{d:Point| Overlap(a;b;c;d)} .
          ∃u:{u:Point| ab ≅ au ∧ cd ≅ cu} 
           (∃v:Point [((ab ≅ av ∧ cd ≅ cv) ∧ (StrictOverlap(a;b;c;d)  (u leftof ac ∧ leftof ca)))])⌝


Lemma: euclidean-plane-structure-subtype
EuclideanPlaneStructure ⊆GeometryPrimitives

Definition: geo-SS
geo-SS(g;a;b;u;v) ==  g."SS" v

Lemma: geo-SS_wf
[g:EuclideanPlaneStructure]. ∀[a,b:Point]. ∀[u:{u:Point| leftof ab} ]. ∀[v:{v:Point| leftof ba} ].
  (geo-SS(g;a;b;u;v) ∈ {x:Point| Colinear(a;b;x) ∧ B(uxv)} )

Lemma: stable__geo-between
g:EuclideanPlaneStructure. ∀[a,b,c:Point].  Stable{B(abc)}

Lemma: sq_stable__geo-between
g:EuclideanPlaneStructure. ∀[a,b,c:Point].  SqStable(B(abc))

Lemma: use-plane-sep
g:EuclideanPlaneStructure. ∀a,b,u,v:Point.  (u leftof ab  leftof ba  (∃x:Point. (Colinear(a;b;x) ∧ B(uxv))))

Lemma: stable__geo-congruent
g:EuclideanPlaneStructure. ∀[a,b,c,d:Point].  Stable{ab ≅ cd}

Lemma: sq_stable__geo-congruent
g:EuclideanPlaneStructure. ∀[a,b,c,d:Point].  SqStable(ab ≅ cd)

Lemma: sq_stable__midpoint
e:EuclideanPlaneStructure. ∀[a,b,c:Point].  SqStable(a=c=b)

Lemma: sq_stable__geo-gt-prim
g:EuclideanPlaneStructure. ∀a,b,c,d:Point.  SqStable(ab>cd)

Lemma: sq_stable__geo-sep
g:EuclideanPlaneStructure. ∀a,b:Point.  SqStable(a b)

Lemma: geo-gt-prim-irrefl
g:EuclideanPlaneStructure. (BasicGeometryAxioms(g)  (∀a,b,c,d:Point.  (ab>cd  cd>ab))))

Lemma: basic-geo-not-left-and-right
g:EuclideanPlaneStructure. (BasicGeometryAxioms(g)  (∀a,b,c:Point.  (a leftof bc  leftof cb))))

Lemma: sq_stable__geo-lsep
g:EuclideanPlaneStructure. ∀a,b,c:Point.  SqStable(a bc)

Lemma: sq_stable__geo-strict-between
g:EuclideanPlaneStructure. ∀a,b,c:Point.  SqStable(a-b-c)

Lemma: sq_stable__geo-axioms
g:EuclideanPlaneStructure. SqStable(BasicGeometryAxioms(g))

Lemma: basic-geo-axioms-imply
g:EuclideanPlaneStructure
  (BasicGeometryAxioms(g)  ((∀a:Point. a ≡ a) ∧ (∀a,b:Point.  ab ≅ ba) ∧ (∀a,b,c:Point.  (a ≡  ac ≅ bc))))

Lemma: basic-axioms-imply_between1
e:EuclideanPlaneStructure. (BasicGeometryAxioms(e)  (∀a1,a2,b,c:Point.  (a1 ≡ a2  B(a1bc)  B(a2bc))))

Lemma: basic-axioms-imply_between2
e:EuclideanPlaneStructure. (BasicGeometryAxioms(e)  (∀a,b1,b2,c:Point.  (b1 ≡ b2  B(ab1c)  B(ab2c))))

Lemma: implies-geo-between_functionality
e:EuclideanPlaneStructure
  (BasicGeometryAxioms(e)  (∀a1,a2,b1,b2,c1,c2:Point.  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  (B(a1b1c1) ⇐⇒ B(a2b2c2)))))

Definition: geo-CC
CC(a;b;c;d) ==  e."CC" d

Lemma: geo-CC_wf
[g:EuclideanPlaneStructure]. ∀[a,b:Point]. ∀[c:{c:Point| c} ]. ∀[d:{d:Point| StrictOverlap(a;b;c;d)} ].
  (CC(a;b;c;d) ∈ {u:Point| ab ≅ au ∧ cd ≅ cu ∧ leftof ac} )

Definition: geo-SC
SC(a;b;c;d) ==  g."SC" b

Lemma: geo-SC_wf
[g:EuclideanPlaneStructure]
  ∀c,d,a:Point. ∀b:{b:Point| a ∧ B(cbd)} .  (SC(a;b;c;d) ∈ {u:Point| cu ≅ cd ∧ B(abu) ∧ (b  u)} )

Definition: geo-SCO
SCO(a;b;c;d) ==  SC(a;b;c;d)

Lemma: geo-SCO_wf
[g:EuclideanPlaneStructure]
  ∀c,d,a:Point. ∀b:{b:Point| a ∧ B(cbd)} .  (SCO(a;b;c;d) ∈ {u:Point| cu ≅ cd ∧ B(abu) ∧ (b  u)} )

Lemma: circle-strict-overlap-implies-overlap
g:GeometryPrimitives. (BasicGeometryAxioms(g)  (∀a,b,c,d:Point.  (StrictOverlap(a;b;c;d)  Overlap(a;b;c;d))))

Definition: geo-CCL
CCL(a;b;c;d) ==  CC(a;b;c;d)

Lemma: geo-CCL_wf
[g:EuclideanPlaneStructure]
  (BasicGeometryAxioms(g)
   (∀a,b:Point. ∀c:{c:Point| c} . ∀d:Point.
        CCL(a;b;c;d) ∈ {u:Point| ab ≅ au ∧ cd ≅ cu ∧ leftof ac}  supposing ∃p,q:Point. ((ab ≅ ap ∧ cd>cp) ∧ cd ≅ cq ∧ \000Cab>aq)))

Definition: geo-CCR
geo-CCR(g;a;b;c;d) ==  CC(c;d;a;b)

Lemma: geo-CCR_wf
[g:EuclideanPlaneStructure]
  ∀a,b:Point. ∀c:{c:Point| a} . ∀d:Point.
    geo-CCR(g;a;b;c;d) ∈ {v:Point| ab ≅ av ∧ cd ≅ cv ∧ leftof ca}  supposing ∃p,q:Point. ((ab ≅ ap ∧ cd>cp) ∧ cd ≅ cq \000C∧ ab>aq)

Definition: extra-left-axiom
extra-left-axiom(g) ==  ∀a,b,c,a':Point.  (B(aba')  ab ≅ a'b  ab ≅ cb   a'  bc)

Lemma: extra-left-axiom_wf
[g:GeometryPrimitives]. (extra-left-axiom(g) ∈ ℙ)

Definition: right-angles-congruent-axiom
right-angles-congruent-axiom(e) ==
  ∀a,b,c,x,y,z:Point.  (((Rabc ∧ Rxyz) ∧ (x y ∧ z) ∧ b ∧ c)  abc ≅a xyz)

Lemma: sq_stable__geo-left-1
g:EuclideanPlaneStructure
  (BasicGeometryAxioms(g)  (∀a,b,c:Point.  (a bc  Colinear(a;b;c))))  (∀a,b,c:Point.  SqStable(a leftof bc)))

Lemma: sq_stable__geo-left-axioms-1
g:EuclideanPlaneStructure
  (BasicGeometryAxioms(g)  (∀a,b,c:Point.  (a bc  Colinear(a;b;c))))  SqStable(geo-left-axioms(g)))

Definition: euclidean-plane
EuclideanPlane ==  {g:EuclideanPlaneStructure| BasicGeometryAxioms(g)} 

Lemma: euclidean-plane_wf
EuclideanPlane ∈ 𝕌'

Lemma: euclidean-plane-subtype
EuclideanPlane ⊆EuclideanPlaneStructure

Lemma: use-basic-geo-axioms-lemma
g:EuclideanPlane
  (((∀a,b,c,d:Point.  (ab>cd  ab ≥ cd)) ∧ (∀a,b,c:Point.  (ba>ac  c)) ∧ (∀a,b,c:Point.  bc ≥ aa))
  ∧ (∀a,b,c,d,e,f:Point.  (ab>cd  cd ≥ ef  ab>ef))
  ∧ (∀a,b,c,d,e,f:Point.  (ab ≥ cd  cd>ef  ab>ef))
  ∧ (∀a,b,c:Point.  (B(abc)   ac>ab))
  ∧ (∀a,b,c:Point.  (a leftof bc  leftof ca))
  ∧ (∀a,b,c:Point.  (a leftof bc  c))
  ∧ (∀a,b,c,d:Point.  (B(abd)  B(bcd)  B(abc)))
  ∧ (∀a,b,c,d,A,B,C,D:Point.  (a  B(abc)  B(ABC)  ab ≅ AB  bc ≅ BC  ad ≅ AD  bd ≅ BD  cd ≅ CD))
  ∧ (∀a,b,c,x,y:Point.  (ax ≅ ay  bx ≅ by  cx ≅ cy   bc)))
  ∧ (∀a,b,x,y,z:Point.  (x leftof ab  leftof ab  B(xzy)  leftof ab))
  ∧ (∀a,b,c,y:Point.  (a bc   ab)  bc)))

Lemma: euclidean-plane-axioms
g:EuclideanPlane
  (((∀a,b:Point.  (a  a))
   ∧ (∀a:Point. a))
   ∧ (∀a,b,x,y:Point.  (a ≡  B(xay)  B(xby)))
   ∧ ((∀a,b,c:Point.  (a ≡  ac ≅ cb)) ∧ (∀a,b,c:Point.  (a ≡  ac ≅ bc)))
   ∧ (∀a,b,c,d:Point.  (cd ≥ ab   d))
   ∧ (∀a,b,c:Point.  (a ≡  B(abc)))
   ∧ (∀a,b,c:Point.  (B(abc)  B(cba)))
   ∧ (∀a,b,c,d:Point.  (B(abd)  B(bcd)  B(abc)))
   ∧ (∀a,b:Point.  ab ≅ ba)
   ∧ (∀a,b,p,q,r,s:Point.  (ab ≅ pq  ab ≅ rs  pq ≅ rs))
   ∧ (∀a,b:Point.  aa ≅ bb)
   ∧ (∀a,b,c,d,A,B,C,D:Point.  (a  B(abc)  B(ABC)  ab ≅ AB  bc ≅ BC  ad ≅ AD  bd ≅ BD  cd ≅ CD)))
  ∧ (∀a,b,c:Point.  bc ⇐⇒ Colinear(a;b;c)))
  ∧ (∀a,b,c:Point.  (a leftof bc  leftof ca))
  ∧ (∀a,b,c:Point.  (a leftof bc  c))
  ∧ (∀a,b,x,y,z:Point.  (x leftof ab  leftof ab  B(xzy)  ab))
  ∧ (∀a,b,c,y:Point.  (a bc   Colinear(y;a;b)  bc)))

Lemma: geo-congruent-flip2
e:EuclideanPlane. ∀[a,b:Point].  ab ≅ ba

Lemma: geo-cong-preserves-gt-prim
e:EuclideanPlane. ∀a,b,c,d,x,y:Point.  (ab ≅ cd  cd>xy  ab>xy)

Lemma: geo-cong-preserves-gt-prim2
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.  (ab>cd  cd ≅ ef  ab>ef)

Lemma: geo-gt-prim-symmetry2
g:EuclideanPlane. ∀a,b,c,d:Point.  (ab>cd  (ba>cd ∧ ab>dc ∧ ba>dc))

Lemma: upper-dimension-axiom
g:EuclideanPlane. ∀a,b,c,x,y:Point.  (ax ≅ ay  bx ≅ by  cx ≅ cy   Colinear(a;b;c))

Lemma: sq_stable__geo-left
g:EuclideanPlane. ∀a,b,c:Point.  SqStable(a leftof bc)

Lemma: sq_stable__geo-left-axioms
g:EuclideanPlane
  SqStable((∀a,b,c:Point.  bc ⇐⇒ Colinear(a;b;c)))
  ∧ (∀a,b,c:Point.  (a leftof bc  leftof ca))
  ∧ (∀a,b,c:Point.  (a leftof bc  c))
  ∧ (∀a,b,x,y,z:Point.  (x leftof ab  leftof ab  B(xzy)  ab))
  ∧ (∀a,b,c,y:Point.  (a bc   Colinear(y;a;b)  bc)))

Lemma: geo-CCL-left
g:EuclideanPlane. ∀a,b:Point. ∀c:{c:Point| c} . ∀d:Point.
  ((∃p,q:Point. ((ab ≅ ap ∧ cd>cp) ∧ cd ≅ cq ∧ ab>aq))  CCL(a;b;c;d) leftof ac)

Lemma: geo-CCR-right
g:EuclideanPlane. ∀a,b:Point. ∀c:{c:Point| c} . ∀d:Point.
  ((∃p,q:Point. ((ab ≅ ap ∧ cd>cp) ∧ cd ≅ cq ∧ ab>aq))  geo-CCR(g;a;b;c;d) leftof ca)

Lemma: geo-gt-prim-ge-trans
e:EuclideanPlane. ∀a,b,c,d,f,g:Point.  (ab>cd  cd ≥ fg  ab>fg)

Lemma: geo-gt-implies-geo-gt-prim
e:EuclideanPlane. ∀a,b,c,d:Point.  (ab > cd  ab>cd)

Lemma: geo-eq_weakening
[e:EuclideanPlane]. ∀[a,b:Point].  a ≡ supposing b ∈ Point

Lemma: geo-eq-self
[e:EuclideanPlane]. ∀[a:Point].  a ≡ a

Lemma: geo-eq_inversion
[e:EuclideanPlane]. ∀[a,b:Point].  a ≡ supposing b ≡ a

Lemma: geo-ge-sep
g:EuclideanPlane. ∀a,b,c,d:Point.  (cd ≥ ab   d)

Lemma: geo-congruence-identity
e:EuclideanPlane. ∀a,b,c:Point.  (cc ≅ ab  a ≡ b)

Lemma: geo-congruent-left-comm
e:EuclideanPlane. ∀[a,b,c,d:Point].  ba ≅ cd supposing ab ≅ cd

Lemma: geo-congruent-refl
e:EuclideanPlane. ∀[a,b:Point].  ab ≅ ab

Lemma: geo-congruent-symmetry
e:EuclideanPlane. ∀[a,b,c,d:Point].  cd ≅ ab supposing ab ≅ cd

Lemma: geo-congruent-transitivity
e:EuclideanPlane. ∀[a,b,c,d,x,y:Point].  (ab ≅ xy) supposing (cd ≅ xy and ab ≅ cd)

Lemma: geo-congruent-full-symmetry
e:EuclideanPlane
  ∀[a,b,c,d:Point].  {ba ≅ cd ∧ ab ≅ dc ∧ ba ≅ dc ∧ cd ≅ ab ∧ dc ≅ ab ∧ cd ≅ ba ∧ dc ≅ ba} supposing ab ≅ cd

Lemma: geo-congruent-functionality-lemma
g:EuclideanPlane
  ((∀a,b,c:Point.  (a ≡  ac ≅ bc))
   (∀a1,a2,b1,b2,c1,c2,d1,d2:Point.  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  d1 ≡ d2  a1b1 ≅ c1d1  a2b2 ≅ c2d2)))

Lemma: geo-congruent_functionality
e:EuclideanPlane. ∀a1,a2,b1,b2,c1,c2,d1,d2:Point.
  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  d1 ≡ d2  (a1b1 ≅ c1d1 ⇐⇒ a2b2 ≅ c2d2))

Lemma: geo-gt-implies-ge
[g:EuclideanPlane]. ∀[c,d,a,b:Point].  cd ≥ ab supposing cd>ab

Definition: geo-M
M(a;b;c) ==  e."SepOr" c

Lemma: geo-M_wf
e:EuclideanPlaneStructure. ∀a:Point. ∀b:{b:Point| b} . ∀c:Point.  (M(a;b;c) ∈ c ∨ c)

Lemma: geo-sep-or
e:EuclideanPlaneStructure. ∀a:Point. ∀b:{b:Point| b} . ∀c:Point.  (a c ∨ c)

Lemma: geo-gt-prim_functionality
e:EuclideanPlane. ∀a1,a2,b1,b2,c1,c2,d1,d2:Point.
  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  d1 ≡ d2  (a1b1>c1d1 ⇐⇒ a2b2>c2d2))

Lemma: geo-sep-irrefl_gt-prim
e:EuclideanPlane. ∀a,b,c:Point.  aa>bc)

Lemma: geo-gt-prim-transitivity
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.  (ab>cd  cd>ef  ab>ef)

Lemma: geo-congruence-identity-sym
[e:EuclideanPlane]. ∀[a,b,c:Point].  a ≡ supposing ab ≅ cc

Lemma: geo-sep-sym
e:EuclideanPlane. ∀a,b:Point.  (a  a)

Lemma: geo-between_functionality
e:EuclideanPlane. ∀a1,a2,b1,b2,c1,c2:Point.  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  (B(a1b1c1) ⇐⇒ B(a2b2c2)))

Lemma: geo-between-symmetry
e:EuclideanPlane. ∀[a,b,c:Point].  B(cba) supposing B(abc)

Lemma: geo-between-trivial2
e:EuclideanPlane. ∀[a,b:Point].  B(aab)

Lemma: geo-between-trivial
e:EuclideanPlane. ∀[a,b:Point].  B(abb)

Lemma: geo-congruent-sep
e:EuclideanPlane. ∀a,b,c,d:Point.  (ab ≅ cd   b)

Definition: geo-nontrivial
geo-nontrivial(e) ==  e."nontrivial"

Lemma: geo-nontrivial_wf
[g:EuclideanPlaneStructure]. (geo-nontrivial(g) ∈ ∃a:Point. (∃b:Point [a b]))

Definition: geo-O
==  fst(geo-nontrivial(e))

Lemma: geo-O_wf
e:EuclideanPlaneStructure. (O ∈ Point)

Definition: geo-X
==  snd(geo-nontrivial(e))

Lemma: geo-X_wf
e:EuclideanPlaneStructure. (X ∈ Point)

Lemma: geo-sep-O-X
e:EuclideanPlaneStructure. X

Lemma: geo-sep-exists
e:EuclideanPlane. ∀A:Point.  ∃A':Point. A'

Lemma: geo-ge_functionality
e:EuclideanPlane. ∀a1,a2,b1,b2,c1,c2,d1,d2:Point.
  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  d1 ≡ d2  (a1b1 ≥ c1d1 ⇐⇒ a2b2 ≥ c2d2))

Lemma: geo-congruent-right-comm
e:EuclideanPlane. ∀[a,b,c,d:Point].  ab ≅ dc supposing ab ≅ cd

Lemma: geo-congruent-comm
e:EuclideanPlane. ∀[a,b,c,d:Point].  ba ≅ dc supposing ab ≅ cd

Lemma: geo-five-segment
e:EuclideanPlane
  ∀[a,b,c,d,A,B,C,D:Point].
    (cd ≅ CD) supposing (bd ≅ BD and ad ≅ AD and bc ≅ BC and ab ≅ AB and B(ABC) and B(abc) and b)

Lemma: geo-five-segment'
e:EuclideanPlane
  ∀[a,b,c,A,B,C:Point].
    (∀d,D:Point.  (cd ≅ CD) supposing (bd ≅ BD and ad ≅ AD)) supposing 
       (bc ≅ BC and 
       ab ≅ AB and 
       B(ABC) and 
       B(abc) and 
       b)

Lemma: geo-between-implies-ge
[g:EuclideanPlane]. ∀[a,b,c:Point].  ac ≥ ab supposing B(abc)

Lemma: geo-between-sep
g:EuclideanPlane. ∀a,b,x:Point.  (B(axb)   b)

Lemma: geo-between-sep1
g:EuclideanPlane. ∀a,b:Point.  ∀[x:{x:Point| B(axb) ∧ x} ]. b

Lemma: geo-between-same
[e:EuclideanPlane]. ∀[a,b:Point].  a ≡ supposing B(aba)

Lemma: geo-gt-sep
e:EuclideanPlane. ∀A,B,C,P:Point.  (AB > CP  B)

Definition: sympoint
SymmetricPoint(a;p) ==  SCO(p;a;a;p)

Lemma: sympoint_wf
[e:EuclideanPlane]. ∀[a:Point]. ∀[p:{p:Point| p} ].  (SymmetricPoint(a;p) ∈ {p':Point| p=a=p'} )

Lemma: geo-Op-sep
g:EuclideanPlane. ∀p:{p:Point| B(OXp)} .  p

Lemma: geo-CC-2
g:EuclideanPlane. ∀a,b,c,d:Point.
  (a c
   (∃p,q:Point. ((ab ≅ ap ∧ cd>cp) ∧ cd ≅ cq ∧ ab>aq))
   (∃z1,z2:Point. (az1 ≅ ab ∧ az2 ≅ ab ∧ cz1 ≅ cd ∧ cz2 ≅ cd ∧ z1 leftof ac ∧ z2 leftof ca)))

Lemma: geo-CC-lsep
g:EuclideanPlane. ∀a,b,c,d:Point.
  (a  (∃p,q:Point. ((ab ≅ ap ∧ cd>cp) ∧ cd ≅ cq ∧ ab>aq))  (∃z:Point. ((az ≅ ab ∧ cz ≅ cd) ∧ ac)))

Lemma: Euclid-Prop1-left
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} .  (∃c:Point [(((cb ≅ ab ∧ ca ≅ ba) ∧ ca ≅ cb) ∧ leftof ab)])

Definition: eqtri
Δ(a;b) ==  CCL(a;b;b;a)

Lemma: eqtri_wf
[e:EuclideanPlane]. ∀[a:Point]. ∀[b:{b:Point| b} ].
  (a;b) ∈ {c:Point| ((cb ≅ ab ∧ ca ≅ ba) ∧ ca ≅ cb) ∧ leftof ab} )

Lemma: Euclid-Prop1-left-ext
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} .  (∃c:Point [(((cb ≅ ab ∧ ca ≅ ba) ∧ ca ≅ cb) ∧ leftof ab)])

Lemma: not-lsep-iff-colinear
g:EuclideanPlane. ∀a,b,c:Point.  bc ⇐⇒ Colinear(a;b;c))

Lemma: not-lsep-if-colinear
g:EuclideanPlane. ∀a,b,c:Point.  (a bc  Colinear(a;b;c)  False)

Lemma: colinear-lsep
g:EuclideanPlane. ∀a,b,c,y:Point.  (a bc   Colinear(y;a;b)  bc)

Lemma: left-implies-sep
g:EuclideanPlane. ∀a,b,c:Point.  (a leftof bc  {a b ∧ c ∧ c})

Lemma: lsep-implies-sep
g:EuclideanPlane. ∀a,b,c:Point.  (a bc  {a b ∧ c ∧ c})

Lemma: left-symmetry
g:EuclideanPlane. ∀a,b,c:Point.  (a leftof bc  leftof ca)

Lemma: geo-left_functionality
e:EuclideanPlane. ∀a1,a2,b1,b2,c1,c2:Point.  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  (a1 leftof b1c1 ⇐⇒ a2 leftof b2c2))

Lemma: left-all-symmetry
g:EuclideanPlane. ∀a,b,c:Point.  (a leftof bc  {b leftof ca ∧ leftof ab})

Lemma: geo-lsep_functionality
e:EuclideanPlane. ∀a1,a2,b1,b2,c1,c2:Point.  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  (a1 b1c1 ⇐⇒ a2 b2c2))

Lemma: lsep-symmetry
g:EuclideanPlane. ∀a,b,c:Point.  (a bc  (c ba ∧ ab))

Lemma: lsep-symmetry2
g:EuclideanPlane. ∀a,b,c:Point.  (a bc  cb)

Lemma: lsep-all-sym
g:EuclideanPlane. ∀a,b,c:Point.  (a bc  {b ca ∧ ab ∧ cb ∧ ac ∧ ba})

Lemma: lsep-all-sym2
g:EuclideanPlane. ∀a,b,c:Point.  (a leftof bc  {a bc ∧ ca ∧ ab ∧ cb ∧ ac ∧ ba})

Lemma: geo-colinear-transitivity
e:EuclideanPlane
  ∀[A,C,B,D:Point].  (Colinear(A;B;C)  Colinear(B;C;D)   {Colinear(A;C;D) ∧ Colinear(A;B;D)})

Lemma: geo-colinear-permute
e:EuclideanPlane. ∀a,b,c:Point.  (Colinear(a;b;c)  Colinear(c;b;a))

Lemma: geo-colinear-cycle
e:EuclideanPlane. ∀a,b,c:Point.  (Colinear(a;b;c)  Colinear(c;a;b))

Lemma: geo-colinear-swap
e:EuclideanPlane. ∀a,b,c:Point.  (Colinear(a;b;c)  Colinear(b;a;c))

Definition: geo-colinear-set
geo-colinear-set(e; L) ==  (∀A∈L.(∀B∈L.(∀C∈L.Colinear(A;B;C))))

Lemma: geo-colinear-set_wf
[e:EuclideanPlaneStructure]. ∀[L:Point List].  (geo-colinear-set(e; L) ∈ ℙ)

Lemma: geo-colinear-is-colinear-set
e:EuclideanPlane. ∀A,B,C:Point.  (Colinear(A;B;C)  geo-colinear-set(e; [A; B; C]))

Lemma: geo-between-implies-colinear
e:EuclideanPlane. ∀[a,b,c:Point].  Colinear(a;b;c) supposing B(abc)

Lemma: geo-colinear_functionality
e:EuclideanPlane. ∀a1,a2,b1,b2,c1,c2:Point.
  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  (Colinear(a1;b1;c1) ⇐⇒ Colinear(a2;b2;c2)))

Lemma: geo-colinear-append
e:EuclideanPlane. ∀L1,L2:Point List.
  ((∃A,B:Point. (A B ∧ ((A ∈ L1) ∧ (A ∈ L2)) ∧ (B ∈ L1) ∧ (B ∈ L2)))
   geo-colinear-set(e; L1)
   geo-colinear-set(e; L2)
   geo-colinear-set(e; L1 L2))

Lemma: geo-between-inner-trans
e:EuclideanPlane. ∀[a,b,c,d:Point].  (B(abc)) supposing (B(bcd) and B(abd))

Lemma: geo-sep-irrefl
e:EuclideanPlane. ∀[a,b:Point].  ¬supposing b ∈ Point

Lemma: geo-sep-irrefl2
e:EuclideanPlane. ∀[a,b:Point].  ¬(a b ∈ Point) supposing b

Lemma: geo-sep-irrefl'
e:EuclideanPlane. ∀[a:Point]. False supposing a

Lemma: left-convex
g:EuclideanPlane. ∀a,b,x,y:Point.  (x leftof ab  (B(bxy) ∨ (B(byx) ∧ b))  leftof ab)

Lemma: left-not-between
g:EuclideanPlane. ∀a,b,c:Point.  (a leftof cb  B(abc)))

Lemma: left-not-colinear
g:EuclideanPlane. ∀a,b,c:Point.  (a leftof cb  Colinear(a;b;c)))

Lemma: not-left-and-right
g:EuclideanPlane. ∀a,b,c:Point.  (a leftof bc  leftof cb))

Lemma: left-convex2
g:EuclideanPlane. ∀a,b,x,y:Point.  (x leftof ab  (B(axy) ∨ (B(ayx) ∧ a))  leftof ab)

Lemma: geo-sep_functionality
e:EuclideanPlane. ∀a1,a2,b1,b2:Point.  (a1 ≡ a2  b1 ≡ b2  (a1 b1 ⇐⇒ a2 b2))

Lemma: geo-gt_functionality
e:EuclideanPlane. ∀a1,a2,b1,b2,c1,c2,d1,d2:Point.
  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  d1 ≡ d2  (a1b1 > c1d1 ⇐⇒ a2b2 > c2d2))

Definition: geo-equilateral
EQΔ(a;b;c) ==  ((ab ≅ cb ∧ ac ≅ bc) ∧ ac ≅ ab) ∧ bc

Lemma: geo-equilateral_wf
[g1:EuclideanPlaneStructure]. ∀[a,b,c:Point].  (EQΔ(a;b;c) ∈ ℙ)

Definition: basic-geometry-
BasicGeometry- ==  EuclideanPlane

Lemma: basic-geometry-_wf
BasicGeometry- ∈ 𝕌'

Lemma: basic-geometry--subtype
BasicGeometry- ⊆EuclideanPlane

Definition: basic-geometry
BasicGeometry ==  EuclideanPlane

Lemma: basic-geometry_wf
BasicGeometry ∈ 𝕌'

Lemma: basic-geometry-subtype
BasicGeometry ⊆EuclideanPlane

Lemma: geo-strict-between-sym
e:BasicGeometry-. ∀a,b,c:Point.  (a-b-c  c-b-a)

Lemma: geo-strict-between-trans
e:BasicGeometry-. ∀a,b,c,d:Point.  (a-b-d  b-c-d  a-b-c)

Lemma: geo-strict-between-trans2
e:BasicGeometry-. ∀a,b,c,d:Point.  (d-a-b  d-b-c  a-b-c)

Lemma: geo-colinear-implies
e:BasicGeometry-. ∀a,b,c:Point.  (Colinear(a;b;c)  ((¬B(abc)) ∧ B(bca)) ∧ B(cab)))))

Lemma: geo-colinear-iff
e:BasicGeometry-. ∀a,b,c:Point.  (Colinear(a;b;c) ⇐⇒ ¬((¬B(abc)) ∧ B(bca)) ∧ B(cab))))

Lemma: geo-colinear-symmetry
[e:BasicGeometry]. ∀[a,b,c:Point].
  {Colinear(b;c;a) ∧ Colinear(c;a;b) ∧ Colinear(c;b;a) ∧ Colinear(a;c;b) ∧ Colinear(b;a;c)} supposing Colinear(a;b;c)

Lemma: geo-eq-preserves-col
g:EuclideanPlane. ∀a,b,x,y:Point.  (a ≡  Colinear(a;x;y)  Colinear(b;x;y))

Lemma: geo-strict-between-sep1
e:BasicGeometry-. ∀a,b,c:Point.  (a-b-c  c)

Lemma: geo-strict-between-sep2
e:GeometryPrimitives. ∀a,b,c:Point.  (a-b-c  b)

Lemma: geo-strict-between-sep3
e:GeometryPrimitives. ∀a,b,c:Point.  (a-b-c  c)

Lemma: geo-strict-between-same
[e:BasicGeometry-]. ∀[a,b:Point].  a-b-a)

Lemma: geo-strict-between-same2
[e:BasicGeometry-]. ∀[a,b:Point].  False supposing a-b-a

Lemma: not-geo-strict-between-same
e:BasicGeometry-. ∀[a,b:Point].  False supposing a-b-b

Lemma: not-geo-strict-between-same2
e:BasicGeometry. ∀[a,b:Point].  False supposing a-a-b

Lemma: geo-eq_transitivity
[e:BasicGeometry-]. ∀[a,b,c:Point].  (a ≡ c) supposing (b ≡ and a ≡ b)

Lemma: geo-congruent-implies-ge
[g:BasicGeometry-]. ∀[c,d,a,b:Point].  cd ≥ ab supposing cd ≅ ab

Lemma: geo-strict-between_functionality
e:BasicGeometry. ∀a1,a2,b1,b2,c1,c2:Point.  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  (a1-b1-c1 ⇐⇒ a2-b2-c2))

Lemma: geo-congruence-identity2
[e:BasicGeometry]. ∀[a,b,c,d:Point].  (a ≡ b) supposing (ab ≅ cd and c ≡ d)

Lemma: geo-congruence-identity3
[e:BasicGeometry]. ∀[a,b,c,d:Point].  (a ≡ b) supposing (cd ≅ ab and c ≡ d)

Lemma: geo-congruence-identity-eq
e:BasicGeometry. ∀a,b,c:Point.  ∀[d:Point]. (c ≡  ab ≅ cd  a ≡ b)

Lemma: geo-colinear-same
[e:BasicGeometry]. ∀[a,b:Point].  (Colinear(a;b;b) ∧ Colinear(b;a;b) ∧ Colinear(b;b;a))

Lemma: geo-not-colinear
e:BasicGeometry. ∀[a,b,c:Point].  Colinear(a;b;c) ⇐⇒ ¬(B(abc) ∨ B(bca) ∨ B(cab)))

Lemma: geo-not-not-colinear
e:BasicGeometry. ∀[a,b,c:Point].  (¬¬Colinear(a;b;c) ⇐⇒ ¬¬(B(abc) ∨ B(bca) ∨ B(cab)))

Lemma: geo-strict-between-implies-colinear
e:BasicGeometry. ∀[a,b,c:Point].  Colinear(a;b;c) supposing a-b-c

Lemma: geo-between-implies-colinear2
e:BasicGeometry. ∀[a,b,c:Point].  Colinear(a;b;c) supposing B(cab)

Lemma: geo-between-implies-sep
e:BasicGeometry. ∀a,b,c:Point.  (a  B(abc)  c)

Lemma: geo-strict-between-implies-between
e:BasicGeometry-. ∀[a,b,c:Point].  B(abc) supposing a-b-c

Lemma: geo-between-implies-colinear3
e:BasicGeometry. ∀[a,b,c:Point].  Colinear(a;b;c) supposing B(bca)

Lemma: geo-between-same2
[e:BasicGeometry]. ∀[a,b,c:Point].  (a ≡ b) supposing (a ≡ and B(abc))

Lemma: geo-cong-implies-ge
e:BasicGeometry. ∀a,b,c,d:Point.  (ab ≅ cd  cd ≥ ab)

Lemma: geo-ge-trivial
[g:BasicGeometry]. ∀[a,b:Point].  ab ≥ ab

Lemma: geo-simple-colinear-cases
[e:BasicGeometry-]. ∀[a,b,c:Point].
  ∀X:ℙ(Stable{X}  Colinear(a;b;c)  (B(abc)  X)  (B(bca)  X)  (B(cab)  X)  X)

Lemma: geo-colinear-cases
e:BasicGeometry-
  ∀[a,b,c:Point].
    ∀X:ℙ
      (Stable{X}
       (a ≡  X)
       (b ≡  X)
       (c ≡  X)
       (a-b-c  X)
       (b-c-a  X)
       (c-a-b  X)
       ((¬Colinear(a;b;c))  X)
       X)

Lemma: geo-between-exchange3
e:BasicGeometry-. ∀[a,b,c,d:Point].  (B(bcd)) supposing (B(acd) and B(abc))

Lemma: geo-sep-between-eq
e:BasicGeometry. ∀a,b,c:Point.  (B(abc)   c)

Lemma: geo-colinear-implies-1
e:BasicGeometry. ∀x,a,b:Point.  (Colinear(b;a;x)  Colinear(b;a;a))

Definition: geo-segment
geo-segment(e) ==  Point × Point

Lemma: geo-segment_wf
[e:EuclideanPlaneStructure]. (geo-segment(e) ∈ Type)

Definition: geo-mk-seg
ab ==  <a, b>

Lemma: geo-mk-seg_wf
[e:EuclideanPlaneStructure]. ∀[a,b:Point].  (ab ∈ geo-segment(e))

Definition: geo-seg1
geo-seg1(s) ==  fst(s)

Lemma: geo-seg1_wf
[e:EuclideanPlaneStructure]. ∀[s:geo-segment(e)].  (geo-seg1(s) ∈ Point)

Definition: geo-seg2
geo-seg2(s) ==  snd(s)

Lemma: geo-seg2_wf
[e:EuclideanPlaneStructure]. ∀[s:geo-segment(e)].  (geo-seg2(s) ∈ Point)

Lemma: geo_seg2_mk_seg_lemma
b,a:Top.  (geo-seg2(ab) b)

Definition: geo-seg-proper
geo-seg-proper(e; s) ==  geo-seg1(s) geo-seg2(s)

Lemma: geo-seg-proper_wf
[e:EuclideanPlaneStructure]. ∀[s:geo-segment(e)].  (geo-seg-proper(e; s) ∈ ℙ)

Definition: geo-proper-segment
geo-proper-segment(e) ==  s:geo-segment(e) × geo-seg-proper(e; s)

Lemma: geo-proper-segment_wf
[e:EuclideanPlaneStructure]. (geo-proper-segment(e) ∈ Type)

Lemma: geo_seg1_mk_seg_lemma
b,a:Top.  (geo-seg1(ab) a)

Definition: geo-seg-of
geo-seg-of(sp) ==  fst(sp)

Lemma: geo-seg-of_wf
[e:BasicGeometry]. ∀[sp:geo-proper-segment(e)].  (geo-seg-of(sp) ∈ geo-segment(e))

Definition: geo-seg-congruent
geo-seg-congruent(e; s1; s2) ==  geo-seg1(s1)geo-seg2(s1) ≅ geo-seg1(s2)geo-seg2(s2)

Lemma: geo-seg-congruent_wf
[e:EuclideanPlaneStructure]. ∀[s1,s2:geo-segment(e)].  (geo-seg-congruent(e; s1; s2) ∈ ℙ)

Lemma: sq_stable_geo-seg-congruent
e:EuclideanPlaneStructure. ∀[s1,s2:geo-segment(e)].  SqStable(geo-seg-congruent(e; s1; s2))

Lemma: geo-seg-congruent_transitivity
e:BasicGeometry
  ∀[s1,s2,s3:geo-segment(e)].
    (geo-seg-congruent(e; s1; s3)) supposing (geo-seg-congruent(e; s1; s2) and geo-seg-congruent(e; s2; s3))

Lemma: geo-seg-congruent_symmetry
e:BasicGeometry. ∀[s1,s2:geo-segment(e)].  geo-seg-congruent(e; s2; s1) supposing geo-seg-congruent(e; s1; s2)

Lemma: geo-seg-congruent_inversion
e:BasicGeometry. ∀[s1,s2:geo-segment(e)].  geo-seg-congruent(e; s2; s1) supposing geo-seg-congruent(e; s1; s2)

Lemma: geo-seg-congruent-equiv
e:BasicGeometry. EquivRel(geo-segment(e);s,t.geo-seg-congruent(e; s; t))

Lemma: geo-congruent-flip-seg
e:BasicGeometry. ∀[a,b:Point].  geo-seg-congruent(e; ab; ba)

Lemma: geo-length-equiv
e:BasicGeometry. EquivRel({p:Point| B(OXp)} ;x,y.x ≡ y)

Definition: geo-length-type
Length ==  x,y:{p:Point| B(OXp)} //x ≡ y

Lemma: geo-length-type_wf
[e:BasicGeometry]. (Length ∈ Type)

Lemma: subtype-geo-length-type
[e:BasicGeometry]. ({p:Point| B(OXp)}  ⊆Length)

Definition: geo-zero-length
==  X

Lemma: geo-zero-length_wf
[e:BasicGeometry]. (0 ∈ Length)

Lemma: geo-seg-congruent_weakening
e:BasicGeometry. ∀[s1,s2:geo-segment(e)].  geo-seg-congruent(e; s1; s2) supposing s1 s2 ∈ geo-segment(e)

Lemma: geo-seg-congruent_functionality
e:BasicGeometry. ∀s1,s2,t1,t2:geo-segment(e).
  (geo-seg-congruent(e; s1; t1)
   geo-seg-congruent(e; s2; t2)
   (geo-seg-congruent(e; s1; s2) ⇐⇒ geo-seg-congruent(e; t1; t2)))

Lemma: geo-seg-congruent-trivial
e:BasicGeometry. ∀[s:geo-segment(e)]. geo-seg-congruent(e; s; s)

Lemma: geo-midpoint_functionality
e:BasicGeometry. ∀m,a,b,m',a',b':Point.  (m ≡ m'  a ≡ a'  b ≡ b'  {a=m=b  a'=m'=b'})

Lemma: geo-midpoint-id2
e:BasicGeometry. ∀a,b:Point.  (a=b=a  a ≡ b)

Lemma: geo-midpoint-id
e:BasicGeometry. ∀a,b:Point.  (a=a=b  a ≡ b)

Lemma: geo-midpoint-id3
e:BasicGeometry. ∀a,b:Point.  (b=a=a  a ≡ b)

Lemma: stable__geo-midpoint
e:BasicGeometry. ∀[m,a,b:Point].  Stable{a=m=b}

Lemma: geo-midpoint-trivial
e:BasicGeometry. ∀a:Point.  a=a=a

Lemma: geo-midpoint-symmetry
e:BasicGeometry. ∀m,a,b:Point.  (a=m=b  b=m=a)

Lemma: extend-using-SC
e:EuclideanPlane. ∀q,a,b:Point.  (q  (∃x:Point. (B(qax) ∧ ax ≅ ab)))

Lemma: geo-inner-five-segment
e:EuclideanPlane
  ∀[a,b,c,d,A,B,C,D:Point].  (bd ≅ BD) supposing (cd ≅ CD and ad ≅ AD and bc ≅ BC and ac ≅ AC and B(ABC) and B(abc))

Lemma: geo-inner-five-segment'
e:EuclideanPlane
  ∀[a,b,c,A,B,C:Point].
    (∀d,D:Point.  (bd ≅ BD) supposing (cd ≅ CD and ad ≅ AD)) supposing (bc ≅ BC and ac ≅ AC and B(ABC) and B(abc))

Lemma: geo-inner-three-segment
e:EuclideanPlane. ∀[a,b,c,A,B,C:Point].  (ab ≅ AB) supposing (bc ≅ BC and ac ≅ AC and B(ABC) and B(abc))

Lemma: symmetric-point-construction1
e:BasicGeometry. ∀a:Point. ∀p:{p:Point| p} .  (∃p':Point [p=a=p'])

Lemma: symmetric-point-construction
e:BasicGeometry. ∀a,p:Point.  (a  (∃p':Point. p=a=p'))

Lemma: left-right-colinear-cases
e:EuclideanPlane. ∀u,v,b,c:Point.
  (∀a:Point. (a  Colinear(a;b;u)  Colinear(a;b;v)  (B(abu) ∨ B(abv)))) supposing (v leftof cb and leftof bc)

Lemma: euclidean-plane-subtype-basic
EuclideanPlane ⊆BasicGeometry

Definition: oriented-plane
OrientedPlane ==  EuclideanPlane

Lemma: oriented-plane_wf
OrientedPlane ∈ 𝕌'

Lemma: oriented-plane-subtype
OrientedPlane ⊆EuclideanPlane

Lemma: op-geo-left-axioms
g:OrientedPlane. geo-left-axioms(g)

Lemma: oriented-colinear-trans
e:OrientedPlane
  ∀[A,C,B,D:Point].  (Colinear(A;B;C)  Colinear(B;C;D)   {Colinear(A;C;D) ∧ Colinear(A;B;D)})

Lemma: oriented-colinear-append
e:OrientedPlane. ∀L1,L2:Point List.
  ((∃A,B:Point. (A B ∧ ((A ∈ L1) ∧ (A ∈ L2)) ∧ (B ∈ L1) ∧ (B ∈ L2)))
   geo-colinear-set(e; L1)
   geo-colinear-set(e; L2)
   geo-colinear-set(e; L1 L2))

Lemma: not-left-collinear
g:OrientedPlane. ∀a,b,c:Point.  ((¬leftof bc)  leftof cb)  ((¬B(abc)) ∧ B(bca)) ∧ B(cab)))))

Lemma: lsep-not-between
g:OrientedPlane. ∀a,b,c:Point.  (a bc  B(abc)))

Lemma: left-between-weak
g:OrientedPlane. ∀a,b,x,y,z:Point.  (x leftof ab  leftof ab  B(xzy)  leftof ba))

Lemma: left-between
g:OrientedPlane. ∀a,b,x,y,z:Point.  (x leftof ab  leftof ab  B(xzy)  leftof ab)

Lemma: colinear-lsep'
g:OrientedPlane. ∀a,b,c,y:Point.  (y ab   Colinear(a;b;c)  cb)

Lemma: colinear-lsep-general
g:OrientedPlane. ∀a,b,c,d:Point.  (Colinear(a;b;c)  Colinear(a;b;d)   (∀y:Point. (y ab  cd)))

Lemma: colinear-lsep-alt
g:OrientedPlane. ∀a,b,c,x,z:Point.  (a bc   Colinear(a;b;x)   Colinear(x;c;z)  bc)

Lemma: colinear-lsep-cycle
g:EuclideanPlane. ∀a,b,c,y:Point.  (a bc   Colinear(a;b;y)  bc)

Lemma: colinear-lsep2
g:OrientedPlane. ∀a,b,c,x,y:Point.  (a bc   Colinear(a;b;x)   Colinear(b;c;y)  yc)

Lemma: lsep-iff
g:OrientedPlane. ∀a,b,c:Point.  (a bc ⇐⇒ (∀y:Point. (y  Colinear(y;b;c)  by)) ∧ b)

Lemma: lsep-colinear-sep
g:OrientedPlane. ∀a,b,c:Point.  (a bc  (∀y:Point. (Colinear(y;b;c)  y)))

Lemma: lsep-colinear-sep1
g:OrientedPlane. ∀a,b,c:Point. ∀y:{y:Point| Colinear(y;b;c)} .  (a bc  y)

Lemma: left-right-sep
g:OrientedPlane. ∀a,b,c,d:Point.  (a leftof cd  leftof dc  b)

Lemma: lsep-opposite-iff
g:OrientedPlane. ∀a,b,x,y:Point.
  (x ab  ab  (∃z:Point. (B(xzy) ∧ Colinear(z;a;b)) ⇐⇒ leftof ab ⇐⇒ leftof ba))

Lemma: strict-between-left-right
e:EuclideanPlane. ∀x,y,p,a,q:Point.  (p leftof yx  Colinear(a;x;y)  p-a-q  leftof xy)

Lemma: lsep-same-side-iff
g:OrientedPlane. ∀a,b,x,y:Point.
  (x ab  ab  (∀z:Point. (B(xzy)  Colinear(z;a;b))) ⇐⇒ leftof ab ⇐⇒ leftof ab))

Lemma: left-between-implies-right1
g:OrientedPlane. ∀a,b,x,y:Point.  (x leftof ab  B(xby)   leftof ba)

Lemma: left-between-implies-right2
g:OrientedPlane. ∀a,b,x,y:Point.  (x leftof ab  B(xay)   leftof ba)

Lemma: left-convex3
e:OrientedPlane. ∀b,p,q,x,z:Point.  (q leftof pb  Colinear(p;b;z)  B(zqx)  leftof pb)

Lemma: left-opposite-between
e:OrientedPlane. ∀a,b,p,q,x:Point.  (B(aqx)  leftof bp  leftof pb  leftof pb)

Lemma: lsep-inner-pasch
e:OrientedPlane. ∀a,b:Point. ∀c:{c:Point| ab} . ∀p:{p:Point| a-p-c} . ∀q:{q:Point| b-q-c} .
  (∃x:Point [(B(bxp) ∧ B(axq))])

Lemma: lsep-inner-pasch-ext
e:OrientedPlane. ∀a,b:Point. ∀c:{c:Point| ab} . ∀p:{p:Point| a-p-c} . ∀q:{q:Point| b-q-c} .
  (∃x:Point [(B(bxp) ∧ B(axq))])

Lemma: lsep-inner-pasch-strict
e:OrientedPlane. ∀a,b:Point. ∀c:{c:Point| ab} . ∀p:{p:Point| a-p-c} . ∀q:{q:Point| b-q-c} .
  (∃x:Point [(b-x-p ∧ a-x-q)])

Lemma: lsep-inner-pasch-strict-ext
e:OrientedPlane. ∀a,b:Point. ∀c:{c:Point| ab} . ∀p:{p:Point| a-p-c} . ∀q:{q:Point| b-q-c} .
  (∃x:Point [(b-x-p ∧ a-x-q)])

Lemma: not-not-inner-pasch
g:OrientedPlane. ∀a,b,c:Point. ∀p:{p:Point| B(apc)} . ∀q:{q:Point| B(bqc)} .  (¬¬(∃x:Point. (B(pxb) ∧ B(qxa))))

Definition: half-plane-cong-angle
abc ≅ρ dbc ==  (a leftof bc ∧ leftof bc) ∧ Colinear(a;d;b)

Lemma: half-plane-cong-angle_wf
g:EuclideanPlane. ∀[d,a,b,c:Point].  (abc ≅ρ dbc ∈ ℙ)

Definition: half-plane-lt-angle
half-plane-lt-angle(e;d;a;b;c) ==  (a leftof bc ∧ leftof bc) ∧ leftof ba

Lemma: half-plane-lt-angle_wf
e:EuclideanPlane. ∀a,b,c,d:Point.  (half-plane-lt-angle(e;d;a;b;c) ∈ ℙ)

Lemma: hp-cong-angle-reflexive
e:EuclideanPlane. ∀a,b,c:Point.  (a leftof bc  abc ≅ρ abc)

Lemma: hp-cong-angle-trans
e:EuclideanPlane. ∀a,b,c,d,f:Point.  ((abc ≅ρ dbc ∧ dbc ≅ρ fbc)  abc ≅ρ fbc)

Lemma: hp-angles-not-lt-and-cong
e:EuclideanPlane. ∀a,b,c,d:Point.  ((abc ≅ρ dbc ∧ half-plane-lt-angle(e;d;a;b;c))  False)

Lemma: euclidean-plane-subtype-oriented
EuclideanPlane ⊆OrientedPlane

Lemma: geo-colinear-implies-between-or
e:EuclideanPlane. ∀a,b,c:Point.  (Colinear(a;b;c)  (¬¬((B(acb) ∨ B(bac)) ∨ B(abc))))

Definition: geo-SCS
SCS(a;b;c;d) ==  SC(SymmetricPoint(SC(a;b;c;d);a);b;c;d)

Lemma: geo-SCS_wf
[g:EuclideanPlane]
  ∀c,d,a:Point. ∀b:{b:Point| a ∧ B(cbd)} .
    (SCS(a;b;c;d) ∈ {v:Point| cv ≅ cd ∧ (B(vbSCO(a;b;c;d)) ∧ Colinear(a;b;v)) ∧ (b  SCO(a;b;c;d))} )

Lemma: geo-SCS-congruent
g:EuclideanPlane. ∀c,d,a:Point. ∀b:{b:Point| a ∧ B(cbd)} .  cSCS(a;b;c;d) ≅ cd

Lemma: use-SC
e:EuclideanPlane. ∀a,b,c,d:Point.
  (a  B(cbd)  (∃u,v:Point. (cu ≅ cd ∧ cv ≅ cd ∧ B(abu) ∧ (B(vbu) ∧ Colinear(a;b;v)) ∧ (b  u))))

Lemma: geo-three-segment
e:EuclideanPlane. ∀[a,b,c,A,B,C:Point].  (ac ≅ AC) supposing (bc ≅ BC and ab ≅ AB and B(ABC) and B(abc))

Lemma: geo-construction-unicity2
e:EuclideanPlane. ∀[Q,A,X,Y:Point].  (X ≡ Y) supposing (AY ≅ AX and B(QAX) and B(QAY) and A)

Lemma: geo-between-outer-trans-cpy
e:EuclideanPlane. ∀[a,b,c,d:Point].  (B(acd)) supposing (B(bcd) and B(abc) and c)

Lemma: geo-between-outer-trans2-cpy
e:EuclideanPlane. ∀[a,b,c,d:Point].  (B(abd)) supposing (B(bcd) and B(abc) and c)

Lemma: Euclid-Prop1
e:EuclideanPlane. ∀a,b:Point.  (a  (∃c:Point. EQΔ(c;b;a)))

Lemma: Euclid-Prop2-lemma
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀v:Point.  (∃x:Point [ax ≅ bv])

Definition: prop2-lemma
lemma2(a;b;c) ==  let = Δ(a;b) in let SCO(x;b;b;c) in SCS(a;x;x;u)

Lemma: Euclid-Prop2-lemma-ext
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀v:Point.  (∃x:Point [ax ≅ bv])

Lemma: Euclid-Prop2
e:EuclideanPlane. ∀a,b,c:Point.  (∃x:Point [ax ≅ bc])

Lemma: Euclid-Prop2-ext
e:EuclideanPlane. ∀a,b,c:Point.  (∃x:Point [ax ≅ bc])

Lemma: geo-extend-construction
e:EuclideanPlane. ∀q:Point. ∀a:{a:Point| a} . ∀b,c:Point.  (∃x:Point [(B(qax) ∧ ax ≅ bc)])

Lemma: geo-extend-construction-ext
e:EuclideanPlane. ∀q:Point. ∀a:{a:Point| a} . ∀b,c:Point.  (∃x:Point [(B(qax) ∧ ax ≅ bc)])

Definition: geo-extend
extend qa by bc ==
  SCO(q;a;a;if M(O;X;a) then if M(a;O;b) then lemma2(a;b;c) else lemma2(a;O;lemma2(O;b;c)) fi 
  if M(a;X;b) then lemma2(a;b;c)
  else lemma2(a;X;lemma2(X;b;c))
  fi )

Lemma: geo-extend_wf
e:EuclideanPlane. ∀q:Point. ∀a:{a:Point| a} . ∀b,c:Point.  (extend qa by bc ∈ {x:Point| B(qax) ∧ ax ≅ bc} )

Lemma: geo-extend-exists
e:EuclideanPlane. ∀q,a,b,c:Point.  (q  (∃x:Point. (B(qax) ∧ ax ≅ bc)))

Lemma: geo-extend-property1
e:BasicGeometry. ∀a:Point. ∀b:{b:Point| b} . ∀c,d:Point.  (bextend ab by cd ≅ cd ∧ (c  a-b-extend ab by cd))

Lemma: geo-extend-property
e:BasicGeometry. ∀a:Point. ∀b:{b:Point| b} . ∀c,d:Point.  (bextend ab by cd ≅ cd ∧ B(abextend ab by cd))

Lemma: geo-extend-exists1
e:BasicGeometry. ∀q,a,b,c:Point.  (q  (∃x:Point. ((b  q-a-x) ∧ ax ≅ bc)))

Lemma: geo-proper-extend-exists
e:BasicGeometry. ∀q,a,b,c:Point.  (q   (∃x:Point. (q-a-x ∧ ax ≅ bc)))

Lemma: geo-congruent-trivial
e:EuclideanPlane. ∀[a,b:Point].  aa ≅ bb

Lemma: geo-construction-unicity
e:BasicGeometry-. ∀[Q,A,X,Y:Point].  (X ≡ Y) supposing (AY ≅ AX and B(QAX) and B(QAY) and A)

Lemma: geo-construction-unicity-from-first
e:BasicGeometry-. ∀[Q,A,X,Y:Point].  (X ≡ Y) supposing (QY ≅ QX and B(QAX) and B(QAY) and A)

Lemma: geo-extend-equal-iff-congruent
e:BasicGeometry. ∀[a,b,c,d,c',d':Point].  uiff(extend ab by cd ≡ extend ab by c'd';cd ≅ c'd') supposing b

Lemma: geo-extend_functionality
[e:BasicGeometry]. ∀[a:Point]. ∀[b:{b:Point| b} ]. ∀[c,d,a':Point]. ∀[b':{b':Point| a' b'} ]. ∀[c',d':Point].
  (extend ab by cd ≡ extend a'b' by c'd') supposing (a ≡ a' and b ≡ b' and c ≡ c' and d ≡ d')

Lemma: geo-between-outer-trans
e:BasicGeometry-. ∀[a,b,c,d:Point].  (B(acd)) supposing (B(bcd) and B(abc) and c)

Lemma: geo-between-outer-trans2
e:BasicGeometry-. ∀[a,b,c,d:Point].  (B(abd)) supposing (B(bcd) and B(abc) and c)

Lemma: geo-strict-between-trans3
e:BasicGeometry. ∀a,b,c,d:Point.  (a-b-c  b-c-d  a-c-d)

Lemma: geo-between-exchange4
e:BasicGeometry-. ∀[a,b,c,d:Point].  (B(abd)) supposing (B(acd) and B(abc))

Definition: geo-length
|s| ==  extend OX by geo-seg1(s)geo-seg2(s)

Lemma: geo-length_wf1
[e:BasicGeometry]. ∀[s:geo-segment(e)].  (|s| ∈ {p:Point| B(OXp)} )

Lemma: geo-length_wf
[e:BasicGeometry]. ∀[s:geo-segment(e)].  (|s| ∈ Length)

Lemma: length-seg-eq
[e:BasicGeometry]. ∀[a,b:Point].  |ab| ≡ |ab|

Definition: geo-add-length
==  extend Op by Xq

Lemma: geo-add-length_wf1
[e:BasicGeometry]. ∀[x,y:{p:Point| B(OXp)} ].  (x y ∈ {p:Point| B(OXp)} )

Lemma: geo-add-length_functionality
[e:BasicGeometry]. ∀[x,y,x',y':{p:Point| B(OXp)} ].  (x y ≡ x' y') supposing (x ≡ x' and y ≡ y')

Lemma: geo-add-length_wf
[e:BasicGeometry]. ∀[x,y:Length].  (x y ∈ Length)

Definition: geo-le
p ≤ ==  ↓∃p',q':{p:Point| B(OXp)} ((p' p ∈ Length) ∧ (q' q ∈ Length) ∧ B(Xp'q'))

Lemma: geo-le_wf
[e:BasicGeometry]. ∀[p,q:Length].  (p ≤ q ∈ ℙ)

Lemma: geo-le_witness
[e:BasicGeometry]. ∀[p,q:{p:Point| B(OXp)} ].  Ax ∈ p ≤ supposing B(Xpq)

Lemma: sq_stable__geo-le
[e:BasicGeometry]. ∀[p,q:Length].  SqStable(p ≤ q)

Definition: geo_ge
geo_ge(e; p; q) ==  q ≤ p

Lemma: geo_ge_wf
[e:BasicGeometry]. ∀[p,q:Length].  (geo_ge(e; p; q) ∈ ℙ)

Lemma: geo-le_weakening
[e:BasicGeometry]. ∀[p,q:Length].  p ≤ supposing q ∈ Length

Lemma: geo-le-same
[e:BasicGeometry]. ∀[p:Length].  p ≤ p

Lemma: geo-le_imp
e:BasicGeometry. ∀p,q:{p:Point| B(OXp)} .  B(Xpq) supposing p ≤ q

Lemma: geo-le_transitivity
e:BasicGeometry. ∀[p,q,r:Length].  (p ≤ r) supposing (q ≤ and p ≤ q)

Lemma: geo-le_functionality_wrt_implies
[e:BasicGeometry]. ∀[a,b,c,d:Length].  ({a ≤ supposing b ≤ c}) supposing (c ≤ and geo_ge(e; b; a))

Lemma: geo-le-add1
e:BasicGeometry. ∀[p,q:Length].  p ≤ q

Lemma: geo-seg-congruent-iff-length
e:BasicGeometry. ∀[s,t:geo-segment(e)].  uiff(geo-seg-congruent(e; s; t);|s| ≡ |t|)

Lemma: geo-congruent-iff-length
e:BasicGeometry. ∀[a,b,c,d:Point].  uiff(ab ≅ cd;|ab| |cd| ∈ Length)

Lemma: geo-length-equality
e:BasicGeometry. ∀p':{p:Point| B(OXp)} .  (|Xp'| p' ∈ Length)

Lemma: geo-length_functionality
e:BasicGeometry. ∀[a,b,c,d:Point].  (|ab| |cd| ∈ Length) supposing (b ≡ and a ≡ c)

Lemma: geo-length-flip-eq
e:BasicGeometry. ∀[a,b:Point].  |ab| ≡ |ba|

Lemma: geo-length-flip
e:BasicGeometry. ∀[a,b:Point].  (|ab| |ba| ∈ Length)

Lemma: geo-zero-length-iff
e:BasicGeometry. ∀a,b:Point.  (|ab| 0 ∈ Length ⇐⇒ a ≡ b)

Lemma: trivial-zero-length
[e:BasicGeometry]. ∀[a:Point].  (|aa| 0 ∈ Length)

Lemma: trivial-lengths-equal
[e:BasicGeometry]. ∀[a,b:Point].  (|aa| |bb| ∈ Length)

Lemma: geo-ge-trivial2
[g:BasicGeometry]. ∀[a,b,c:Point].  ab ≥ cc

Lemma: geo-add-length-comm
[e:BasicGeometry]. ∀[x,y:Length].  (x x ∈ Length)

Lemma: geo-add-length-zero
[e:BasicGeometry]. ∀[x:Length].  (x x ∈ Length)

Lemma: geo-length-null-segment
[e:BasicGeometry]. ∀[a:Point].  (|aa| X ∈ Length)

Lemma: geo-le-null-segment
e:BasicGeometry. ∀[p:Length]. ∀[a:Point].  uiff(p ≤ |aa|;p |aa| ∈ Length)

Lemma: geo-le-zero
e:BasicGeometry. ∀[p:Length]. uiff(p ≤ 0;p 0 ∈ Length)

Lemma: geo-zero-le
e:BasicGeometry. ∀[p:Length]. 0 ≤ p

Lemma: geo-add-length-zero2
[e:BasicGeometry]. ∀[x:Length]. ∀[a:Point].  (x |aa| x ∈ Length)

Lemma: geo-add-length-zero3
[e:BasicGeometry]. ∀[x:Length]. ∀[a:Point].  (|aa| x ∈ Length)

Lemma: geo-add-length-between
[e:BasicGeometry]. ∀[a,b,c:Point].  |ac| |ab| |bc| ∈ Length supposing B(abc)

Lemma: geo-add-length-assoc
[e:BasicGeometry]. ∀[x,y,z:Length].  (x z ∈ Length)

Lemma: geo-add-length-cancel-left
[e:BasicGeometry]. ∀[x,y,z:Length].  y ∈ Length supposing y ∈ Length

Lemma: geo-add-length-cancel-right
[e:BasicGeometry]. ∀[x,y,z:Length].  y ∈ Length supposing z ∈ Length

Lemma: geo-add-length-implies-eq-zero
[e:BasicGeometry]. ∀[x,y:Length].  0 ∈ Length supposing y ∈ Length

Lemma: geo-add-length-implies-eq
[e:BasicGeometry]. ∀[x:Length]. ∀[a,b:Point].  a ≡ supposing |ab| ∈ Length

Lemma: geo-add-length-is-zero
e:BasicGeometry. ∀x,y:Length.  (x 0 ∈ Length ⇐⇒ (x 0 ∈ Length) ∧ (y 0 ∈ Length))

Lemma: geo-add-length-implies-eq2
[e:BasicGeometry]. ∀[x:Length]. ∀[a,b:Point].  a ≡ supposing |ab| |ab| ∈ Length

Lemma: geo-congruent-between-implies-equal
e:BasicGeometry. ∀[a,b,c,x:Point].  (b ≡ x) supposing (B(abc) and ab ≅ ax and bc ≅ xc)

Lemma: geo-gt-irrefl
e:EuclideanPlane. ∀a,b:Point.  ab > ab)

Lemma: geo-between-congruent
e:BasicGeometry. ∀a,b,c:Point.  (B(abc)  ac ≅ ab  c ≡ b)

Lemma: geo-congruent-between-exists
e:BasicGeometry. ∀a,b,c,a',c':Point.
  (a  (∃b':Point. (B(a'b'c') ∧ ab ≅ a'b' ∧ bc ≅ b'c')) supposing (B(abc) and ac ≅ a'c'))

Lemma: geo-congruent-between-exists2
e:BasicGeometry. ∀a,b,c,a',c':Point.
  (a  (∃b':Point. (B(a'b'c') ∧ ab ≅ a'b' ∧ bc ≅ b'c')) supposing (B(abc) and ac ≅ a'c'))

Lemma: geo-congruent-preserves-gt
e:BasicGeometry. ∀a,b,c,d,a',b',c',d':Point.  (ab > cd  ab ≅ a'b'  cd ≅ c'd'  a'b' > c'd')

Lemma: geo-congruent-strictbetween-exists
e:BasicGeometry. ∀a,b,c,a',c':Point.  (a-b-c  ac ≅ a'c'  (∃b':Point. ((a'-b'-c' ∧ ab ≅ a'b') ∧ bc ≅ b'c')))

Lemma: geo-congruent-preserves-between
e:BasicGeometry. ∀[a,b,c,a',b',c':Point].  (B(a'b'c')) supposing (bc ≅ b'c' and ac ≅ a'c' and ab ≅ a'b' and B(abc))

Lemma: geo-gt-trans
e:EuclideanPlane. ∀a,b,c,d,x,y:Point.  (ab > cd  cd > xy  ab > xy)

Lemma: geo-gt-implies-point
e:EuclideanPlane. ∀a,b,c,d:Point.  (ab > cd   (¬¬(∃f:Point. (c-d-f ∧ cf ≅ ab))))

Lemma: geo-gt-implies-point2
e:EuclideanPlane. ∀a,b,c,d:Point.  (ab > cd   (∃f:Point. (B(cdf) ∧ cf ≅ ab)))

Lemma: geo-congruent-preserves-strict-between
e:BasicGeometry. ∀a,b,c,a',b',c':Point.  (a-b-c  ab ≅ a'b'  ac ≅ a'c'  bc ≅ b'c'  a'-b'-c')

Lemma: geo-congruent-preserves-colinear
e:BasicGeometry
  ∀[a,b,c,a',b',c':Point].  (Colinear(a';b';c')) supposing (bc ≅ b'c' and ac ≅ a'c' and ab ≅ a'b' and Colinear(a;b;c))

Lemma: congruence-preserves-between_symmetric-points
e:BasicGeometry. ∀a,b,c,b',c':Point.
  (B(abc)  Colinear(a;c;c')  ab ≅ ab'  ac ≅ ac'  b'-a-b  c'  B(ab'c'))

Lemma: congruence-preserves-between_symmetric-points2
e:BasicGeometry. ∀a,b,c,b',c':Point.
  (B(abc)  Colinear(a;c;c')  ab ≅ ab'  ac ≅ ac'  b'-a-b  (B(ab'c') ∨ B(abc')))

Lemma: geo-colinear-five-segment
e:BasicGeometry
  ∀[a,b,c,d,A,B,C,D:Point].
    (cd ≅ CD) supposing (bd ≅ BD and ad ≅ AD and bc ≅ BC and ab ≅ AB and ac ≅ AC and Colinear(a;b;c) and b)

Lemma: geo-colinear-equidistant
e:BasicGeometry. ∀[a,b,c,p,q:Point].  (cp ≅ cq) supposing (ap ≅ aq and bp ≅ bq and Colinear(a;b;c) and b)

Lemma: not-not-double-pasch
e:BasicGeometry. ∀a,b,c,a',b',p:Point.  (B(abc)  B(a'b'c)  B(apa')  (¬¬(∃q:Point. (B(pqc) ∧ B(bqb')))))

Lemma: geo-between-same-side
e:BasicGeometry. ∀[A,B,C,D:Point].  ((¬B(ACD)) ∧ B(ADC)))) supposing (A and B(ABC) and B(ABD))

Lemma: geo-between-same-side-or
e:BasicGeometry. ∀A,B,C,d:Point.  ((A B ∧ d)  B(ABC)  B(ABd)  (B(ACd) ∨ B(AdC)))

Lemma: geo-between-same-side2
e:BasicGeometry. ∀[A,B,C,D:Point].  ((¬B(BCD)) ∧ B(BDC)))) supposing (A and B(ABC) and B(ABD))

Lemma: geo-between-same-side2-or
e:BasicGeometry. ∀[A,B,C,D:Point].  (¬¬(B(BCD) ∨ B(BDC))) supposing (A and B(ABC) and B(ABD))

Lemma: geo-between-same-side2-or-strong
e:BasicGeometry. ∀A,B,C,d:Point.  ((A B ∧ d)  B(ABC)  B(ABd)  (B(BCd) ∨ B(BdC)))

Lemma: geo-ge-symmetry
e:EuclideanPlane. ∀a,b,c,d:Point.  (ab ≥ cd  {ba ≥ cd ∧ ab ≥ dc ∧ ba ≥ dc})

Lemma: geo-strict-between-same-side
e:BasicGeometry. ∀[A,B,C,D:Point].  ((¬A-C-D) ∧ A-D-C))) supposing (C and A-B-C and A-B-D)

Lemma: geo-strict-between-same-side2
e:BasicGeometry. ∀[A,B,C,D:Point].  ((¬B-C-D) ∧ B-D-C))) supposing (C and A-B-C and A-B-D)

Lemma: geo-colinear-sep-cases
e:BasicGeometry. ∀a,b,c:Point.  (a  Colinear(a;b;c)  ((¬((¬B(acb)) ∧ B(abc)))) ∨ ((¬B(bca)) ∧ B(bac))))))

Lemma: geo-le-cases
e:BasicGeometry. ∀[p,q:Length].  (¬¬(p ≤ q ∨ q ≤ p))

Lemma: geo-le-iff
e:BasicGeometry. ∀A,B,C,P:Point.  (|AB| ≤ |CP| ⇐⇒ CP ≥ AB)

Lemma: stable__geo-le
e:BasicGeometry. ∀x,y:Length.  Stable{x ≤ y}

Lemma: geo-add-length_functionality_wrt_le
[e:BasicGeometry]. ∀[x,y,x',y':Length].  (x y ≤ x' y') supposing (x ≤ x' and y ≤ y')

Lemma: geo-add-length_functionality_wrt_cong
e:BasicGeometry. ∀x,y,x',y':Length.  ((x x' ∈ Length)  (y y' ∈ Length)  (x x' y' ∈ Length))

Lemma: geo-le-from-be
[e:BasicGeometry]. ∀[a,b,c:Point].  |ab| ≤ |ac| supposing B(abc)

Lemma: geo-le-sep
e:BasicGeometry. ∀A,B,C,P:Point.  (|AB| ≤ |CP|   P)

Lemma: geo-add-length-cancel-left-le
[e:BasicGeometry]. ∀[x,y,z:Length].  x ≤ supposing x ≤ y

Lemma: geo-add-length-le-implies-eq
[e:BasicGeometry]. ∀[x:Length]. ∀[a,b:Point].  a ≡ supposing |ab| ≤ x

Lemma: triangle-inequality-for-colinear
[e:EuclideanPlane]. ∀[a,b,c:Point].  (Colinear(b;a;c)  |ac| ≤ |ab| |bc|)

Definition: geo-lt
p < ==  ∃a,b:Point. (a b ∧ |ab| ≤ q)

Lemma: geo-lt_wf
[e:BasicGeometry]. ∀[p,q:Length].  (p < q ∈ ℙ)

Lemma: geo-le_weakening-lt
[e:BasicGeometry]. ∀[p,q:Length].  p ≤ supposing p < q

Lemma: geo-le-cases2
e:BasicGeometry. ∀[p,q:Length].  (¬¬((p < q ∨ q < p) ∨ (p q ∈ Length)))

Lemma: geo-lt-irrefl
[e:BasicGeometry]. ∀[p:Length].  False supposing p < p

Lemma: geo-lt_transitivity
e:BasicGeometry. ∀p,q,r:Length.  (p ≤  q <  p < r)

Lemma: geo-lt_transitivity2
e:BasicGeometry. ∀p,q,r:Length.  (p <  q ≤  p < r)

Lemma: geo-cong-preserves-lt
e:BasicGeometry. ∀p,q,p1,q1:Length.  (p <  (p p1 ∈ Length)  (q q1 ∈ Length)  p1 < q1)

Lemma: geo-gt-implies-lt
g:EuclideanPlane. ∀a,b,c,d:Point.  (ab > cd  (¬¬|cd| < |ab|))

Lemma: geo-lt-irrefl2
e:BasicGeometry. ∀p,q,r:Length.  (p <  r <  False)

Lemma: not-lt-and-eq
[e:BasicGeometry]. ∀[p,q:Length].  ((p q ∈ Length)  q <  False)

Lemma: not-lt-and-symm-le
[e:BasicGeometry]. ∀[p,q:Length].  (p ≤  q <  False)

Lemma: geo-lt_functionality_wrt_implies
e:BasicGeometry. ∀a,b,c,d:Length.  (geo_ge(e; b; a)  c ≤  {b <  a < d})

Lemma: geo-zero-lt-iff
e:BasicGeometry. ∀u,v:Point.  (0 < |uv| ⇐⇒ v)

Lemma: geo-lt-sep
e:BasicGeometry. ∀a,b,c,d:Point.  (|ab| < |cd|  d)

Lemma: geo-lt-null-segment
e:BasicGeometry. ∀[p:Length]. ∀[a:Point].  uiff(p < |aa|;False)

Lemma: geo-lt-null-segment2
e:BasicGeometry. ∀[p:Length]. ∀[a,b:Point].  (False) supposing (a ≡ and p < |ab|)

Lemma: geo-add-length_functionality_wrt_lt
[e:BasicGeometry]. ∀[x,y,x',y':Length].  (y ≤ y'  x < x'  y < x' y')

Lemma: geo-add-length-cancel-left-lt
[e:BasicGeometry]. ∀[x,y,z:Length].  (z x <  x < y)

Lemma: geo-add-length-cancel-right-lt
[e:BasicGeometry]. ∀[x,y,z:Length].  (z x <  z < y)

Lemma: geo-add-length-cancel-left-lt2
e:BasicGeometry. ∀y,z:Length.  (z < ⇐⇒ 0 < y)

Lemma: geo-add-length-cancel-left-lt3
e:BasicGeometry. ∀y,z:Length.  (z < ⇐⇒ z < y)

Lemma: geo-lt-from-strict-between
e:EuclideanPlane. ∀a,b,c:Point.  (a-b-c  |ab| < |ac|)

Lemma: geo-colinear-same-side
e:BasicGeometry. ∀[A,B,C,D:Point].  (Colinear(B;C;D)) supposing (A and B(ABC) and B(ABD))

Lemma: geo-colinear-same-side2
e:BasicGeometry. ∀[A,B,C,D:Point].  (Colinear(A;C;D)) supposing (A and B(ABC) and B(ABD))

Lemma: geo-colinear-between
e:BasicGeometry. ∀[A,B,C,D:Point].  (Colinear(A;C;D)) supposing (A and and B(ACB) and B(ADB))

Lemma: geo-colinear-between2
e:BasicGeometry. ∀[A,B,C,D:Point].  (Colinear(B;C;D)) supposing (B and and B(ACB) and B(ADB))

Lemma: geo-between-middle
e:BasicGeometry. ∀a,b,c,d:Point.  (a  B(abd)  B(acd)  ((¬B(bcd)) ∧ B(cbd)))))

Lemma: geo-between-middle2
e:BasicGeometry. ∀a,b,c,d:Point.  (a  B(abd)  B(acd)  (¬¬(B(bcd) ∨ B(cbd))))

Lemma: colinear-transitivity-2
e:BasicGeometry. ∀p,q,a,b:Point.  (p  Colinear(p;q;a)  Colinear(p;q;b)  Colinear(p;a;b))

Lemma: geo-colinear-from-between
e:BasicGeometry. ∀[A,C,D:Point].  (A  (∃B:Point. (A B ∧ B(ACB) ∧ B(ADB)))  Colinear(A;C;D))

Lemma: geo-colinear-cons
e:BasicGeometry. ∀L:Point List. ∀A:Point.
  (geo-colinear-set(e; [A L]) ⇐⇒ geo-colinear-set(e; L) ∧ (∀B∈L.(∀C∈L.Colinear(A;B;C))))

Lemma: test-prove-separated
e:BasicGeometry. ∀A,B,C,X,Y,Z,W,U,V:Point.
  ((A B ∨ A-X-B ∨ B-X-A)  (B(ABC) ∨ B(CBA))  (B(YCA) ∨ B(ACY))  (ZW ≅ AY ∨ ZW ≅ YA)  ZW ≅ UV  V)

Lemma: geo-intersection-unicity
e:BasicGeometry. ∀a,b,c,d,p,q:Point.
  ((¬Colinear(a;b;c))   Colinear(a;b;p)  Colinear(a;b;q)  Colinear(c;d;p)  Colinear(c;d;q)  p ≡ q)

Lemma: test-colinear-sets
e:BasicGeometry. ∀A,B,C,X,Y,Z,W,U,V:Point.  (A  Colinear(A;B;X)  B(ABC)  B(YCA)   Colinear(C;Y;X))

Lemma: geo-add-length-between-iff
e:BasicGeometry. ∀[a,b,c:Point].  uiff(B(abc);|ac| |ab| |bc| ∈ Length)

Lemma: geo-seg-length-test
e:BasicGeometry. ∀[a,b,c,d,x,y:Point].  (ba ≅ xy) supposing (dc ≅ yx and ab ≅ cd)

Lemma: geo-seg-length-test-ext
e:BasicGeometry. ∀[a,b,c,d,x,y:Point].  (ba ≅ xy) supposing (dc ≅ yx and ab ≅ cd)

Definition: geo-le-pt
ab≤cd ==  ∃y:Point. (B(cyd) ∧ ab ≅ cy)

Lemma: geo-le-pt_wf
[e:EuclideanPlaneStructure]. ∀[a,b,c,d:Point].  (ab≤cd ∈ ℙ)

Lemma: geo-le-pt-from-be
e:BasicGeometry. ∀a,b,c:Point.  ab≤ac supposing B(abc)

Definition: geo-tri
Triangle(a;b;c) ==  b ∧ c ∧ a

Lemma: geo-tri_wf
e:BasicGeometry. ∀[a,b,c:Point].  (Triangle(a;b;c) ∈ ℙ)

Definition: geo-pt-sep-from-line
geo-pt-sep-from-line(e; x; a; b) ==
  (a x ∧ x) ∧ (∀y:Point. (((y-a-b  x) ∧ (a-b-y  x)) ∧ (b-y-a  x)))

Lemma: geo-pt-sep-from-line_wf
[e:BasicGeometry]. ∀[a,b,x:Point].  (geo-pt-sep-from-line(e; x; a; b) ∈ ℙ)

Definition: geo-opp-side
P-AB-Q ==  (∀T:Point. (B(PTQ)  Colinear(A;B;T))))) ∧ Colinear(A;B;P)) ∧ Colinear(A;B;Q))

Lemma: geo-opp-side_wf
[e:BasicGeometry]. ∀[A,B,P,Q:Point].  (P-AB-Q ∈ ℙ)

Lemma: geo-opp-side-trivial
[e:BasicGeometry]. ∀[A,P,Q:Point].  P-AA-Q)

Lemma: geo-opp-side_functionality
[e:BasicGeometry]. ∀[A,B,P,Q,A',B',P',Q':Point].  (A ≡ A'  B ≡ B'  P ≡ P'  Q ≡ Q'  (P-AB-Q ⇐⇒ P'-A'B'-Q'))

Lemma: stable__geo-opp-side
[e:BasicGeometry]. ∀[A,B,P,Q:Point].  Stable{P-AB-Q}

Definition: geo-same-side
A,B-PQ ==  ∀T:Point. (B(ATB)  Colinear(P;Q;T)))

Lemma: geo-same-side_wf
[e:BasicGeometry]. ∀[A,B,P,Q:Point].  (P,Q-AB ∈ ℙ)

Lemma: geo-same-side-iff
[e:BasicGeometry]. ∀[A,B,P,Q:Point].
  (P,Q-AB ⇐⇒ ((¬Colinear(A;B;P)) ∧ Colinear(A;B;Q))) ∧ leftof AB ⇐⇒ ¬leftof AB))

Lemma: geo-opp-side-iff
[e:BasicGeometry]. ∀[A,B,P,Q:Point].
  (P-AB-Q ⇐⇒ ((¬Colinear(A;B;P)) ∧ Colinear(A;B;Q))) ∧ leftof AB ⇐⇒ ¬leftof BA))

Lemma: geo-opp-side-sym
e:BasicGeometry. ∀a,b,p,q:Point.  (a-pq-b  b-pq-a)

Lemma: geo-opp-side-sym2
e:BasicGeometry. ∀a,b,p,q:Point.  (a-pq-b  a-qp-b)

Lemma: geo-5segSAS
e:BasicGeometry. ∀a,b,c,f,g,A,B,C,F,G:Point.
  (af ≅ AF ∧ fb ≅ FB ∧ bc ≅ BC ∧ ag ≅ AG ∧ gc ≅ GC)  fg ≅ FG supposing B(afb) ∧ B(agc) ∧ B(AFB) ∧ B(AGC)

Definition: geo-sep-line
geo-sep-line(e;a;b;c) ==  ∀z:Point. (Colinear(z;b;c)  z)

Lemma: geo-sep-line_wf
[e:BasicGeometry]. ∀[a,b,c:Point].  (geo-sep-line(e;a;b;c) ∈ ℙ)

Definition: geo-same-line
line(a;b)=line(c;d) ==  Colinear(a;b;c) ∧ Colinear(a;b;d)

Lemma: geo-same-line_wf
[e:BasicGeometry]. ∀[a,b,c,d:Point].  (line(a;b)=line(c;d) ∈ ℙ)

Lemma: geo-same-line-symmetry
[e:BasicGeometry]. ∀[a:Point]. ∀[b:{b:Point| b} ]. ∀[c:Point]. ∀[d:{d:Point| d} ].
  (line(a;b)=line(c;d)  line(c;d)=line(a;b))

Lemma: geo-same-line-transitivity
[e:BasicGeometry]. ∀[a:Point]. ∀[b:{b:Point| b} ]. ∀[c:Point]. ∀[d:{d:Point| d} ]. ∀[x:Point]. ∀[y:{y:Point| 
                                                                                                           y} ].
  (line(a;b)=line(c;d)  line(c;d)=line(x;y)  line(a;b)=line(x;y))

Lemma: geo-same-line-reflexive
[e:BasicGeometry]. ∀[a,b:Point].  line(a;b)=line(a;b)

Definition: geo-tar-opp-side
geo-tar-opp-side(e;a;b;p;q) ==  (a pq ∧ pq) ∧ (∃t:Point. (Colinear(p;q;t) ∧ B(atb)))

Lemma: geo-tar-opp-side_wf
[e:BasicGeometry]. ∀[A,B,P,Q:Point].  (geo-tar-opp-side(e;A;B;P;Q) ∈ ℙ)

Lemma: geo-tar-opp-side-invariant
e:BasicGeometry. ∀A,B,P,Q,C,D:Point.
  (C  Colinear(C;P;Q)  Colinear(D;P;Q)  geo-tar-opp-side(e;A;B;P;Q)  geo-tar-opp-side(e;A;B;C;D))

Lemma: geo-tar-opp-side-iff
e:BasicGeometry. ∀A,B,P,Q:Point.  (geo-tar-opp-side(e;P;Q;A;B) ⇐⇒ AB ∧ AB ∧ (P leftof AB ⇐⇒ leftof BA))

Definition: geo-tar-same-side
geo-tar-same-side(e;a;b;p;q) ==  ∃c:Point. (geo-tar-opp-side(e;a;c;p;q) ∧ geo-tar-opp-side(e;b;c;p;q))

Lemma: geo-tar-same-side_wf
[e:BasicGeometry]. ∀[a,b,p,q:Point].  (geo-tar-same-side(e;a;b;p;q) ∈ ℙ)

Lemma: geo-tar-same-side-iff
e:BasicGeometry. ∀A,B,P,Q:Point.  (geo-tar-same-side(e;P;Q;A;B) ⇐⇒ AB ∧ AB ∧ (P leftof AB ⇐⇒ leftof AB))

Lemma: geo-tar-same-side-invariant
e:BasicGeometry. ∀A,B,P,Q,C,D:Point.
  (C  Colinear(C;P;Q)  Colinear(D;P;Q)  geo-tar-same-side(e;A;B;P;Q)  geo-tar-same-side(e;A;B;C;D))

Lemma: geo-tar-opp-side-symmetry
e:BasicGeometry. ∀a,b,c,d:Point.  (geo-tar-opp-side(e;a;b;c;d)  geo-tar-opp-side(e;b;a;c;d))

Lemma: 2opp-side-implies-same-side
e:BasicGeometry. ∀a,c,d,p,q:Point.
  (((geo-tar-opp-side(e;a;d;p;q) ∧ geo-tar-opp-side(e;c;d;p;q)) ∧ c)  geo-tar-same-side(e;a;c;p;q))

Definition: geo-cong-angle
abc ≅a xyz ==
  (((a b ∧ c) ∧ y) ∧ z)
  ∧ (∃a',c',x',z':Point. (B(baa') ∧ B(bcc') ∧ B(yxx') ∧ B(yzz') ∧ ba' ≅ yx' ∧ bc' ≅ yz' ∧ a'c' ≅ x'z'))

Lemma: geo-cong-angle_wf
[e:BasicGeometry]. ∀[a,b,c,x,y,z:Point].  (abc ≅a xyz ∈ ℙ)

Definition: tar-cong-angle
TAabc=TAxyz ==
  b
  ∧ b
  ∧ y
  ∧ y
  ∧ (∃a',c',x',z':Point
      (((B(baa') ∧ B(bcc') ∧ B(yxx') ∧ B(yzz') ∧ aa' ≅ yx ∧ cc' ≅ yz ∧ a'c' ≅ x'z') ∧ xx' ≅ ba) ∧ zz' ≅ bc))

Lemma: tar-cong-angle_wf
[e:BasicGeometry]. ∀[a,b,c,x,y,z:Point].  (TAabc=TAxyz ∈ ℙ)

Lemma: geo-cong-angle-refl
e:BasicGeometry. ∀a,b,c:Point.  (a   abc ≅a abc)

Lemma: geo-cong-angle-symm
e:BasicGeometry. ∀a,b,c:Point.  ((a b ∧ b)  abc ≅a cba)

Lemma: geo-cong-angle-symm2
e:BasicGeometry. ∀a,b,c,x,y,z:Point.  (xyz ≅a abc  abc ≅a xyz)

Lemma: geo-cong-angle-symm3
e:BasicGeometry. ∀x,y,z,a,b,c:Point.  (xyz ≅a abc  zyx ≅a cba)

Definition: geo-bisect-angle
geo-bisect-angle(e;a;b;c) ==  b ∧ c ∧ (∃d:Point. (d a ∧ c ∧ abd ≅a dbc))

Lemma: geo-bisect-angle_wf
e:BasicGeometry. ∀a,b,c:Point.  (geo-bisect-angle(e;a;b;c) ∈ ℙ)

Definition: geo-cong-tri
Cong3(abc,a'b'c') ==  ab ≅ a'b' ∧ bc ≅ b'c' ∧ ca ≅ c'a'

Lemma: geo-cong-tri_wf
[e:BasicGeometry]. ∀[a,b,c,a',b',c':Point].  (Cong3(abc,a'b'c') ∈ ℙ)

Lemma: geo-cong-tri-symmetry
[e:BasicGeometry]. ∀[a,b,c,a',b',c':Point].  Cong3(bca,b'c'a') supposing Cong3(abc,a'b'c')

Lemma: geo-bet-sep-cong-tri-exists
e:BasicGeometry. ∀a,b,c,a',c':Point.
  (a  (∃b':Point. (B(a'b'c') ∧ Cong3(abc,a'b'c'))) supposing (B(abc) and ac ≅ a'c'))

Lemma: geo-between-cong-tri-exists
[e:BasicGeometry]. ∀[a,b,c,a',c':Point].
  (B(abc)  ac ≅ a'c'  (¬¬(∃b':Point. (Cong3(abc,a'b'c') ∧ Colinear(a';b';c')))))

Lemma: geo-colinear-cong-tri-exists
[e:BasicGeometry]. ∀[a,b,c,a',c':Point].
  (Colinear(a;b;c)  ac ≅ a'c'  (¬¬(∃b':Point. (Cong3(abc,a'b'c') ∧ Colinear(a';b';c')))))

Lemma: cong-tri-implies-cong-angle
e:BasicGeometry. ∀a,b,c,x,y,z:Point.  (Cong3(abc,xyz)      abc ≅a xyz)

Lemma: cong-tri-implies-all-cong-angle
e:BasicGeometry. ∀a,b,c,x,y,z:Point.
  (Cong3(abc,xyz)        {abc ≅a xyz ∧ bca ≅a yzx ∧ cab ≅a zxy})

Lemma: cong-tri-implies-cong-angle2
e:BasicGeometry. ∀a,b,c,x,y,z:Point.  (a   ab ≅ xy  bc ≅ yz  ca ≅ zx  abc ≅a xyz)

Definition: geo-out-strict
geo-out-strict(e;p;a;b) ==  ¬((¬p-a-b) ∧ p-b-a))

Lemma: geo-out-strict_wf
[e:BasicGeometry]. ∀[p,a,b:Point].  (geo-out-strict(e;p;a;b) ∈ ℙ)

Lemma: stable__geo-out-strict
[e:BasicGeometry]. ∀[a,b:Point].  ∀p:Point. Stable{geo-out-strict(e;p;a;b)}

Lemma: geo-out-strict_functionality
e:BasicGeometry. ∀p,a,b,p',a',b':Point.
  (p ≡ p'  a ≡ a'  b ≡ b'  {geo-out-strict(e;p;a;b) ⇐⇒ geo-out-strict(e;p';a';b')})

Lemma: geo-out-strict_inversion
e:BasicGeometry. ∀a,b,c:Point.  (geo-out-strict(e;a;b;c)  geo-out-strict(e;a;c;b))

Lemma: geo-out-strict_weakening
e:BasicGeometry. ∀a,b,c:Point.  (Colinear(a;b;c)  B(cab))    geo-out-strict(e;a;b;c))

Lemma: geo-out-strict_transitivity
e:BasicGeometry. ∀a,b,c,d:Point.
  (b  geo-out-strict(e;a;b;c)  geo-out-strict(e;a;c;d)  geo-out-strict(e;a;b;d))

Lemma: geo-out-strict-colinear
e:BasicGeometry. ∀a,b,c:Point.  (geo-out-strict(e;a;b;c)  Colinear(a;b;c))

Definition: geo-out
out(p ab) ==  a ∧ b ∧ ((¬B(pab)) ∧ B(pba))))

Lemma: geo-out_wf
[e:BasicGeometry]. ∀[p,a,b:Point].  (out(p ab) ∈ ℙ)

Lemma: sq_stable__geo-out
e:BasicGeometry. ∀p,a,b:Point.  SqStable(out(p ab))

Lemma: geo-out_functionality
e:BasicGeometry. ∀p,a,b,p',a',b':Point.  (p ≡ p'  a ≡ a'  b ≡ b'  {out(p ab) ⇐⇒ out(p' a'b')})

Lemma: geo-out_inversion
e:BasicGeometry. ∀a,b,c:Point.  (out(a bc)  out(a cb))

Lemma: geo-out_weakening
e:BasicGeometry. ∀a,b,c:Point.  (a  b ≡  out(a bc))

Lemma: geo-out_transitivity
e:BasicGeometry. ∀a,b,c,d:Point.  (out(a bc)  out(a cd)  out(a bd))

Lemma: geo-between-out
e:BasicGeometry. ∀a,b,c:Point.  (a   B(abc)  out(a bc))

Lemma: geo-out-distinct
e:BasicGeometry. ∀a,b,c:Point.  (out(a bc)  {a b ∧ c})

Lemma: geo-out-trivial
e:BasicGeometry. ∀a,b:Point.  (a  out(a bb))

Lemma: geo-out-colinear
e:BasicGeometry. ∀a,b,c:Point.  (out(a bc)  Colinear(a;b;c))

Lemma: not-lsep-if-out
g:EuclideanPlane. ∀a,b,c:Point.  (out(b ac)  bc))

Lemma: not-out-if-lsep
g:EuclideanPlane. ∀a,b,c:Point.  (a bc  out(b ac)))

Lemma: geo-out-iff-between1
e:BasicGeometry. ∀p,a,b,c:Point.  (p    B(apc)  (B(bpc) ⇐⇒ out(p ab)))

Lemma: geo-out-if-between
e:BasicGeometry. ∀p,a,b,c:Point.  (a-p-c  b-p-c  out(p ab))

Lemma: geo-out-iff-colinear
e:BasicGeometry. ∀p,a,b:Point.  (out(p ab) ⇐⇒ (Colinear(p;a;b) ∧ B(apb))) ∧ a ∧ b)

Lemma: geo-out-iff-exists
e:BasicGeometry. ∀p,a,b:Point.  (out(p ab) ⇐⇒ (∃c:Point. (p c ∧ B(apc) ∧ B(bpc))) ∧ a ∧ b)

Lemma: geo-between-implies-out
e:BasicGeometry. ∀p,a,b:Point.  ((∃c:Point. (p c ∧ B(pca) ∧ B(pcb)))  out(p ab))

Lemma: geo-between-implies-out2
e:BasicGeometry. ∀p,a,b,c:Point.  (p  B(pca)  B(pcb)  out(p ab))

Lemma: geo-between-implies-out3
e:BasicGeometry. ∀p,a,b,c:Point.  (p-b-a  p-c-a  out(p bc))

Lemma: geo-strict-between-implies-out
e:BasicGeometry. ∀a,b,c:Point.  (a-b-c  out(a bc))

Lemma: geo-strict-between-implies-out2
e:BasicGeometry. ∀a,b,c:Point.  (a-b-c  out(a cb))

Lemma: geo-between-out-implies-out
e:EuclideanPlane. ∀a,b,c,c':Point.  (out(a cc')  (a-b-c ∨ a-c-b)  out(a c'b))

Lemma: geo-between-out-implies-out2
e:EuclideanPlane. ∀a,b,c,c':Point.  (out(a cc')  ((B(abc) ∧ b) ∨ (B(acb) ∧ c))  out(a c'b))

Lemma: geo-bet-out-out-bet
e:BasicGeometry. ∀b,a,a',c,c':Point.  (B(abc)  out(b aa')  out(b cc')  B(a'bc'))

Lemma: geo-out2-bet-out
e:BasicGeometry. ∀a,b,c,x,p:Point.  (out(b ac)  out(b xp)  B(axc)  {out(b ap) ∧ out(b cp)})

Lemma: geo-out-unicity
e:BasicGeometry. ∀a,b,c:Point.  (out(a bc)  ab ≅ ac  b ≡ c)

Lemma: geo-out-le-iff-bet
e:BasicGeometry. ∀a,b,c:Point.  (out(a bc)  (|ab| ≤ |ac| ⇐⇒ B(abc)))

Lemma: geo-out2-bet
e:BasicGeometry. ∀a,b,c:Point.  (out(a bc)  out(c ab)  B(abc))

Lemma: geo-lt-out-to-between
e:EuclideanPlane. ∀a,b,c:Point.  (out(a bc)  |ab| < |ac|  a-b-c)

Lemma: geo-gt-out-to-between
e:EuclideanPlane. ∀a,b,c:Point.  (out(a bc)  ac > ab  a-b-c)

Lemma: geo-cong-preserves-bet-out
e:BasicGeometry. ∀a,b,c,a',b',c':Point.  (B(abc)  ab ≅ a'b'  ac ≅ a'c'  out(a' b'c')  B(a'b'c'))

Lemma: geo-cong-preserves-strict-bet-out
e:BasicGeometry. ∀a,b,c,a',b',c':Point.  (a-b-c  ab ≅ a'b'  ac ≅ a'c'  out(a' b'c')  a'-b'-c')

Lemma: geo-out-cong-cong
e:BasicGeometry. ∀a,b,c,a',b',c':Point.  (out(a bc)  out(a' b'c')  ab ≅ a'b'  ac ≅ a'c'  bc ≅ b'c')

Lemma: geo-colinear-not-out
e:BasicGeometry. ∀a,b,c:Point.  (Colinear(a;b;c)  out(a bc) ⇐⇒ B(bac)))

Lemma: geo-colinear-out-cases
[e:BasicGeometry-]. ∀[a,b,c:Point].  ∀X:ℙ(Stable{X}  Colinear(a;b;c)  (out(a bc)  X)  (B(cab)  X)  X)

Lemma: geo-not-bet-and-out
e:BasicGeometry. ∀a,b,c:Point.  (B(abc)  out(b ac)))

Lemma: geo-out-to-bet
e:BasicGeometry. ∀a,b,c,a',b',c':Point.  (Colinear(a';b';c')  (out(b ac) ⇐⇒ out(b' a'c'))  B(abc)  B(a'b'c'))

Lemma: geo-col-out2-col
e:BasicGeometry. ∀a,b,c,a',c':Point.  (Colinear(a;b;c)  out(b aa')  out(b cc')  Colinear(a';b;c'))

Lemma: out-congruent
e:BasicGeometry. ∀a,b,c,c',c1,d,d',d1:Point.
  (out(a cc')  out(b dd')  ac' ≅ bd'  B(acc1)  B(bdd1)  cc1 ≅ bd  dd1 ≅ ac  (ac1 ≅ bd1 ∧ c'c1 ≅ d'd1))

Lemma: geo-congruent-preserves-out
e:BasicGeometry. ∀a,b,c,a',b',c':Point.  (bc ≅ b'c'  ac ≅ a'c'  ab ≅ a'b'  out(a bc)  out(a' b'c'))

Lemma: geo-out-cong-implies-eq
e:BasicGeometry. ∀a,b,x,y:Point.  (out(a bx)  out(a by)  ax ≅ ay  x ≡ y)

Lemma: extended-out-preserves-between
e:EuclideanPlane. ∀a,b,c,d:Point.  ((out(a bc) ∧ b-a-d)  c-a-d)

Lemma: geo-between-middle-or
e:BasicGeometry. ∀a,b,c,d:Point.  (a    B(abd)  B(acd)  (B(bcd) ∨ B(cbd)))

Lemma: geo-col-between-cases
e:EuclideanPlane. ∀a,b,c,x:Point.  (a-b-c  Colinear(a;x;c)  (¬¬(B(xab) ∨ B(axb) ∨ B(bxc) ∨ B(bcx))))

Lemma: geo-between-out-implies-out3
e:EuclideanPlane. ∀a,b,b',c,c',t:Point.
  (out(a bb')  out(a cc')  a-b-c  B(b'tc')   {(out(a ct) ∧ out(a bt)) ∧ out(a c't) ∧ out(a b't)})

Lemma: geo-left-out-better
e:EuclideanPlane. ∀a,b,a',p:Point.  (p leftof ba  a'  ((¬B(baa')) ∧ B(ba'a))))  leftof ba')

Lemma: geo-left-out
e:EuclideanPlane. ∀a,b,a',p:Point.  (p leftof ba  out(b aa')  leftof ba')

Lemma: geo-left-out-better-1
e:EuclideanPlane. ∀a,b,b',p:Point.  (p leftof ba  b'  ((¬B(ab'b)) ∧ B(abb'))))  leftof b'a)

Lemma: geo-left-out-1
e:EuclideanPlane. ∀a,b,b',p:Point.  (p leftof ba  out(a bb')  leftof b'a)

Lemma: geo-left-out-2
e:EuclideanPlane. ∀a,b,p,p':Point.  (p leftof ba  out(b pp')  p' leftof ba)

Lemma: geo-left-out-3
e:EuclideanPlane. ∀a,b,p,p':Point.  (p leftof ba  out(a pp')  p' leftof ba)

Lemma: geo-left-out-4
e:EuclideanPlane. ∀a,b,p,a',b':Point.  (p leftof ab  out(p aa')  out(p bb')  leftof a'b')

Lemma: geo-equilateral-exists
e:BasicGeometry-. ∀a,b,c:Point.  (a bc  (∃x:Point. ((ax ≅ ac ∧ out(a bx)) ∧ xc)))

Lemma: weak-same-side-invariant
[e:BasicGeometry]. ∀[A,B,C,D:Point].
  (¬¬(((∀P:Point. (P leftof AB ⇐⇒ leftof CD)) ∧ (∀P:Point. (P leftof BA ⇐⇒ leftof DC)))
     ∨ ((∀P:Point. (P leftof AB ⇐⇒ leftof DC)) ∧ (∀P:Point. (P leftof BA ⇐⇒ leftof CD))))) supposing 
     (A and 
     and 
     Colinear(C;A;B) and 
     Colinear(D;A;B))

Lemma: geo-colinear-left-out
e:EuclideanPlane. ∀a,b,x,y:Point.  (Colinear(b;x;y)  leftof ab  leftof ab  out(b xy))

Lemma: geo-colinear-left-out2
e:EuclideanPlane. ∀a,b,x,y:Point.  (Colinear(b;x;y)  leftof ba  leftof ba  out(b xy))

Lemma: geo-SCS-out
e:EuclideanPlane. ∀a:Point. ∀x,b:{b:Point| b} .  out(a bSCS(b;a;a;x))

Lemma: center-on-circle-overlap
e:EuclideanPlane. ∀a,b,c:Point.  (a  |bc| ≤ |ab| |ab|  Overlap(a;b;b;c))

Lemma: geo-be-end-eq
e:BasicGeometry. ∀a,b,c:Point.  (B(abc)  ab ≅ ac  b ≡ c)

Lemma: cong-angle-out-aux_1
g:BasicGeometry. ∀a,b,c,d,e,f,a',c',d',f':Point.
  (abc ≅a def  out(b a'a)  out(b c'c)  out(e d'd)  out(e f'f)  ba' ≅ ed'  bc' ≅ ef'  a'c' ≅ d'f')

Lemma: cong-angle-out-aux2_1
g:BasicGeometry. ∀a,b,c,d,e,f,a',c',d',f':Point.
  (a'c' ≅ d'f'  out(b a'a)  out(b c'c)  out(e d'd)  out(e f'f)  ba' ≅ ed'  bc' ≅ ef'  abc ≅a def)

Lemma: cong-angle-out-exists2
e:BasicGeometry. ∀a,b,c,x,y,z:Point.
  (abc ≅a xyz
   b
   b
   y
   y
   (∃a',c',x',z':Point. (out(b a'a) ∧ out(b c'c) ∧ out(y x'x) ∧ out(y z'z) ∧ a'bc' ≅a x'yz')))

Lemma: cong-angle-out-exists3
e:BasicGeometry. ∀a,b,c,x,y,z:Point.
  (abc ≅a xyz
   b
   b
   y
   y
   (∃a',c',x',z':Point. ((out(b a'a) ∧ out(b c'c) ∧ out(y x'x) ∧ out(y z'z) ∧ a'bc' ≅a x'yz') ∧ Cong3(a'bc',x'yz'))))

Lemma: out-preserves-angle-cong_1
e:BasicGeometry. ∀a,b,c,a',b',c',p,q,p',q':Point.
  (abc ≅a a'b'c'  out(b cq)  out(b ap)  out(b' c'q')  out(b' a'p')  pbq ≅a p'b'q')

Lemma: out-cong-angle
e:BasicGeometry. ∀a,b,c,a',c':Point.  (out(b cc')  out(b aa')  abc ≅a a'bc')

Lemma: cong-angle-between-exists
e:BasicGeometry. ∀a,b,c,x,y,z:Point.
  (abc ≅a xyz
   a
   c
   x
   z
   (∃a',c',x',z':Point. (B(baa') ∧ B(bcc') ∧ B(yxx') ∧ B(yzz') ∧ ((ba ≅ xx' ∧ aa' ≅ yx) ∧ bc ≅ zz') ∧ cc' ≅ yz)))

Lemma: cong-angle-between-exists-iff
e:BasicGeometry. ∀a,b,c,x,y,z:Point.
  ((((b a ∧ c) ∧ x) ∧ z)
   (abc ≅a xyz
     ⇐⇒ ∃a',c',x',z':Point
          ((((B(baa') ∧ B(bcc')) ∧ B(yxx')) ∧ B(yzz'))
          ∧ (((ba ≅ xx' ∧ aa' ≅ yx) ∧ bc ≅ zz') ∧ cc' ≅ yz)
          ∧ a'c' ≅ x'z')))

Lemma: geo-cong-angle-transitivity
e:BasicGeometry. ∀a,b,c,x,y,z,p,q,r:Point.  (abc ≅a xyz  xyz ≅a pqr  abc ≅a pqr)

Lemma: geo-cong-angle-symmetry
e:BasicGeometry. ∀a,b,c,x,y,z:Point.
  (xyz ≅a abc  {zyx ≅a abc ∧ xyz ≅a cba ∧ zyx ≅a cba ∧ abc ≅a xyz ∧ cba ≅a xyz ∧ abc ≅a zyx ∧ cba ≅a zyx})

Lemma: geo-cong-angle_functionality
e:EuclideanPlane. ∀a1,a2,b1,b2,c1,c2,d1,d2,f1,f2,g1,g2:Point.
  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  d1 ≡ d2  f1 ≡ f2  g1 ≡ g2  (a1b1c1 ≅a d1f1g1 ⇐⇒ a2b2c2 ≅a d2f2g2))

Lemma: geo-cong-angle_inversion
e:BasicGeometry. ∀a,b,c:Point.  ((a b ∧ b)  abc ≅a cba)

Lemma: geo-cong-angle_weakening
e:BasicGeometry. ∀a,b,c:Point.  ((a b ∧ a ≡ c)  abc ≅a abc)

Lemma: geo-zero-angle-congruence-out
g:EuclideanPlane. ∀a,b,c,x,y:Point.  (abc ≅a xyx  out(b ac))

Lemma: geo-zero-angle-congruence-subst
g:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (abc ≅a xyx  aba ≅a xyx)

Definition: geo-five-seg-compressed
FSC(a;b;c;d  a';b';c';d') ==  Colinear(a;b;c) ∧ Cong3(abc,a'b'c') ∧ ad ≅ a'd' ∧ bd ≅ b'd'

Lemma: geo-five-seg-compressed_wf
[e:BasicGeometry]. ∀[a,b,c,d,a',b',c',d':Point].  (FSC(a;b;c;d  a';b';c';d') ∈ ℙ)

Lemma: geo-fsc-ap
e:BasicGeometry. ∀a,b,c,d,a',b',c',d':Point.  (FSC(a;b;c;d  a';b';c';d')   cd ≅ c'd')

Lemma: geo-colinear-congruence1
e:BasicGeometry. ∀A,B,C,P,Q:Point.  (A  Colinear(A;B;C)  AP ≅ AQ  BP ≅ BQ  CP ≅ CQ)

Lemma: geo-colinear-congruence2
e:BasicGeometry. ∀A,B,C,C':Point.  (A  Colinear(A;B;C)  AC ≅ AC'  BC ≅ BC'  C ≡ C')

Lemma: geo-strict-between-congruence
e:BasicGeometry. ∀A,B,C,C':Point.  (B(ACB)  AC ≅ AC'  BC ≅ BC'  C ≡ C')

Lemma: not-col-distincts
e:BasicGeometry. ∀A,B,C:Point.  ((¬Colinear(A;B;C))  (¬¬(A B ∧ C ∧ C)))

Lemma: symmetric-point-unicity
e:BasicGeometry. ∀a,p,p1,p2:Point.  (p=a=p1  p=a=p2  p1 ≡ p2)

Lemma: symmetric-point-unicity2
e:BasicGeometry. ∀a,p,p1,p2:Point.  (p1=a=p  p2=a=p  p1 ≡ p2)

Lemma: seg-midpoints-equal
e:BasicGeometry. ∀P,Q,A,X:Point.  ((P=A=X ∧ Q=A=X)  P ≡ Q)

Lemma: seg-midpoints-equal-flip
e:BasicGeometry. ∀P,Q,A,X:Point.  ((P=A=X ∧ X=A=Q)  P ≡ Q)

Lemma: geo-midpoint-diagonals-congruent
e:BasicGeometry. ∀A,P,Q,p,q:Point.  (p=A=P  q=A=Q  PQ ≅ pq)

Lemma: geo-vert-angle-SAS
e:BasicGeometry. ∀a,p,q,p',q':Point.  (p-a-q  p'-a-q'  pa ≅ p'a  qa ≅ q'a  p'q ≅ pq')

Lemma: symmetry-preserves-congruence
e:BasicGeometry. ∀A,P,Q,p,q:Point.  (p=A=P  q=A=Q  PQ ≅ pq)

Lemma: geo-midpoint-diagonals-between
e:BasicGeometry. ∀A,P,Q,R,P',Q',R':Point.  ((((P=A=P' ∧ R=A=R') ∧ Q=A=Q') ∧ B(PQR))  B(P'Q'R'))

Lemma: geo-midpoint-diagonals-congruent2
e:BasicGeometry. ∀P,Q,R,S,P',Q',R',S',A:Point.  (((((P=A=P' ∧ Q=A=Q') ∧ R=A=R') ∧ S=A=S') ∧ PQ ≅ RS)  P'Q' ≅ R'S')

Lemma: Mid_cases
e:BasicGeometry. ∀A,B,C:Point.  ((B=A=C ∨ C=A=B)  B=A=C)

Lemma: Mid_perm
e:BasicGeometry. ∀A,B,C:Point.  (B=A=C  (B=A=C ∧ C=A=B))

Lemma: symmetry_preserves_midpoint
e:BasicGeometry. ∀a,b,c,d,e1,f,z:Point.  ((((a=z=d ∧ b=z=e1) ∧ c=z=f) ∧ a=b=c)  d=e1=f)

Lemma: at-most-one-midpoint
e:BasicGeometry. ∀P,P',A,B:Point.  ((P=A=P' ∧ P=B=P')  A ≡ B)

Lemma: midpoint-sep
e:BasicGeometry. ∀A,B,M:Point.  (A  A=M=B  {A M ∧ M})

Lemma: colinear-implies-midpoint
e:BasicGeometry. ∀M,A,B:Point.  (A  Colinear(A;M;B)  MA ≅ MB  A=M=B)

Lemma: colinear-implies-congruent_or_midpoint
e:BasicGeometry. ∀M,A,B:Point.  (Colinear(A;M;B)  MA ≅ MB  (¬¬(A ≡ B ∨ A=M=B)))

Lemma: opposite-side-congruent-diagonals-midpoint
e:BasicGeometry. ∀A,B,C,D,P:Point.
  ((¬Colinear(A;B;C))   AB ≅ CD  BC ≅ DA  Colinear(A;P;C)  Colinear(B;P;D)  {A=P=C ∧ B=P=D})

Lemma: midpoints-preserve-congruence
e:BasicGeometry. ∀a,b,c,a',b',c':Point.
  ((((a'=b'=c' ∧ a=b=c) ∧ a' c' ∧ c) ∧ ac ≅ a'c')  (ab ≅ a'b' ∧ bc ≅ b'c'))

Lemma: geo-krippen-aux
e:BasicGeometry. ∀a1,a2,b1,b2,c,m1,m2:Point.
  (B(a1ca2)  B(b1cb2)  ca1 ≅ cb1  ca2 ≅ cb2  a1=m1=b1  a2=m2=b2  |ca1| ≤ |ca2|  B(m1cm2))

Lemma: geo-krippen-lemma
e:BasicGeometry. ∀a1,a2,b1,b2,c,m1,m2:Point.
  (B(a1ca2)  B(b1cb2)  ca1 ≅ cb1  ca2 ≅ cb2  a1=m1=b1  a2=m2=b2  B(m1cm2))

Lemma: geo-conga-to-cong3
E:BasicGeometry. ∀a,b,c,d,e,f:Point.
  (a b
   b
   e
   e
   abc ≅a def
   (∃a',c',d',f':Point. (out(b a'a) ∧ out(b cc') ∧ out(e d'd) ∧ out(e ff') ∧ Cong3(a'bc',d'ef'))))

Lemma: geo-between-seg-eq
e:BasicGeometry. ∀a,b,c,a',b',c':Point.  (B(abc)  B(a'b'c')  ab ≅ a'b'  ac ≅ a'c'  bc ≅ b'c')

Definition: geo-lt-pt
ab < cd ==  ∃y:Point. (c-y-d ∧ ab ≅ cy)

Lemma: geo-lt-pt_wf
[e:EuclideanPlaneStructure]. ∀[a,b,c,d:Point].  (ab < cd ∈ ℙ)

Lemma: geo-lt-pt-exists
e:BasicGeometry. ∀a,b,c,d:Point.  (a  ab < cd  (∃x:Point. (a-b-x ∧ ax ≅ cd)))

Lemma: geo-eqt
e:BasicGeometry. ∀a,b,c:{p:Point| B(OXp)} .
  (((a b ∈ {p:Point| B(OXp)} ) ∧ (b c ∈ {p:Point| B(OXp)} ))  (a c ∈ {p:Point| B(OXp)} ))

Lemma: geo-eq-x-implies-eq
e:BasicGeometry. ∀a,b:Point.  ((X |ab| ∈ Length)  a ≡ b)

Lemma: geo-sum-eq-x
e:BasicGeometry. ∀a,b,c,d:Point.  ((X |ab| |cd| ∈ Length)  (a ≡ b ∧ c ≡ d))

Lemma: geo-ab-eq-x
e:BasicGeometry. ∀a,b:Point.  (a ≡  (X |ab| ∈ Length))

Lemma: geo-colinear-switch
e:BasicGeometry. ∀a,b,c:Point.  (Colinear(a;b;c)  Colinear(a;c;b))

Lemma: geo-colinear-switch2
e:BasicGeometry. ∀a,b,c:Point.  (Colinear(a;b;c)  Colinear(b;a;c))

Lemma: geo-colinear-switch3
e:BasicGeometry. ∀a,b,c:Point.  (Colinear(a;b;c)  Colinear(c;b;a))

Lemma: geo-colinear-trivial
e:BasicGeometry. ∀a,b:Point.  ((¬(a b ∈ Point))  (Colinear(a;b;b) ∧ Colinear(b;a;b)))

Lemma: geo-cong3-to-conga-aux
e:BasicGeometry. ∀b,a,a',a0,e0,d,d',d0:Point.
  (out(b aa')
   out(e0 dd')
   B(baa0)
   B(e0dd0)
   ba' ≅ e0d'
   aa0 ≅ e0d
   dd0 ≅ ba
   (ba0 ≅ e0d0 ∧ a'a0 ≅ d'd0))

Lemma: geo-cong3-to-conga
e:BasicGeometry. ∀a,b,c,d,E,f:Point.
  ((∃a',c',d',f':Point. (out(b a'a) ∧ out(b c'c) ∧ out(E d'd) ∧ out(E f'f) ∧ Cong3(a'bc',d'Ef')))  abc ≅a dEf)

Lemma: cong3-implies-conga
e:BasicGeometry. ∀a,b,c,d,E,f:Point.  (a   Cong3(abc,dEf)  abc ≅a dEf)

Lemma: geo-be-compress
e:BasicGeometry. ∀a,b,c:Point.  (B(abc)  B(acb)  b ≡ c)

Lemma: geo-between-middle
e:BasicGeometry. ∀a,b,c,d:Point.  (a  B(abd)  B(acd)  ((¬B(bcd)) ∧ B(cbd)))))

Lemma: geo-eq-implies-col
e:BasicGeometry. ∀a,b,c:Point.  ((¬(a b ∈ Point))  (b c ∈ Point)  Colinear(a;b;c))

Lemma: geo-col-connect
e:BasicGeometry. ∀a,b,c,d:Point.  (c  Colinear(a;b;c)  Colinear(c;b;d)  Colinear(a;b;d))

Lemma: right-angle_functionality
e:BasicGeometry. ∀a,b,c,a',b',c':Point.  (a ≡ a'  b ≡ b'  c ≡ c'  {Rabc ⇐⇒ Ra'b'c'})

Lemma: stable__right-angle
e:BasicGeometry. ∀a,b,c:Point.  Stable{Rabc}

Lemma: implies-right-angle
e:BasicGeometry. ∀a,b,c,c':Point.  (c'=b=c  ac ≅ ac'  Rabc)

Lemma: right-angle-symmetry
e:BasicGeometry. ∀a,b,c:Point.  (Rabc  Rcba)

Lemma: symmetry-preserves-right-angle
e:BasicGeometry. ∀a,b,c,c':Point.  (c=b=c'  Rabc  Rabc')

Lemma: right-angle-trivial
e:BasicGeometry. ∀a,b:Point.  Rabb

Lemma: right-angle-trivial2
e:BasicGeometry. ∀a,b:Point.  Rbba

Lemma: right-angle-colinear
e:BasicGeometry. ∀a,b,c,a':Point.  (Rabc   Colinear(b;a;a')  Ra'bc)

Lemma: right-angle-colinear2
e:BasicGeometry. ∀a,b,c,c':Point.  (Rabc   Colinear(b;c;c')  Rabc')

Lemma: adjacent-right-angles
e:BasicGeometry. ∀a,b,c,a':Point.  (b  Rabc  Ra'bc  Colinear(a;b;a'))

Lemma: right-angle-legs-same
e:BasicGeometry. ∀a,b:Point.  (Rbab  a ≡ b)

Lemma: colinear-right-angle
e:BasicGeometry. ∀a,b,c:Point.  (b  Colinear(a;b;c)  Rabc  a ≡ b)

Lemma: right-angles-not-acute
e:BasicGeometry. ∀a,b,c,a':Point.  (Rabc  Ra'bc  B(aca')  b ≡ c)

Lemma: right-angles-not-acute2
e:BasicGeometry. ∀a,b,c,a':Point.  (b  Rabc  Ra'bc  B(aa'c)  a ≡ a')

Lemma: right-angles-not-complementary
e:BasicGeometry. ∀a,b,c:Point.  (Rabc  Racb  b ≡ c)

Lemma: colinear-right-angle-trivial
e:BasicGeometry. ∀a,b,c:Point.  (Rabc  Colinear(a;b;c)  (a b ∧ b)))

Lemma: congruence-preserves-right-angle
e:BasicGeometry. ∀a,b,c:Point.  (Rabc  (∀a',b',c':Point.  (Cong3(abc,a'b'c')  Ra'b'c')))

Definition: geo-perp-in
ab  ⊥cd ==  Colinear(a;b;x) ∧ Colinear(c;d;x) ∧ (∀u,v:Point.  (Colinear(a;b;u)  Colinear(c;d;v)  Ruxv))

Lemma: geo-perp-in_wf
[e:BasicGeometry]. ∀[x,a,b,c,d:Point].  (ab  ⊥cd ∈ ℙ)

Lemma: stable__geo-perp-in
e:BasicGeometry. ∀x:Point.  ∀[a,b,c,d:Point].  Stable{ab  ⊥cd}

Lemma: sq_stable__geo-perp-in
e:BasicGeometry. ∀x:Point.  ∀[a,b,c,d:Point].  SqStable(ab  ⊥cd)

Lemma: geo-perp-in_functionality
e:BasicGeometry. ∀x:Point.
  ∀[a,b,c,d:Point].
    ∀x':Point
      ∀[a',b',c',d':Point].
        (uiff(ab  ⊥cd;a'b'  ⊥x' c'd')) supposing (d ≡ d' and c ≡ c' and b ≡ b' and a ≡ a' and x ≡ x')

Lemma: geo-perp-in-symmetry1
e:BasicGeometry. ∀x:Point.  ∀[a,b,c,d:Point].  (ab  ⊥cd  cd  ⊥ab)

Lemma: geo-perp-in-symmetry2
e:BasicGeometry. ∀x:Point.  ∀[a,b,c,d:Point].  (ab  ⊥cd  ba  ⊥cd)

Lemma: geo-perp-in-symmetry
e:BasicGeometry. ∀x:Point.
  ∀[a,b,c,d:Point].  (ab  ⊥cd  {ba  ⊥cd ∧ ab  ⊥dc ∧ ba  ⊥dc ∧ cd  ⊥ab ∧ dc  ⊥ab ∧ cd  ⊥ba ∧ dc  ⊥ba})

Lemma: geo-perp-in-not-eq
e:BasicGeometry. ∀x:Point.  ∀[a,b,c,d:Point].  (ab  ⊥cd  a ≡ b))

Definition: geo-perp
ab ⊥ cd ==  ∃x:Point. ab  ⊥cd

Lemma: geo-perp_wf
[e:BasicGeometry]. ∀[a,b,c,d:Point].  (ab ⊥ cd ∈ ℙ)

Lemma: geo-perp-all-symmetry
e:BasicGeometry. ∀[a,b,c,d:Point].  (ab ⊥ cd  {ba ⊥ cd ∧ ab ⊥ dc ∧ ba ⊥ dc ∧ cd ⊥ ab ∧ dc ⊥ ab ∧ cd ⊥ ba ∧ dc ⊥ ba})

Lemma: geo-perp-symmetry
e:BasicGeometry. ∀a,b,c,d:Point.  (ab ⊥ cd  cd ⊥ ab)

Lemma: geo-perp-symmetry2
e:BasicGeometry. ∀b,a,c,u:Point.  (ab ⊥ cu  ba ⊥ cu)

Lemma: geo-perp-in-iff
e:BasicGeometry. ∀a,b,c,d,x:Point.
  (a b
   d
   (ab  ⊥cd
     ⇐⇒ Colinear(a;b;x) ∧ Colinear(c;d;x) ∧ (∃u,v:Point. (Colinear(a;b;u) ∧ Colinear(c;d;v) ∧ x ∧ x ∧ Ruxv))))

Lemma: geo-perp-in-iff2
e:BasicGeometry. ∀a,b,c,d:Point.  (a   (ab  ⊥cd ⇐⇒ Colinear(a;b;c) ∧ Racd ∧ Rbcd))

Lemma: geo-perp-in-unicity1
e:BasicGeometry. ∀x,a,b,c:Point.  (ba  ⊥ca  x ≡ a)

Lemma: geo-perp-in-unicity2
e:BasicGeometry. ∀a,b,c:Point.
  ((¬Colinear(a;b;c))
   (∀d,x:Point.  (c  ab  ⊥cd  (∀y:Point. (Colinear(a;b;y)  Colinear(c;d;y)  x ≡ y)))))

Lemma: geo-perp-in-same-colinear
[e:BasicGeometry]. ∀[a,b,c,d,x:Point].  (Colinear(x;c;d)) supposing (ab  ⊥xc and ab  ⊥xd)

Lemma: geo-perp-irrefl
[e:BasicGeometry]. ∀[a,b:Point].  (ab ⊥ ab  a ≡ b)

Lemma: perp-col
e:BasicGeometry. ∀a,b,c,d,x,y:Point.  (a  ab  ⊥cd   Colinear(a;b;x)  Colinear(a;b;y)  cd  ⊥xy)

Lemma: geo-perp-colinear
e:EuclideanPlane. ∀a,b,c,x,y:Point.  (b   Colinear(a;b;c)  bc ⊥ xy  ab ⊥ xy)

Lemma: geo-perp-trivial-when-colinear
e:EuclideanPlane. ∀a,b,c,d:Point.  (b  Colinear(a;b;c)  ab  ⊥dc  d ≡ c)

Lemma: geo-perp-midsegments
e:BasicGeometry. ∀a,b,c:Point.  (Rabc  (∀c',d,p:Point.  (c'=p=d  c'=a=c  d=b=c  Rbap)))

Lemma: geo-perp-unicity
e:BasicGeometry. ∀a,b,c,u,v:Point.  (a  Colinear(a;b;u)  Colinear(a;b;v)  ab ⊥ cu  ab ⊥ cv  u ≡ v)

Lemma: geo-midpoint-implies-between
e:BasicGeometry. ∀a,b,m:Point.  (a  a=m=b  a-m-b)

Lemma: p8geo
e:BasicGeometry. ∀a,b,c,x,y,z:Point.
  ((Triangle(a;b;c) ∧ Triangle(x;y;z))  Cong3(abc,xyz)  (abc ≅a xyz ∧ bac ≅a yxz ∧ bca ≅a yzx))

Lemma: geo-sas
e:BasicGeometry. ∀a,b,c,A,B,C:Point.
  (bc ≅ BC) supposing (((ab ≅ AB ∧ ac ≅ AC) ∧ bac ≅a BAC) and (Triangle(a;b;c) ∧ Triangle(A;B;C)))

Lemma: geo-sas2
e:BasicGeometry. ∀a,b,c,A,B,C:Point.  bc ≅ BC supposing (ab ≅ AB ∧ ac ≅ AC) ∧ bac ≅a BAC

Lemma: geo-reflected-right-triangles-congruent
e:BasicGeometry. ∀a,b,c,d:Point.  (a bc  Rcba  a=b=d  Cong3(abc,dbc))

Lemma: p5geo
e:BasicGeometry. ∀a,b,c:Point.  ((ab ≅ ac ∧ Triangle(a;b;c))  (∃j,k:Point. (jbc ≅a kcb ∧ B(abj) ∧ B(ack))))

Lemma: p4geo
e:BasicGeometry. ∀a,b,c,A,B,C:Point.
  ((Triangle(a;b;c) ∧ Triangle(A;B;C))
   (ab ≅ AB ∧ ac ≅ AC ∧ bac ≅a BAC)
   (bc ≅ BC ∧ abc ≅a ABC ∧ bca ≅a BCA ∧ Cong3(abc,ABC)))

Lemma: cong-angle-out-exists1
e:BasicGeometry. ∀a,b,c,x,y,z:Point.  (abc ≅a xyz  (∃x',z':Point. (out(y x'x) ∧ out(y z'z) ∧ Cong3(x'yz',abc))))

Lemma: cong-angle-out-exists
g:EuclideanPlane. ∀a,b,c,x,y,z,a',c',p:Point.
  (abc ≅a xyz
   b
   b
   b
   y
   y
   ((out(b aa') ∧ out(b cc')) ∧ a'-p-c')
   (∃x',z',p':Point
       (((x'-p'-z' ∧ Cong3(a'bc',x'yz')) ∧ out(y xx') ∧ out(y zz'))
       ∧ (x'p' ≅ a'p ∧ p'z' ≅ pc')
       ∧ bp ≅ yp'
       ∧ x'yp' ≅a a'bp)))

Lemma: geo-out-preserves-opp-side-case1
e:BasicGeometry. ∀p,q,a,b,c,r,m:Point.
  (p  a-pq-c  Colinear(p;q;m)  a=m=c  Colinear(p;q;r)  B(rba)   b-pq-c)

Lemma: geo-out-preserves-opp-side
e:BasicGeometry. ∀p,q,a,b,c,r,m:Point.
  (p  a-pq-c  Colinear(p;q;m)  a=m=c  Colinear(p;q;r)  out(r ab)  b-pq-c)

Lemma: geo-le-pt-exists
e:BasicGeometry. ∀a,b,c,d:Point.  (a  ab≤cd  (∃x:Point. (B(abx) ∧ ax ≅ cd)))

Lemma: le-if-point-be-end
e:BasicGeometry. ∀a,b,c,d,x:Point.  (a  B(abx)  ax ≅ cd  ab≤cd)

Lemma: geo-le-pt-functionality
e:BasicGeometry. ∀a,b,c,d,a',b',c',d':Point.  (a  ab≤cd  ab ≅ a'b'  cd ≅ c'd'  a'b'≤c'd')

Lemma: geo-le-pt-reflexivity
e:BasicGeometry. ∀a,b:Point.  ab≤ab

Lemma: geo-le-pt-transitivity
e:BasicGeometry. ∀a,b,c,d,c',d':Point.  (a  ab≤cd  cd≤c'd'  ab≤c'd')

Lemma: geo-le-pt-switch-congruence
e:BasicGeometry. ∀a,b,c,d:Point.  (a  ab≤cd  cd≤ab  ab ≅ cd)

Lemma: geo-le-pt-from-cong
e:BasicGeometry. ∀a,b,c,d:Point.  (ab ≅ cd  ab≤cd)

Lemma: geo-le-pt-comm
e:BasicGeometry. ∀a,b:Point.  ab≤ba

Lemma: geo-le-pt-right-comm
e:BasicGeometry. ∀a,b,c,d:Point.  (a  ab≤cd  ab≤dc)

Lemma: geo-be-neq
e:BasicGeometry. ∀a,b,c:Point.  (a  B(abc)  c)

Lemma: cong-angle-out-exists-iff
e:BasicGeometry. ∀a,b,c,x,y,z:Point.
  ((((b a ∧ c) ∧ x) ∧ z)
   (abc ≅a xyz ⇐⇒ ∃a',c',x',z':Point. ((((out(b a'a) ∧ out(b c'c)) ∧ out(y x'x)) ∧ out(y z'z)) ∧ a'bc' ≅a x'yz')))

Lemma: cong-angle-out-all-iff
e:BasicGeometry. ∀a,b,c,x,y,z:Point.
  ((((b a ∧ c) ∧ x) ∧ z)
   (abc ≅a xyz
     ⇐⇒ ∀a',c',x',z':Point.
           ((((out(b a'a) ∧ out(b c'c)) ∧ out(y x'x)) ∧ out(y z'z) ∧ ba' ≅ yx' ∧ bc' ≅ yz')  a'c' ≅ x'z')))

Lemma: supplementary-angles-preserve-congruence
g:EuclideanPlane. ∀a,b,c,d,e,f,a',d':Point.  (abc ≅a def  a-b-a'  d-e-d'  a'bc ≅a d'ef)

Lemma: vertical-angles-congruent
e:EuclideanPlane. ∀a,b,c,a',c':Point.  (a-b-a'  c-b-c'  abc ≅a a'bc')

Lemma: between-preserves-left-1
e:EuclideanPlane. ∀A,B,C,V:Point.  (C leftof AB  B(ABV)  leftof AV)

Lemma: between-preserves-left-2
e:EuclideanPlane. ∀A,B,C,V:Point.  (C leftof AB   B(AVB)  leftof AV)

Lemma: between-preserves-left-3
e:EuclideanPlane. ∀A,B,C,V:Point.  (C leftof AB   B(VAB)  leftof VA)

Lemma: between-preserves-left-4
e:EuclideanPlane. ∀A,B,C,V:Point.  (C leftof AB  A-B-V  leftof BV)

Lemma: between-preserves-left-5
e:EuclideanPlane. ∀A,B,C,V:Point.  (C leftof AB   B(AVB)  leftof VB)

Lemma: between-preserves-left-6
e:EuclideanPlane. ∀A,B,C,V:Point.  (C leftof AB   B(VAB)  leftof VB)

Lemma: geo-colinear-left-out3
e:EuclideanPlane. ∀a,b,c,a',c',x,x':Point.
  (Colinear(b;x;x')  a-x-c  a'-x'-c'  out(b aa')  out(b cc')  leftof ac  leftof a'c'  out(b xx'))

Lemma: geo-length-property
g:EuclideanPlane. ∀a,b:Point.  ab ≅ X|ab|

Lemma: geo-add-length-property1
g:EuclideanPlane. ∀s1,s2:geo-segment(g).  B(X|s1||s1| |s2|)

Lemma: geo-add-length-property2
g:EuclideanPlane. ∀s:geo-segment(g). ∀c,d:Point.  cd ≅ |s||s| |cd|

Lemma: geo-add-length-property3
g:EuclideanPlane. ∀p,q:{p:Point| B(OXp)} .  (B(Xpq)  |pq| ≡ q)

Lemma: geo-le-iff-between-points
g:EuclideanPlane. ∀p,q:{p:Point| B(OXp)} .  (p ≤ ⇐⇒ B(Xpq))

Lemma: geo-le-iff-between
g:EuclideanPlane. ∀s1,s2:geo-segment(g).  (|s1| ≤ |s2| ⇐⇒ B(X|s1||s2|))

Lemma: geo-lt-iff-strict-between-points
g:EuclideanPlane. ∀p,q:{p:Point| B(OXp)} .  (p < ⇐⇒ p ≤ q ∧ q)

Lemma: geo-lt-iff-strict-between
g:EuclideanPlane. ∀s1,s2:geo-segment(g).  (|s1| < |s2| ⇐⇒ B(X|s1||s2|) ∧ |s1| |s2|)

Lemma: geo-lt-add1
e:BasicGeometry. ∀p,q:{a:Point| B(OXa)} . ∀r:{a:Point| B(OXa) ∧ (|Xa| q ∈ Length)} .  (X   p < r)

Lemma: geo-lt-add1_1
e:BasicGeometry. ∀p,q,r:Length.  (p <  p < r)

Lemma: geo-le_antisymmetry
e:BasicGeometry. ∀[p,q:Length].  (p q ∈ Length) supposing (q ≤ and p ≤ q)

Lemma: geo-lt-add1_2
e:BasicGeometry. ∀p,q,r:{a:Point| B(OXa)} .  (X    p <  r < r)

Lemma: geo-lt-add1-iff
e:BasicGeometry. ∀p,q,r:{a:Point| B(OXa)} .  (X    (p < ⇐⇒ r < r))

Lemma: geo-lt-add1-iff2
e:BasicGeometry. ∀a1,a2,b1,b2,c1,c2:Point.  (|a1a2| < |b1b2| ⇐⇒ |a1a2| |c1c2| < |b1b2| |c1c2|)

Lemma: geo-le-congruent
g:BasicGeometry. ∀a,b,c,d:Point.  ((|ab| ≤ |cd| ∧ |cd| ≤ |ab|)  ab ≅ cd)

Lemma: geo-lt-implies-gt-strong-1
g:EuclideanPlane. ∀a,b,c,d:Point.  (|cd| < |ab|  (∃w:Point. (B(awb) ∧ aw ≅ cd ∧ b)))

Lemma: geo-lt-implies-gt-strong
g:EuclideanPlane. ∀a,b,c,d:Point.  (|cd| < |ab|  ab > cd)

Lemma: not-gt-and-lt
g:EuclideanPlane. ∀a,b,c,d:Point.  (ab > cd  |ab| < |cd|  False)

Lemma: geo-lt-implies-point
e:EuclideanPlane. ∀a,b,c,d:Point.  (|ab| < |cd|   (∃f:Point. (a-b-f ∧ af ≅ cd)))

Lemma: geo-ge-cases
e:BasicGeometry. ∀a,b,c,d:Point.  (¬¬((ab > cd ∨ cd > ab) ∨ ab ≅ cd))

Lemma: not-geo-lt-points
g:EuclideanPlane. ∀p,q:{p:Point| B(OXp)} .  p < ⇐⇒ q ≤ p)

Lemma: not-geo-lt
g:EuclideanPlane. ∀p,q:Length.  p < ⇐⇒ q ≤ p)

Lemma: geo-sep-iff-or-lt
e:BasicGeometry. ∀x,y:{p:Point| B(OXp)} .  (x ⇐⇒ x < y ∨ y < x)

Lemma: geo-zero-point-sep-iff-sep
e:BasicGeometry. ∀a,b:Point.  (X |ab| ⇐⇒ b)

Lemma: not-lt-or
g:EuclideanPlane. ∀p,q:Length.  (¬¬(p < q ∨ q < p ∨ (p q ∈ Length)))

Lemma: geo-add-length-lt-sep
e:BasicGeometry. ∀a,b,c,d,g,h:Point.  (|ab| < |cd| |gh|  (c d ∨ h))

Lemma: geo-add-length-lt-sep2
e:BasicGeometry. ∀a,b,c,d,g,h:Point.  (|ab| < |cd| |gh|  |ab| |cd| |gh|)

Lemma: geo-add-length-lt-cancel-for-double
e:EuclideanPlane. ∀a,b:{a:Point| B(OXa)} .  (a a <  a < b)

Lemma: geo-triangle-inequality-lt-sep
e:BasicGeometry. ∀a,b,c,d,g,h:Point.
  (|ab| < |gh| |cd|  |cd| < |ab| |gh|  |gh| < |cd| |ab|  ((a b ∧ h) ∧ d))

Lemma: geo-length-between-property
e:BasicGeometry. ∀p,q:{p:Point| B(OXp)} . ∀a,b,c,d:Point.
  (B(Xpq)  (p |ab| ∈ Length)  (q |cd| ∈ Length)  B(X|ab||cd|))

Lemma: geo-gt-prim-implies-le
e:EuclideanPlane. ∀a,b,c,d:Point.  (ab>cd  |cd| ≤ |ab|)

Lemma: geo-gt-prim-implies-lt
e:EuclideanPlane. ∀a,b,c,d:Point.  (ab>cd  |cd| < |ab|)

Lemma: geo-gt-prim-iff-lt
e:EuclideanPlane. ∀a,b,c,d:Point.  (ab>cd ⇐⇒ |cd| < |ab|)

Lemma: geo-gt-not-congruent
g:EuclideanPlane. ∀a,b,c,d:Point.  (ab > cd  ab ≅ cd))

Lemma: geo-SS_functionality
[g:EuclideanPlane]. ∀[a,b:Point]. ∀[u:{u:Point| leftof ab} ]. ∀[v:{v:Point| leftof ba} ]. ∀[a',b':Point].
[u':{u:Point| leftof a'b'} ]. ∀[v':{v:Point| leftof b'a'} ].
  (geo-SS(g;a;b;u;v) ≡ geo-SS(g;a';b';u';v')) supposing (v ≡ v' and u ≡ u' and b ≡ b' and a ≡ a')

Lemma: left-between-triangle
e:EuclideanPlane. ∀a,x,y,p:Point.  (a leftof xy  x-p-a  leftof py)

Lemma: left-between-triangle2
e:EuclideanPlane. ∀a,x,y,p:Point.  (a leftof yx  x-p-a  leftof yp)

Lemma: plane-sep-imp-Opasch_left
e:EuclideanPlane. ∀a,b:Point. ∀c:{c:Point| B(abc)} . ∀x:Point. ∀y:{y:Point| b-x-y} .
  (x leftof ab  (∃p:Point [(B(axp) ∧ B(cpy))]))

Lemma: outer-Pasch
e:EuclideanPlane. ∀a,b:Point. ∀c:{c:Point| B(abc)} . ∀x:Point. ∀y:{y:Point| b-x-y} .
  (x ab  (∃p:Point [(B(axp) ∧ B(cpy))]))

Lemma: outer-Pasch-ext
e:EuclideanPlane. ∀a,b:Point. ∀c:{c:Point| B(abc)} . ∀x:Point. ∀y:{y:Point| b-x-y} .
  (x ab  (∃p:Point [(B(axp) ∧ B(cpy))]))

Lemma: full-Pasch-lemma
e:EuclideanPlane. ∀a,x,y,d,p:Point.
  ((((d leftof xa ∧ x-p-a) ∧ py) ∧ leftof xy)  (∃p':Point. ((x-p'-y ∨ a-p'-y) ∧ Colinear(d;p;p'))))

Lemma: full-Pasch
e:EuclideanPlane. ∀a,x,y,d,p:Point.
  ((((d xa ∧ x-p-a) ∧ py) ∧ leftof xy)  (∃p':Point. ((x-p'-y ∨ a-p'-y) ∧ Colinear(d;p;p'))))

Lemma: right-angles-congruent-axiom_wf
[g:BasicGeometry]. (right-angles-congruent-axiom(g) ∈ ℙ)

Lemma: geo-left-interiority
g:OrientedPlane. ∀a,b,c,p:Point.  (p leftof ab  leftof bc  leftof ca  leftof cb))

Lemma: left-transitivity
g:OrientedPlane. ∀a,b,x,y,z:Point.
  (x leftof ab  leftof ab  leftof ab  leftof ax  leftof ay  leftof xa))

Definition: geo-convex
IsConvex(x.P[x]) ==  ∀x,y,z:Point.  (B(xyz)  P[x]  P[z]  P[y])

Lemma: geo-convex_wf
[g:BasicGeometry-]. ∀[P:Point ⟶ ℙ].  (IsConvex(x.P[x]) ∈ ℙ)

Lemma: geo-convex-intersection
[g:BasicGeometry]. ∀[T:Type].  ∀P:T ⟶ Point ⟶ ℙ((∀t:T. IsConvex(x.P[t;x]))  IsConvex(x.∀t:T. P[t;x]))

Lemma: oriented-plane-axioms
g:OrientedPlane. ∀P:OrientedPlane ⟶ ℙ.
  ((∀g:OrientedPlane. (BasicGeometryAxioms(g)  geo-left-axioms(g)  P[g]))  P[g])

Lemma: geo-left-convex
g:OrientedPlane. ∀a,b:Point.  IsConvex(x.x leftof ab)

Lemma: geo-left-antisymmetry
g:OrientedPlane. ∀a,b,c:Point.  (a leftof bc  leftof cb))

Lemma: geo-left-transitivity
g:OrientedPlane. ∀t,s,p,q,r:Point.
  (p leftof ts  leftof ts  leftof ts  leftof tp  leftof tq  leftof pt))

Lemma: geo-not-left-convex
g:OrientedPlane. ∀a,b:Point.  IsConvex(x.¬leftof ab)

Definition: geo-orientation
geo-orientation(g;a;b;c) ==  g."Lorsquashstable" c ⋅

Lemma: geo-orientation_wf
[g:EuclideanPlaneStructure]. ∀[a,b:Point]. ∀[c:{c:Point| bc} ].
  (geo-orientation(g;a;b;c) ∈ leftof bc ∨ leftof cb)

Definition: geo-isleft
isleft(a;b;c) ==  isl(geo-orientation(g;a;b;c))

Lemma: geo-isleft_wf
[g:EuclideanPlaneStructure]. ∀[a,b:Point]. ∀[c:{c:Point| bc} ].  (isleft(a;b;c) ∈ 𝔹)

Lemma: assert-geo-isleft
g:OrientedPlane. ∀a,b:Point. ∀c:{c:Point| bc} .  (↑isleft(a;b;c) ⇐⇒ leftof bc)

Lemma: bnot-isleft
g:OrientedPlane. ∀a,b:Point. ∀c:{c:Point| bc} .  ¬bisleft(a;b;c) isleft(a;c;b)

Lemma: isleft-symmetry
g:OrientedPlane. ∀a,b:Point. ∀c:{c:Point| bc} .  isleft(a;b;c) isleft(b;c;a)

Definition: geo-general-position
geo-general-position(g;xs) ==  ∀k:ℕ||xs||. ∀j:ℕk. ∀i:ℕj.  xs[k] xs[i]xs[j]

Lemma: geo-general-position_wf
[g:OrientedPlane]. ∀[xs:Point List].  (geo-general-position(g;xs) ∈ ℙ)

Lemma: geo-general-position-implies
g:OrientedPlane. ∀xs:{xs:Point List| geo-general-position(g;xs)} . ∀i,j,k:ℕ||xs||.
  ((¬(i j ∈ ℤ))  (k i ∈ ℤ))  (k j ∈ ℤ))  xs[i] xs[j]xs[k])

Definition: left-test
jk ==  isleft(xs[i];xs[j];xs[k])

Lemma: left-test_wf
[g:OrientedPlane]. ∀[xs:{xs:Point List| geo-general-position(g;xs)} ]. ∀[i:ℕ||xs||]. ∀[j:{j:ℕ||xs||| ¬(i j ∈ ℤ)} ].
[k:{k:ℕ||xs||| (k i ∈ ℤ)) ∧ (k j ∈ ℤ))} ].
  (i jk ∈ 𝔹)

Lemma: assert-left-test
g:OrientedPlane. ∀xs:{xs:Point List| geo-general-position(g;xs)} . ∀i:ℕ||xs||. ∀j:{j:ℕ||xs||| ¬(i j ∈ ℤ)} .
k:{k:ℕ||xs||| (k i ∈ ℤ)) ∧ (k j ∈ ℤ))} .
  (↑jk ⇐⇒ xs[i] leftof xs[j]xs[k])

Lemma: left-test-symmetry
g:OrientedPlane. ∀xs:{xs:Point List| geo-general-position(g;xs)} . ∀i:ℕ||xs||. ∀j:{j:ℕ||xs||| ¬(i j ∈ ℤ)} .
k:{k:ℕ||xs||| (k i ∈ ℤ)) ∧ (k j ∈ ℤ))} .
  jk ki

Lemma: bnot-left-test
g:OrientedPlane. ∀xs:{xs:Point List| geo-general-position(g;xs)} . ∀i:ℕ||xs||. ∀j:{j:ℕ||xs||| ¬(i j ∈ ℤ)} .
k:{k:ℕ||xs||| (k i ∈ ℤ)) ∧ (k j ∈ ℤ))} .
  ¬bjk kj

Definition: in-hull
ij ∈ Hull(xs) ==  ∀k:ℕ||xs||. ((¬(k i ∈ ℤ))  (k j ∈ ℤ))  (↑ij))

Lemma: in-hull_wf
[g:OrientedPlane]. ∀[xs:{xs:Point List| geo-general-position(g;xs)} ]. ∀[i,j:ℕ||xs||].
  ij ∈ Hull(xs) ∈ ℙ supposing ¬(i j ∈ ℤ)

Lemma: in-hull-unique1
[g:OrientedPlane]. ∀[xs:{xs:Point List| geo-general-position(g;xs)} ]. ∀[i,j,k:ℕ||xs||].
  (j k ∈ ℤsupposing (ik ∈ Hull(xs) and (i k ∈ ℤ)) and ij ∈ Hull(xs) and (i j ∈ ℤ)))

Lemma: in-hull-unique2
[g:OrientedPlane]. ∀[xs:{xs:Point List| geo-general-position(g;xs)} ]. ∀[i,j,k:ℕ||xs||].
  (j k ∈ ℤsupposing (ki ∈ Hull(xs) and (k i ∈ ℤ)) and ji ∈ Hull(xs) and (j i ∈ ℤ)))

Lemma: in-hull-unique3
[g:OrientedPlane]. ∀[xs:{xs:Point List| geo-general-position(g;xs)} ]. ∀[i,j,k:ℕ||xs||].
  ((((((¬(j k ∈ ℤ)) ∧ (j i ∈ ℤ))) ∧ (k i ∈ ℤ))) ∧ jk ∈ Hull(xs)) ∧ ji ∈ Hull(xs))  False)

Lemma: in-hull-transitivity
g:OrientedPlane. ∀xs:{xs:Point List| geo-general-position(g;xs)} . ∀i,j:ℕ||xs||.
  ((¬(i j ∈ ℤ))  ij ∈ Hull(xs)  Trans({k:ℕ||xs||| (k i ∈ ℤ)) ∧ (k j ∈ ℤ))} ;x,y.(¬(x y ∈ ℤ)) ∧ (↑iy)\000C))

Definition: find-hull
find-hull(g;xs) ==
  let L ⟵ [2, ||xs||)
  in eager-accum(hs,k.let p,q find_transitions(λx,y. xy;hs) 
                      in if isl(p) ∧b isl(q)
                         then hs
                         else eval outr(p) in
                              eval outr(q) in
                                if x <y
                                then let as ⟵ firstn(x 1;hs)
                                     in let bs ⟵ nth_tl(y;hs)
                                        in as [k bs]
                                else let as ⟵ firstn((x y) 1;nth_tl(y;hs))
                                     in [k as]
                                fi 
                         fi ;[0; 1];L)

Definition: hull-cmp
hull-cmp(g;xs;i;j) ==  λx,y. if (x =z y) then if ix then else -1 fi 

Lemma: hull-cmp_wf
[g:OrientedPlane]. ∀[xs:{xs:Point List| geo-general-position(g;xs)} ]. ∀[i,j:ℕ||xs||].
  (hull-cmp(g;xs;i;j) ∈ comparison({k:ℕ||xs||| (k i ∈ ℤ)) ∧ (k j ∈ ℤ))} )) supposing (ij ∈ Hull(xs) and (i j\000C ∈ ℤ)))

Lemma: in-hull-leftmost
g:OrientedPlane. ∀xs:{xs:Point List| geo-general-position(g;xs)} .
  (2 < ||xs||
   (∀i,j:ℕ||xs||.
        ((¬(i j ∈ ℤ))
         ij ∈ Hull(xs)
         (∃x:{k:ℕ||xs||| (k i ∈ ℤ)) ∧ (k j ∈ ℤ))} 
             ∀y:{k:ℕ||xs||| (k i ∈ ℤ)) ∧ (k j ∈ ℤ))} ((¬(x y ∈ ℤ))  (↑iy))))))

Lemma: in-hull-sorted
g:OrientedPlane. ∀xs:{xs:Point List| geo-general-position(g;xs)} . ∀i,j:ℕ||xs||.
  ((¬(i j ∈ ℤ))
   ij ∈ Hull(xs)
   (∃ps:{k:ℕ||xs||| (k i ∈ ℤ)) ∧ (k j ∈ ℤ))}  List
       (permutation({k:ℕ||xs||| (k i ∈ ℤ)) ∧ (k j ∈ ℤ))} ;ps;
                    filter(λk.((¬b(k =z i)) ∧b b(k =z j)));upto(||xs||)))
       ∧ sorted-by(λx,y. ((¬(x y ∈ ℤ))  (↑yi));ps))))

Lemma: in-hull-next
g:OrientedPlane. ∀xs:{xs:Point List| geo-general-position(g;xs)} . ∀i,j:ℕ||xs||.
  ((¬(i j ∈ ℤ))  ij ∈ Hull(xs)  (∃k:ℕ||xs||. ((¬(k i ∈ ℤ)) ∧ ki ∈ Hull(xs))))

Lemma: in-hull-unique-next
g:OrientedPlane. ∀xs:{xs:Point List| geo-general-position(g;xs)} . ∀i,j:ℕ||xs||.
  ((¬(i j ∈ ℤ))  ij ∈ Hull(xs)  (∃!k:ℕ||xs||. ((¬(k i ∈ ℤ)) ∧ ki ∈ Hull(xs))))

Lemma: in-hull-next2
g:OrientedPlane. ∀xs:{xs:Point List| geo-general-position(g;xs)} . ∀i,j:ℕ||xs||.
  ((¬(i j ∈ ℤ))  (ij ∈ Hull(xs) ∧ 2 < ||xs||)  (∃k:ℕ||xs||. (((¬(k i ∈ ℤ)) ∧ (k j ∈ ℤ))) ∧ ki ∈ Hull(xs))))

Lemma: in-hull-unique-next2
g:OrientedPlane. ∀xs:{xs:Point List| geo-general-position(g;xs)} . ∀i,j:ℕ||xs||.
  ((¬(i j ∈ ℤ))  (ij ∈ Hull(xs) ∧ 2 < ||xs||)  (∃!k:ℕ||xs||. (((¬(k i ∈ ℤ)) ∧ (k j ∈ ℤ))) ∧ ki ∈ Hull(xs))))

Lemma: Euclid-midpoint-1
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} .  (∃d:Point [a=d=b])

Definition: midpoint-construction
Mid(a;b) ==  geo-SS(e;b;a;CC(b;a;a;b);CC(a;b;b;a))

Lemma: midpoint-construction_wf
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} .  (Mid(a;b) ∈ {d:Point| a=d=b} )

Lemma: Euclid-midpoint
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} .  (∃d:Point [a=d=b])

Lemma: segment-density
e:EuclideanPlane. ∀a,b:Point.  ∃x:Point. B(axb)

Lemma: Euclid-Prop10
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} .  (∃d:Point [(a-d-b ∧ ad ≅ db)])

Lemma: Euclid-Prop10-ext
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} .  (∃d:Point [(a-d-b ∧ ad ≅ db)])

Lemma: segment-density-strict
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} .  (∃x:Point [a-x-b])

Definition: geo-isosceles
ISOΔ(a;b;c) ==  (ab ≅ ac ∧ abc ≅a acb) ∧ bc

Lemma: geo-isosceles_wf
[g1:EuclideanPlane]. ∀[a,b,c:Point].  (ISOΔ(a;b;c) ∈ ℙ)

Lemma: Euclid-Prop9
e:EuclideanPlane. ∀a,b:Point. ∀c:{c:Point| ba} .  ∃f:Point. acf ≅a bcf

Lemma: Euclid-Prop9-ext
e:EuclideanPlane. ∀a,b:Point. ∀c:{c:Point| ba} .  ∃f:Point. acf ≅a bcf

Lemma: euclid-Prop3
e:EuclideanPlane. ∀A:Point. ∀B:{B:Point| B} . ∀C1:Point. ∀C2:{C2:Point| C1 C2} .
  (|C1C2| < |AB|  (∃E:Point [(B(AEB) ∧ AE ≅ C1C2)]))

Lemma: euclid-Prop3-ext
e:EuclideanPlane. ∀A:Point. ∀B:{B:Point| B} . ∀C1:Point. ∀C2:{C2:Point| C1 C2} .
  (|C1C2| < |AB|  (∃E:Point [(B(AEB) ∧ AE ≅ C1C2)]))

Lemma: Euclid-Prop4
e:EuclideanPlane. ∀a,b,c,A,B,C:Point.
  ((Triangle(a;b;c) ∧ Triangle(A;B;C))
   (ab ≅ AB ∧ ac ≅ AC ∧ bac ≅a BAC)
   (bc ≅ BC ∧ abc ≅a ABC ∧ bca ≅a BCA ∧ Cong3(abc,ABC)))

Lemma: Euclid-Prop5_1
e:EuclideanPlane. ∀a,b,c:Point.  ((ab ≅ ac ∧ Triangle(a;b;c))  abc ≅a acb)

Lemma: Euclid-Prop5_1-not-tri
e:EuclideanPlane. ∀a,b,c:Point.  (b  ab ≅ ac  abc ≅a acb)

Lemma: Euclid-Prop5_2
e:EuclideanPlane. ∀a,b,c,x,y:Point.  ((ISOΔ(a;b;c) ∧ a-b-x ∧ a-c-y)  xbc ≅a ycb)

Lemma: Euclid-Prop5
e:EuclideanPlane. ∀a,b,c,x,y:Point.  (((ab ≅ ac ∧ bc) ∧ a-b-x ∧ a-c-y)  (abc ≅a acb ∧ xbc ≅a ycb))

Lemma: colinear-equidistant-points-exist
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀c:Point.
  ∃u,v:Point. (Colinear(a;b;u) ∧ Colinear(a;b;v) ∧ v ∧ cu ≅ cv)

Lemma: lsep-iff-all-sep
g:EuclideanPlane. ∀a,b,c:Point.  (a bc ⇐⇒ (∀x:Point. (Colinear(x;b;c)  x)) ∧ c)

Lemma: sep-if-all-lsep
g:EuclideanPlane. ∀a,b,c:Point.  (a bc  (∀x:Point. (Colinear(x;b;c)  x)))

Lemma: congruence-preserves-lsep
g:EuclideanPlane. ∀a,b,c,A,B,C:Point.  (ab ≅ AB  ac ≅ AC  bc ≅ BC  ab  (¬¬AB))

Lemma: lsep-colinear
g:EuclideanPlane. ∀p,a,b,x,y:Point.  (p ab   Colinear(x;a;b)  Colinear(y;a;b)  xy)

Lemma: out-preserves-lsep
g:EuclideanPlane. ∀a,b,c,b',c':Point.  (a bc  out(a bb')  out(a cc')  b'c')

Lemma: Euclid-erect-2perp
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀c:{c:Point| Colinear(a;b;c)} .
  ∃q:Point. (∃p:Point [(ab  ⊥pc ∧ ab  ⊥qc ∧ leftof ab ∧ leftof ba)])

Lemma: Euclid-erect-perp-on-same-side
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀c:{c:Point| Colinear(a;b;c)} . ∀q:{q:Point| ab} .
  (∃p:Point [(ab  ⊥pc ∧ ab ∧ (p leftof ab ⇐⇒ leftof ab))])

Lemma: Euclid-erect-perp
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀c:{c:Point| Colinear(a;b;c)} .  (∃p:Point [(ab  ⊥pc ∧ ab)])

Lemma: Euclid-erect-perp-ext
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀c:{c:Point| Colinear(a;b;c)} .  (∃p:Point [(ab  ⊥pc ∧ ab)])

Lemma: isosceles-sep-implies-lsep
e:EuclideanPlane. ∀a,b,x:Point.  (xa ≅ xb   (∀m:{m:Point| a=m=b} x)  ab)

Lemma: midpoint-of-equidistant-points-is-perp
e:EuclideanPlane. ∀u:Point. ∀v:{v:Point| v} . ∀c:{c:Point| uv} .  (cu ≅ cv  (∀m:Point. (u=m=v  uv  ⊥mc)))

Lemma: no-three-colinear-on-circle
[e:EuclideanPlane]. ∀[a:Point]. ∀[b:{b:Point| a} ]. ∀[c:{c:Point| a ∧ b ∧ Colinear(a;b;c)} ].
  ∀p:Point. (pa ≅ pb ∧ pb ≅ pc))

Lemma: Euclid-drop-perp-0
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀c:Point.
  ∃x:Point. (∃p:Point [(Colinear(p;x;c) ∧ ab  ⊥px ∧ ab ∧ c)])

Lemma: Euclid-drop-perp-0-ext
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀c:Point.
  ∃x:Point. (∃p:Point [(Colinear(p;x;c) ∧ ab  ⊥px ∧ ab ∧ c)])

Lemma: Euclid-drop-perp-00
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀c:Point.  ∃x,p:Point. (Colinear(p;x;c) ∧ ab  ⊥px ∧ ab ∧ c)

Lemma: Euclid-drop-perp-1
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀c:{c:Point| ∀x:Point. (Colinear(a;b;x)  x)} .
  ∃p:Point. (Colinear(a;b;p) ∧ ab  ⊥pc)

Lemma: Euclid-drop-perp
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀c:{c:Point| ab} .  (∃p:Point [(Colinear(a;b;p) ∧ ab  ⊥pc)])

Lemma: Euclid-drop-perp-ext
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀c:{c:Point| ab} .  (∃p:Point [(Colinear(a;b;p) ∧ ab  ⊥pc)])

Lemma: circle-not-colinear
e:EuclideanPlane. ∀a,b,c,d:Point.  (ab ≅ ac  ab ≅ ad     Colinear(b;c;d)))

Definition: circle-circumscription
circle-circumscription(e) ==  ∀a,b,c:Point.  (b ac  (∃m:Point. (am ≅ bm ∧ bm ≅ cm)))

Lemma: circle-circumscription_wf
[e:GeometryPrimitives]. (circle-circumscription(e) ∈ ℙ)

Definition: euclid5
euclid5(e) ==
  ∀P,Q,R,S,T,U:Point.  (P-T-Q  R-T-S  Q-U-R  QS  PT ≅ QT  RT ≅ ST  (∃I:Point. (S-Q-I ∧ P-U-I)))

Lemma: euclid5_wf
[e:BasicGeometry]. (euclid5(e) ∈ ℙ)

Definition: geo-intersect-points
ab \/ cd ==  b ∧ (∃x,y:{z:Point| Colinear(z;a;b)} (x leftof cd ∧ leftof dc))

Lemma: geo-intersect-points_wf
e:GeometryPrimitives. ∀a,b,c,d:Point.  (ab \/ cd ∈ ℙ)

Lemma: geo-intersect-points-iff
e:EuclideanPlane. ∀a,b,c,d:Point.
  (ab \/ cd
  ⇐⇒ b
      ∧ d
      ∧ (∃a1,b1,c1,d1,v:Point
          (a1-v-b1
          ∧ c1-v-d1
          ∧ Colinear(a1;a;b)
          ∧ Colinear(b1;a;b)
          ∧ Colinear(c1;c;d)
          ∧ Colinear(d1;c;d)
          ∧ a1 leftof c1d1
          ∧ b1 leftof d1c1)))

Lemma: geo-intersect-points-iff2
e:EuclideanPlane. ∀p1,p2,l1,l2:Point.
  (p1p2 \/ l1l2
  ⇐⇒ p1 p2
      ∧ l1 l2
      ∧ (∃a,b,c,d,v:Point
          (a-v-b
          ∧ c-v-d
          ∧ Colinear(a;p1;p2)
          ∧ Colinear(b;p1;p2)
          ∧ Colinear(c;l1;l2)
          ∧ Colinear(d;l1;l2)
          ∧ leftof cd
          ∧ leftof dc
          ∧ leftof ba
          ∧ leftof ab)))

Lemma: geo-intersect-points-symmetry
e:EuclideanPlane. ∀a,b,c,d:Point.  (ab \/ cd  cd \/ ab)

Definition: geo-parallel-points
geo-parallel-points(e;a;b;c;d) ==  (a b ∧ d) ∧ (∃x,y:{z:Point| Colinear(z;a;b)} (x leftof cd ∧ leftof dc)))

Lemma: geo-parallel-points_wf
e:GeometryPrimitives. ∀a,b,c,d:Point.  (geo-parallel-points(e;a;b;c;d) ∈ ℙ)

Lemma: geo-parallel-not-intersect
e:EuclideanPlane. ∀a,b,c,d:Point.  (geo-parallel-points(e;a;b;c;d)  ab \/ cd))

Lemma: geo-parallel-iff-not-intersect
e:EuclideanPlane. ∀a,b,c,d:Point.  (geo-parallel-points(e;a;b;c;d) ⇐⇒ (a b ∧ d) ∧ ab \/ cd))

Lemma: geo-parallel-points-implies
e:EuclideanPlane. ∀a,b,x,y:Point.
  (geo-parallel-points(e;a;b;x;y)
   (a b ∧ y)
   (∀x1,y1:{z:Point| Colinear(z;a;b)} .  (x1 leftof xy  y1 leftof yx))))

Lemma: geo-colinear-preserves-parallel
e:EuclideanPlane. ∀a,b,c,d,x:Point.
  (geo-parallel-points(e;a;b;c;d)  Colinear(a;b;x)   geo-parallel-points(e;a;x;c;d))

Lemma: geo-parallel-points-symmetry
e:EuclideanPlane. ∀a,b,c,d:Point.  (geo-parallel-points(e;a;b;c;d)  geo-parallel-points(e;c;d;a;b))

Lemma: geo-parallel-points-symmetry2
e:EuclideanPlane. ∀a,b,c,d:Point.
  (geo-parallel-points(e;a;b;c;d)
   (geo-parallel-points(e;b;a;c;d) ∧ geo-parallel-points(e;a;b;d;c) ∧ geo-parallel-points(e;b;a;d;c)))

Lemma: geo-colinear-preserves-parallel2
e:EuclideanPlane. ∀a,b,c,d,x,y:Point.
  (geo-parallel-points(e;a;b;c;d)
   Colinear(a;b;x)
   Colinear(c;d;y)
   y
   x
   geo-parallel-points(e;a;x;c;y))

Definition: geo-parallel
geo-parallel(e;a;b;c;d) ==  (a b ∧ d) ∧ (∀x:Point. (Colinear(a;b;x)  cd))

Lemma: geo-parallel_wf
e:EuclideanPlane. ∀a,b,c,d:Point.  (geo-parallel(e;a;b;c;d) ∈ ℙ)

Lemma: geo-parallel_functionality
e:EuclideanPlane. ∀a,b,c,d,a',b',c',d':Point.
  (a ≡ a'  b ≡ b'  c ≡ c'  d ≡ d'  geo-parallel(e;a;b;c;d)  geo-parallel(e;a';b';c';d'))

Lemma: geo-parallel-right-comm
e:EuclideanPlane. ∀a,b,c,d:Point.  (geo-parallel(e;a;b;c;d)  geo-parallel(e;a;b;d;c))

Lemma: geo-parallel-refl
e:EuclideanPlane. ∀a,b,c,d:Point.  (geo-parallel(e;a;b;c;d)  geo-parallel(e;a;b;c;d))

Lemma: geo-parallel-lsep-opp
e:EuclideanPlane. ∀a,b,c,d:Point.  (geo-parallel(e;a;b;c;d)  ab)

Lemma: geo-parallel-symmetry
e:EuclideanPlane. ∀a,b,c,d:Point.  (geo-parallel(e;a;b;c;d)  geo-parallel(e;c;d;a;b))

Lemma: colinear-preserves-parallel
e:EuclideanPlane. ∀a,b,c,d,y:Point.  ((geo-parallel(e;a;b;c;d) ∧ Colinear(c;d;y) ∧ y)  geo-parallel(e;a;b;c;y))

Lemma: geo-parallel-strict
e:EuclideanPlane. ∀a,b:Point.  (geo-parallel(e;a;b;a;b)  False)

Definition: TarskiPP
TarskiPP(e) ==  ∀a,b,c,d,t:Point.  (((B(adt) ∧ B(bdc)) ∧ d)  (∃x,y:Point. ((B(abx) ∧ B(acy)) ∧ B(xty))))

Lemma: TarskiPP_wf
[e:GeometryPrimitives]. (TarskiPP(e) ∈ ℙ)

Definition: PlayfairPP
PlayfairPP(eu) ==
  ∀a0,a1,b0,b1,c0,c1,p:Point.
    ((geo-parallel-points(eu;a0;a1;b0;b1) ∧ geo-parallel-points(eu;a0;a1;c0;c1))
     (Colinear(p;b0;b1) ∧ Colinear(p;c0;c1))
     (Colinear(c0;b0;b1) ∧ Colinear(c1;b0;b1)))

Lemma: PlayfairPP_wf
[e:EuclideanPlane]. (PlayfairPP(e) ∈ ℙ)

Lemma: Euclid-Prop7
e:EuclideanPlane. ∀a,b:Point. ∀c,d:{p:Point| leftof ab} .  (ac ≅ ad  bc ≅ bd  c ≡ d)

Lemma: Euclid-Prop7-aux
e:EuclideanPlane. ∀a,b:Point. ∀c,d:{p:Point| ¬leftof ba} .  (a  ac ≅ ad  bc ≅ bd  c ≡ d)

Lemma: Euclid-Prop7'
e:EuclideanPlane. ∀a,b,c,d:Point.  (a  ac ≅ ad  bc ≅ bd  leftof ba ⇐⇒ ¬leftof ba)  c ≡ d)

Lemma: geo-CC_functionality
[g:EuclideanPlane]. ∀[a,b:Point]. ∀[c:{c:Point| c} ]. ∀[d:{d:Point| StrictOverlap(a;b;c;d)} ]. ∀[a',b':Point].
[c':{c':Point| a' c'} ]. ∀[d':{d':Point| StrictOverlap(a';b';c';d')} ].
  (CC(a;b;c;d) ≡ CC(a';b';c';d')) supposing (d ≡ d' and c ≡ c' and b ≡ b' and a ≡ a')

Lemma: colinear-cong3
e:EuclideanPlane. ∀a,b,c,x,y:Point.
  (a  Colinear(a;b;c)  ab ≅ xy  (∃z:Point. (Colinear(x;y;z) ∧ Cong3(abc,xyz))))

Lemma: half-plane-point-exists
g:EuclideanPlane. ∀x,y:Point.  (x  (∃q:Point. leftof xy))

Lemma: zero-angles-congruent2
g:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (out(b ac)  out(y xz)  abc ≅a xyz)

Definition: geo-lt-angle
abc < xyz ==
  out(y xz))
  ∧ (∃p,p',x',z':Point. (abc ≅a xyp ∧ B(yp'p) ∧ (out(y xx') ∧ out(y zz')) ∧ B(xyp)) ∧ B(x'p'z') ∧ p' z'))

Lemma: geo-lt-angle_wf
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (abc < xyz ∈ ℙ)

Lemma: not-lt-zero-angle
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (abc < xyz  (B(yzx) ∨ B(yxz))  False)

Lemma: straight-angles-not-lt
g:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (a-b-c  x-y-z  abc < xyz))

Lemma: lt-angle-not-cong
e:EuclideanPlane. ∀x,y,z:Point.  xyz < xyz)

Lemma: cong-angle-out-exists-cong3
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.
  (abc ≅a xyz  (∃a',c':Point. (out(b a'a) ∧ out(b c'c) ∧ a'bc' ≅a xyz ∧ Cong3(a'bc',xyz))))

Lemma: congruence-preserves-right-angle2
e:BasicGeometry. ∀a,b,c:Point.  (Rabc  (∀a',b',c':Point.  (abc ≅a a'b'c'  Ra'b'c')))

Lemma: lsep-cong-angle-implies-sep
g:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (a bc  abc ≅a xyz  z)

Lemma: interior-point-preserves-cong-angle
g:EuclideanPlane. ∀a,b,c,x,y,z,p,q:Point.
  (abc ≅a xyz  B(aqc)  B(xpz)  Cong3(abc,xyz)  Cong3(aqc,xpz)  yz  abq ≅a xyp)

Lemma: interior-point-cong-angle-transfer
g:EuclideanPlane. ∀a,b,c,d,e,f,x,y,z:Point.
  (abc < xyz
   def ≅a xyz
   (x yz ∨ ef)
   (∃p',d',f':Point. (d'ep' ≅a abc ∧ B(d'p'f') ∧ p' f' ∧ out(e ff') ∧ out(e dd'))))

Lemma: interior-point-cong-angle-transfer-full
g:EuclideanPlane. ∀a,b,c,d,e,f,x,y,z:Point.
  (abc < xyz
   def ≅a xyz
   ef
   (∃p,p',d',f':Point. (d'ep ≅a abc ∧ B(d'p'f') ∧ p' f' ∧ (out(e dd') ∧ out(e ff')) ∧ B(ep'p) ∧ B(dep)))))

Lemma: geo-cong-angle-preserves-lt-angle2
g:EuclideanPlane. ∀a,b,c,d,e,f,x,y,z:Point.  (def ≅a xyz  abc < xyz  ef  abc < def)

Lemma: interior-implies-lt-angle
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.
  (x yz  leftof ba  (∃f:Point. ((f leftof ba ∧ leftof cb) ∧ abf ≅a xyz))  xyz < abc)

Lemma: Euclid-Prop6-lemma
e:EuclideanPlane. ∀a,b,c:Point.
  (cab ≅a cba
   ab
   (∃x:Point
       (Colinear(c;a;x) ∧ ax ≅ bc ∧ (c leftof ab  leftof ab) ∧ (c leftof ba  leftof ba) ∧ Cong3(axb,bca))))

Lemma: Euclid-Prop6
e:EuclideanPlane. ∀a,b,c:Point.  (c ab  cab ≅a cba  ca ≅ cb)

Lemma: right-angle-SAS
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.
  ((Rabc ∧ b ∧ c)  (Rxyz ∧ y ∧ z)  ab ≅ xy  bc ≅ yz  ac ≅ xz)

Lemma: geo-right-angles-congruent
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (((Rabc ∧ Rxyz) ∧ (x y ∧ z) ∧ b ∧ c)  abc ≅a xyz)

Lemma: adjacent-right-angles-supplementary
e:EuclideanPlane. ∀a,b,c,d:Point.  (c-b-d   (Rabc ⇐⇒ abc ≅a abd))

Lemma: hypotenuse-leg-congruence
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.
  (Rabc  Rxyz  ac ≅ xz  ab ≅ xy      bc ≅ yz)

Lemma: geo-reflected-right-triangles-congruent
e:BasicGeometry. ∀a,b,c,d:Point.  (a bc  Rcba  a=b=d  Cong3(abc,dbc))

Lemma: cong3-in-half-plane
e:EuclideanPlane. ∀a,b,c,x,y,u:Point.
  (c ab  xy  ab ≅ xy  (∃z:Point. (Cong3(abc,xyz) ∧ xy ∧ (u leftof xy ⇐⇒ leftof xy))))

Lemma: unique-angles-in-half-plane
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.
  (a bc
   yz
   ((∃f:Point. (acb ≅a fzy ∧ (x leftof yz ⇐⇒ leftof yz) ∧ (x leftof zy ⇐⇒ leftof zy)))
     ∧ (∀f1,f2:Point.
          ((acb ≅a f1zy ∧ acb ≅a f2zy)
           (((x leftof yz ⇐⇒ f1 leftof yz) ∧ (x leftof zy ⇐⇒ f1 leftof zy))
             ∧ (x leftof yz ⇐⇒ f2 leftof yz)
             ∧ (x leftof zy ⇐⇒ f2 leftof zy))
           Colinear(z;f1;f2)))))

Lemma: unique-angles-in-half-plane-better
e:EuclideanPlane. ∀a,b,c,q:Point.  (a leftof bc  leftof bc  qbc ≅a abc  out(b aq))

Lemma: unique-angles-in-half-plane-better2
e:EuclideanPlane. ∀a,b,c,q:Point.  (a leftof bc  leftof bc  qcb ≅a acb  out(c aq))

Lemma: opp-side_half-plane-angle-congruence
e:EuclideanPlane. ∀b,p,b',p',a,c,a',c':Point.
  ((a leftof bp ∧ leftof pb)  (a' leftof b'p' ∧ c' leftof p'b')  (abp ≅a a'b'p' ∧ pbc ≅a p'b'c')  abc ≅a a'b'c')

Lemma: adjacent-right-angles-supplementary-using-geom-tactic
e:EuclideanPlane. ∀a,b,c,d:Point.  (c-b-d   (Rabc ⇐⇒ abc ≅a abd))

Lemma: congruent-half-plane-angles-implies-right-angles
g:EuclideanPlane. ∀a,b,c,d:Point.  (c-b-d  cd  abc ≅a abd  {Rabd ∧ Rabc})

Lemma: straight-angles-congruent
g:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (a-b-c  x-y-z  abc ≅a xyz)

Lemma: Euclid-prop14
g:EuclideanPlane. ∀a,b,x,y:Point.  (a  leftof ab  leftof ba  Rxba  Ryba  Colinear(x;b;y))

Lemma: hp-right-angles-out
e:EuclideanPlane. ∀a,b,p1,p2:Point.
  (((Rbap1 ∧ Rbap2) ∧ p1 ab ∧ (p1 leftof ab ⇐⇒ p2 leftof ab) ∧ (p1 leftof ba ⇐⇒ p2 leftof ba))  out(a p1p2))

Lemma: out-implies-straightangle
e:EuclideanPlane. ∀a,b,c,a',b',c':Point.  (a' b'  c' b'  out(b ac)  (abc ≅a a'b'c' ⇐⇒ out(b' a'c')))

Lemma: between-implies-straightangle
e:EuclideanPlane. ∀a,b,c,a',b',c':Point.  (a-b-c  (abc ≅a a'b'c' ∧ a' b' ∧ b' c' ⇐⇒ a'-b'-c'))

Lemma: zero-angles-congruent
g:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (b   B(bac)  B(yxz)  abc ≅a xyz)

Lemma: angle-cong-preserves-straight-angle
g:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (B(xyz)  abc ≅a xyz  a-b-c)

Lemma: angle-cong-preserves-zero-angle
g:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (out(y xz)  abc ≅a xyz  out(b ac))

Lemma: geo-lt-angle-degenerate-case1
e:EuclideanPlane. ∀a,b,x,y,z:Point.  (a  x-y-z  aba < xyz)

Lemma: geo-lt-angle-degenerate-case2
e:EuclideanPlane. ∀a,b,x,y,z:Point.  (a  yz  aba < xyz)

Lemma: straight-angles-not-lt2
g:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (a-b-c  abc < xyz))

Lemma: cong-angle-preserves-lsep_weak
g:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (x yz  abc ≅a xyz  (¬¬bc))

Lemma: zero-angle-less-than-all
g:EuclideanPlane. ∀a,b,x,y,z:Point.  (a  yz  aba < xyz)

Lemma: perp-in-congruence
e:EuclideanPlane
  ∀[a,b,A,B,c,d,C,D:Point].
    (ad ≅ AD ∧ bd ≅ BD ∧ cd ≅ CD) supposing (ab  ⊥dc and AB  ⊥DC and bc ≅ BC and ac ≅ AC and ab ≅ AB)

Lemma: congruence-implies-between
e:EuclideanPlane
  ∀[a,b,c,d,A,B,C,D:Point].
    (B(ABC)) supposing 
       ((A   (A leftof BD ⇐⇒ leftof DB)) and 
       B(abc) and 
       and 
       bd ≅ BD and 
       ad ≅ AD and 
       cd ≅ CD and 
       bc ≅ BC and 
       ab ≅ AB)

Lemma: opp-side-congruence-lemma
e:EuclideanPlane
  ∀[a,b,A,B,c,d,C,D:Point].
    (cd ≅ CD) supposing 
       (C leftof AB and 
       leftof BA and 
       leftof ab and 
       leftof ba and 
       and 
       bd ≅ BD and 
       ad ≅ AD and 
       bc ≅ BC and 
       ac ≅ AC and 
       ab ≅ AB)

Lemma: opp-side_half-plane-angle-congruence-lemma
e:EuclideanPlane. ∀b,p,b',p',a,c,a',c',d:Point.
  ((a leftof bp ∧ leftof pb)
   (a' leftof b'p' ∧ c' leftof p'b')
   ((abp ≅a a'b'p' ∧ pbc ≅a p'b'c') ∧ (a-d-c ∧ out(b dp)) ∧ d)
   (∃a'',c'',d'':Point
       ((ba ≅ b'a'' ∧ (bc ≅ b'c'' ∧ bd ≅ b'd'') ∧ ad ≅ a''d'' ∧ dc ≅ d''c'' ∧ out(b' d''p')) ∧ B(a''d''c''))))

Lemma: use-plane-sep_strict
g:EuclideanPlane. ∀a,b,u,v:Point.  (u leftof ab  leftof ba  (∃x:Point. (Colinear(a;b;x) ∧ u-x-v)))

Lemma: plane-sep-imp-Opasch_left-strict
e:EuclideanPlane. ∀a,b:Point. ∀c:{c:Point| B(abc)} . ∀x:Point. ∀y:{y:Point| b-x-y} .
  (x leftof ab   (∃p:Point [(a-x-p ∧ c-p-y)]))

Lemma: outer-pasch-strict
e:EuclideanPlane. ∀a,b:Point. ∀c:{c:Point| B(abc)} . ∀x:Point. ∀y:{y:Point| b-x-y} .
  (x ab   (∃p:Point [(a-x-p ∧ c-p-y)]))

Lemma: geo-cong-angle-preserves-lt-angle
g:EuclideanPlane. ∀a,b,c,d,e,f,x,y,z:Point.  (abc ≅a def  abc < xyz  def < xyz)

Lemma: geo-out-preserves-lt-angle
e:EuclideanPlane. ∀a,b,c,a',c',x,y,z:Point.  (a bc  out(b aa')  out(b cc')  abc < xyz  a'bc' < xyz)

Lemma: geo-out-interior-point-exists
g:EuclideanPlane. ∀a,b,c,a',c',x:Point.
  (a bc
   out(b aa')
   out(b cc')
   a-x-c
   (∃x':Point. (((a'-x'-c' ∧ out(b xx')) ∧ abx ≅a a'bx') ∧ cbx ≅a c'bx')))

Lemma: geo-lt-angle-triangle-point-exists
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (abc < xyz  bc  yz  (∃p:Point. (x-p-z ∧ xyp ≅a abc)))

Lemma: lt-angle-not-cong2
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (abc < xyz  abc ≅a xyz))

Lemma: geo-lt-angle-trans
g:EuclideanPlane. ∀a,b,c,d,e,f,x,y,z:Point.  (abc < def  def < xyz  bc  ef  yz  abc < xyz)

Lemma: geo-lt-angle-symm
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.  (abc < def  ef  abc < fed)

Lemma: geo-lt-angle-symm2
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.  (abc < def  cba < def)

Lemma: geo-lt-angle_functionality
e:EuclideanPlane. ∀a,a',b,b',c,c',x,x',y,y',z,z':Point.
  (a ≡ a'  b ≡ b'  c ≡ c'  x ≡ x'  y ≡ y'  z ≡ z'  (abc < xyz ⇐⇒ a'b'c' < x'y'z'))

Lemma: geo-between-lt-angle
e:EuclideanPlane. ∀a,b,c,p:Point.  (a bc  b-p-c  bap < bac)

Lemma: lt-angle-irrefl
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (abc < xyz  xyz < abc))

Definition: hp-angle-sum
abc xyz ≅ def ==  ∃p,p',d',f':Point. (((abc ≅a dep ∧ fep ≅a xyz) ∧ B(ep'p)) ∧ (out(e dd') ∧ out(e ff')) ∧ d'-p'-f')

Lemma: hp-angle-sum_wf
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k:Point.  (abc xyz ≅ ijk ∈ ℙ)

Definition: angle-sum
abc def ≅a xyz ==  ∃p:Point. ((p leftof xy ∧ leftof yz) ∧ abc ≅a xyp ∧ def ≅a zyp)

Lemma: angle-sum_wf
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k:Point.  (abc xyz ≅a ijk ∈ ℙ)

Lemma: hp-angle-sum-functionality
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k,a',b',c',x',y',z',i',j',k':Point.
  (a ≡ a'
   b ≡ b'
   c ≡ c'
   x ≡ x'
   y ≡ y'
   z ≡ z'
   i ≡ i'
   j ≡ j'
   k ≡ k'
   (abc xyz ≅ ijk ⇐⇒ a'b'c' x'y'z' ≅ i'j'k'))

Lemma: angle-sum-functionality
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k,a',b',c',x',y',z',i',j',k':Point.
  (a ≡ a'
   b ≡ b'
   c ≡ c'
   x ≡ x'
   y ≡ y'
   z ≡ z'
   i ≡ i'
   j ≡ j'
   k ≡ k'
   (abc xyz ≅a ijk ⇐⇒ a'b'c' x'y'z' ≅a i'j'k'))

Lemma: hp-angle-sum-symm
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k:Point.  (abc xyz ≅ ijk  jk  xyz abc ≅ ijk)

Lemma: straight-angle-sum1
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k:Point.  (abc xyz ≅ ijk  a-b-c  out(y xz))

Lemma: straight-angle-sum1_symm
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k:Point.  (abc xyz ≅ ijk  x-y-z  out(b ac))

Lemma: straight-angle-sum2
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k:Point.  (abc xyz ≅ ijk  out(y xz)  (a-b-c ⇐⇒ i-j-k))

Lemma: straight-angle-sum2_symm
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k:Point.  (abc xyz ≅ ijk  out(b ac)  (x-y-z ⇐⇒ i-j-k))

Lemma: right-angle-sum
g:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k:Point.
  (a     Rabc  Rxyz  i-j-k  abc xyz ≅ ijk)

Lemma: hp-angle-sum-sep
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k:Point.  (abc xyz ≅ ijk  {i j ∧ k})

Lemma: hp-angle-sum-subst
g:EuclideanPlane. ∀a,b,c,d,e,f,x,y,z,i,j,k:Point.  (abc def ≅ xyz  abc ≅a ijk  ijk def ≅ xyz)

Lemma: hp-angle-sum-subst1
g:EuclideanPlane. ∀a,b,c,d,e,f,x,y,z,i,j,k:Point.  (abc def ≅ xyz  def ≅a ijk  abc ijk ≅ xyz)

Lemma: hp-angle-sum-eq
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k,a',b',c',x',y',z',i',j',k':Point.
  (abc ≅a a'b'c'
   xyz ≅a x'y'z'
   abc xyz ≅ ijk
   a'b'c' x'y'z' ≅ i'j'k'
   jk
   i' j'k'
   ijk ≅a i'j'k')

Lemma: hp-angle-sum-subst2
g:EuclideanPlane. ∀a,b,c,d,e,f,x,y,z,i,j,k:Point.  (abc def ≅ xyz  abc ≅a ijk  ijk def ≅ xyz)

Lemma: hp-angle-sum-subst3
g:EuclideanPlane. ∀a,b,c,d,e,f,x,y,z,i,j,k:Point.  (abc def ≅ xyz  xyz ≅a ijk  yz  abc def ≅ ijk)

Definition: heyting-geometry
HeytingGeometry ==  EuclideanPlane

Lemma: heyting-geometry_wf
HeytingGeometry ∈ 𝕌'

Lemma: heyting-geometry-subtype
HeytingGeometry ⊆EuclideanPlane

Definition: geo-triangle
bc ==  bc

Lemma: geo-triangle_wf
[e:GeometryPrimitives]. ∀[a,b,c:Point].  (a bc ∈ ℙ)

Lemma: sq_stable__geo-triangle
e:EuclideanPlaneStructure. ∀a,b,c:Point.  SqStable(a bc)

Lemma: not-geo-triangle-iff-colinear
e:HeytingGeometry. ∀a,b,c:Point.  bc ⇐⇒ Colinear(a;b;c))

Lemma: geo-not-triangle
e:HeytingGeometry. ∀a,b,c:Point.  ((¬bc)  ((¬B(abc)) ∧ B(bca)) ∧ B(cab)))))

Lemma: heyting-not-not-inner-pasch
e:HeytingGeometry. ∀a,b,c:Point. ∀p:{p:Point| B(apc)} . ∀q:{q:Point| B(bqc)} .  (¬¬(∃x:Point. (B(pxb) ∧ B(qxa))))

Lemma: geo-triangle-implies
e:HeytingGeometry. ∀a,b,c:Point.
  (a bc  {c ba ∧ ab ∧ c ∧ B(abc)) ∧ (∀z:Point. (z  Colinear(a;b;z)  bc))})

Lemma: geo-triangle-colinear
e:HeytingGeometry. ∀a,b,c,z:Point.  (a bc   Colinear(a;b;z)  bc)

Lemma: geo-triangle-symmetry
e:HeytingGeometry. ∀a,b,c:Point.  (a bc  {b ca ∧ ab ∧ cb ∧ ac ∧ ba})

Lemma: geo-triangle-colinear'
e:HeytingGeometry. ∀a,b,c,x,z:Point.  (a bc   Colinear(a;b;x)   Colinear(x;c;z)  bc)

Lemma: geo-triangle-colinear2
e:HeytingGeometry. ∀a,b,c,x,y:Point.  (a bc   Colinear(a;b;x)   Colinear(b;c;y)  yc)

Lemma: geo-triangle-colinear3
e:HeytingGeometry. ∀a,b,c,x,y,z:Point.
  (a bc   Colinear(a;b;x)   Colinear(b;c;y)   Colinear(c;x;z)  yz)

Lemma: geo-triangle-property
e:HeytingGeometry. ∀a,b,c:Point.  (a bc  {a b ∧ c ∧ a ∧ a-b-c) ∧ b-c-a) ∧ c-a-b)})

Lemma: geo-triangle-property2
e:HeytingGeometry. ∀a,b,c:Point.  (a bc  {(¬B(abc)) ∧ B(bca)) ∧ B(cab))})

Lemma: geo-triangle_functionality
e:HeytingGeometry. ∀a1,a2,b1,b2,c1,c2:Point.  (a1 ≡ a2  b1 ≡ b2  c1 ≡ c2  (a1 b1c1 ⇐⇒ a2 b2c2))

Lemma: geo-triangle-separation
e:HeytingGeometry. ∀a,b,c:Point.
  (a bc
   {∀x,y:Point.  (((Colinear(a;b;x) ∧ Colinear(c;b;y)) ∧ b ∧ b)  (x by ∧ (∀m:Point. (x-m-y  b))))})

Lemma: geo-inner-pasch-ex
e:HeytingGeometry. ∀a,b:Point. ∀c:{c:Point| ab} . ∀p,q:Point.  (a-p-c  b-q-c  (∃x:Point. (b-x-p ∧ a-x-q)))

Lemma: geo-inner-pasch-ex2
e:HeytingGeometry. ∀a,b:Point. ∀c:{c:Point| ab} . ∀p,q:Point.  (a-p-c  b-q-c  (∃x:Point. (B(bxp) ∧ B(axq))))

Lemma: geo-segments-cross
e:HeytingGeometry. ∀p,b,q,a:Point.  ((∃c:Point. (a-p-c ∧ b-q-c ∧ ab))  (∃x:Point. (p-x-b ∧ q-x-a)))

Lemma: geo-triangle-same-line
e:HeytingGeometry. ∀x,a:Point. ∀b:{b:Point| b} . ∀c:Point. ∀d:{d:Point| d} .
  (line(a;b)=line(c;d)  {x ab ⇐⇒ cd})

Lemma: geo-triangles-between
e:HeytingGeometry. ∀a,b,c,p,q:Point.  (a bc  b-p-a  b-q-c  bq)

Lemma: cong-angle-out-aux
g:HeytingGeometry. ∀a,b,c,d,e,f,a',c',d',f':Point.
  ((a bc ∧ abc ≅a def)
   ef
   out(b a'a)
   out(b c'c)
   out(e d'd)
   out(e f'f)
   ba' ≅ ed'
   bc' ≅ ef'
   a'c' ≅ d'f')

Lemma: cong-angle-out-aux-weak
g:HeytingGeometry. ∀a,b,c,d,e,f,a',c',d',f':Point.
  (abc ≅a def  out(b a'a)  out(b c'c)  out(e d'd)  out(e f'f)  ba' ≅ ed'  bc' ≅ ef'  a'c' ≅ d'f')

Lemma: cong-angle-out-aux2
g:HeytingGeometry. ∀a,b,c,d,e,f,a',c',d',f':Point.
  ((a bc ∧ a'c' ≅ d'f')
   ef
   out(b a'a)
   out(b c'c)
   out(e d'd)
   out(e f'f)
   ba' ≅ ed'
   bc' ≅ ef'
   abc ≅a def)

Lemma: cong-angle-out-aux2-weak
g:HeytingGeometry. ∀a,b,c,d,e,f,a',c',d',f':Point.
  (a'c' ≅ d'f'  out(b a'a)  out(b c'c)  out(e d'd)  out(e f'f)  ba' ≅ ed'  bc' ≅ ef'  abc ≅a def)

Lemma: geo-out-triangle
e:HeytingGeometry. ∀a,b,c,a',c':Point.  (b ac  (out(b aa') ∧ out(b cc'))  a'c')

Lemma: cong-angle-out-exists-aux3
e:HeytingGeometry. ∀a,b,c,x,y,z:Point.
  ((∃a',c',x',z':Point
     ((Cong3(a'bc',x'yz') ∧ a'c' ∧ x'z') ∧ out(b a'a) ∧ out(b c'c) ∧ out(y x'x) ∧ out(y z'z)))
   abc ≅a xyz)

Lemma: cong-angle-out-exists-aux3-weak
e:HeytingGeometry. ∀a,b,c,x,y,z:Point.
  ((∃a',c',x',z':Point. (Cong3(a'bc',x'yz') ∧ out(b a'a) ∧ out(b c'c) ∧ out(y x'x) ∧ out(y z'z)))  abc ≅a xyz)

Lemma: sup-angles-preserve-congruence
e:HeytingGeometry. ∀a,b,c,x,y,z,a',x':Point.  ((abc ≅a xyz ∧ bc ∧ yz)  a-b-a'  x-y-x'  a'bc ≅a x'yz)

Lemma: vert-angles-congruent
e:HeytingGeometry. ∀b,a,a',c,c':Point.  (a-b-a'  c-b-c'  bc  abc ≅a a'bc')

Lemma: double-pasch-exists
e:HeytingGeometry. ∀a,b,c,a',b',p:Point.  (a-b-c  a'-b'-c  a-p-a'  aa'  (∃q:Point. (p-q-c ∧ b-q-b')))

Lemma: geo-tar-opp-side-mid1
e:HeytingGeometry. ∀a,c,r,m:Point.
  (geo-tar-opp-side(e;a;c;r;m)  a=m=c  (∀b:Point. (r-a-b  geo-tar-opp-side(e;b;c;r;m))))

Lemma: segment-intersection
e:HeytingGeometry. ∀a,b,c:Point.  (c ab  (∃p,q:Point. (Colinear(a;b;p) ∧ c-p-q)))

Lemma: isosceles-mid-between
e:HeytingGeometry. ∀a,b,c,p,q,r,x:Point.
  (a bc  B(apb)  B(cqb)  p=x=q  a=r=c  a=p=b  c=q=b  pb ≅ qb  b-x-r)

Lemma: isosceles-mid-exists
e:HeytingGeometry. ∀a,b,c:Point.  (a bc  ab ≅ cb  (∃x:Point. a=x=c))

Lemma: isosceles-mid-cong-angles
e:HeytingGeometry. ∀a,b,c,m:Point.  (c ab  a=m=b  ac ≅ bc  acm ≅a bcm)

Lemma: isosc-bisectors-between
e:HeytingGeometry. ∀a,b,c,m,a',b',m':Point.
  (c ab  ac ≅ bc  (c-a-a' ∧ b'-b-c)  a=m=b  a'=m'=b'  aa' ≅ bb'  c-m-m')

Lemma: isosc-bisectors-between_1
e:HeytingGeometry. ∀a,b,c,m,a',b',m':Point.
  (c ab  ac ≅ bc  (c-a'-a ∧ c-b'-b)  a=m=b  a'=m'=b'  aa' ≅ bb'  c-m'-m)

Lemma: isosc-bisectors-between-ns
e:HeytingGeometry. ∀a,b,c,m,a',b',m':Point.
  (c ab  ac ≅ bc  (B(caa') ∧ B(b'bc))  a=m=b  a'=m'=b'  aa' ≅ bb'  B(cmm'))

Lemma: isosc-bisectors-between_1-ns
e:HeytingGeometry. ∀a,b,c,m,a',b',m':Point.
  (c a'b'  ac ≅ bc  (B(ca'a) ∧ B(cb'b))  a=m=b  a'=m'=b'  aa' ≅ bb'  B(cm'm))

Lemma: isosc-colinear-mid-exists
e:HeytingGeometry. ∀a,b,c,m,a',b',m':Point.
  (c ab  ac ≅ bc  (out(c aa') ∧ out(c bb'))  a=m=b  a'c ≅ b'c  (∃m':Point. (out(c m'm) ∧ a'=m'=b')))

Lemma: not-perp-point-construction
e:HeytingGeometry. ∀a,b,c:Point.
  (a bc  (∃c',b':Point. ((c=c'=b' ∧ ab' ≅ ac) ∧ Colinear(a;b';b) ∧ c'b' ∧ Rac'b')))

Lemma: not-perp-point-construction-between
e:HeytingGeometry. ∀a,b,c:Point.  (a bc  (∃c',b':Point. ((c=c'=b' ∧ ab' ≅ ac) ∧ b-a-b' ∧ c'b' ∧ Rac'b')))

Lemma: perp-aux1
e:HeytingGeometry. ∀a,b,c,p,q,r:Point.  (a bc  a-p-b  c-q-b  a-r-c  (∃y:Point. (p-y-c ∧ q-y-r)))

Lemma: perp-aux2
e:HeytingGeometry. ∀a,b,c,p,q,r:Point.  (a bc  a-p-b  c-q-b  a-r-c  qr)

Lemma: perp-aux-separations
e:HeytingGeometry. ∀a,b,c,x,c1,c',p:Point.
  ((((c ba ∧ ab  ⊥cx) ∧ x)
  ∧ ((c=a=c1 ∧ c=x=c') ∧ c'a ≅ ca)
  ∧ c' c1a
  ∧ ((a cc' ∧ c1=p=c') ∧ ab  ⊥pa)
  ∧ ab)
   ((c' c1 ∧ x ∧ (c' x ∧ c1 p) ∧ c' p ∧ c1) ∧ c'c1))

Lemma: erected-perp-opp-side-triangle
e:HeytingGeometry. ∀a,b,c,p,t:Point.
  ((c ba ∧ ((ab ⊥ pa ∧ Colinear(a;b;t)) ∧ p-t-c) ∧ ba)  geo-tar-opp-side(e;p;c;a;b))

Lemma: geo-double-pasch-same-point
e:HeytingGeometry. ∀A,B,C,d,f,g,x,y:Point.
  (A BC  A-d-C  A-g-B  B-f-C  C-x-g  C-y-g  B-x-d  B-y-d  A-x-f  A-y-f  x ≡ y)

Lemma: p5-triangles
e:HeytingGeometry. ∀a,b,c:Point.  (a bc  ab ≅ cb  (bac ≅a bca ∧ (∀p,q:Point.  ((b-a-p ∧ b-c-q)  pac ≅a qca))))

Lemma: p4-triangles
e:HeytingGeometry. ∀a,b,c,x,y,z:Point.
  (a bc  yz  ab ≅ xy  ac ≅ xz  bac ≅a yxz  ((bc ≅ yz ∧ Cong3(abc,xyz)) ∧ abc ≅a xyz ∧ bca ≅a yzx))

Lemma: p6-aux-bet-preserves-angle
e:HeytingGeometry. ∀a,b,c,d:Point.  (a bc  (B(adb) ∧ d)  cab ≅a cad)

Lemma: p9-tarski-aux
e:HeytingGeometry. ∀a,b,c:Point.  (a bc  ab ≅ cb  (∃x:Point. a=x=c))

Lemma: triangle-separation-lemma
e:HeytingGeometry. ∀A,B,C:Point.  (A BC  CA ≅ CB  (∃P:Point. (C-A-P ∧ B)))

Lemma: geo-congruent-mid-exists
e:HeytingGeometry. ∀A,B,C:Point.  (A BC  CA ≅ CB  (∃x:Point. A=x=B))

Lemma: tarski-perp-exists
e:HeytingGeometry. ∀a,b,c:Point.  (a bc  (∃x:Point. (Colinear(a;b;x) ∧ ab ⊥ cx)))

Lemma: tarski-perp-in-exists
e:HeytingGeometry. ∀a,b,c:Point.  (a bc  (∃x:Point. (Colinear(a;b;x) ∧ ab  ⊥cx)))

Lemma: perp-aux-general-construction
e:HeytingGeometry. ∀a,b,c,x:Point.
  (((c ba ∧ ab  ⊥cx) ∧ x)
   (∃c1,c',p:Point. (((c=a=c1 ∧ c=x=c') ∧ c'a ≅ ca) ∧ c' c1a ∧ ((a cc' ∧ c1=p=c') ∧ ab  ⊥pa) ∧ ab)))

Lemma: tarski-erect-perp1
e:HeytingGeometry. ∀a,b,c:Point.  (c ba  (∃p,t,d:Point. ((ab ⊥ pa ∧ Colinear(a;b;t)) ∧ p-t-d)))

Lemma: tarski-erect-perp-in
e:HeytingGeometry. ∀a,b,c:Point.  (c ba  (∃p:Point. (ab  ⊥pa ∧ ab)))

Lemma: tarski-erect-perp-in-side
e:HeytingGeometry. ∀a,b,c:Point.
  (c ba  (∃p,t,d:Point. ((((ab  ⊥pa ∧ Colinear(a;b;t)) ∧ p-t-d) ∧ geo-tar-same-side(e;c;d;a;b)) ∧ ba)))

Lemma: tarski-erect-perp-same-side
e:HeytingGeometry. ∀a,b,c:Point.
  (c ba  (∃p,t,d:Point. (((ab ⊥ pa ∧ Colinear(a;b;t)) ∧ p-t-d) ∧ geo-tar-same-side(e;c;d;a;b))))

Lemma: tarski-erect-perp-same-side2
e:HeytingGeometry. ∀a,b,c:Point.
  (c ba  (∃p,t,d:Point. ((((ab ⊥ pa ∧ Colinear(a;b;t)) ∧ p-t-d) ∧ geo-tar-same-side(e;c;d;a;b)) ∧ ba)))

Lemma: tarski-erect-perp-or
e:HeytingGeometry. ∀a,b,c:Point.  (c ba  (∃p,t:Point. (((ab ⊥ pa ∨ ab ⊥ pb) ∧ Colinear(a;b;t)) ∧ p-t-c)))

Lemma: Euclid-prop13
g:EuclideanPlane. ∀a,b,c,d:Point.  (c-b-d  cd  abc abd ≅ cbd)

Definition: mk-eu
primitive=e
Ssquashstable=Sstab
Lorsquashstable=Lstab
SepOr=Gtor
nontriv=nontriv
SS=SS
SC=SC
CC=CC ==
  e["Ssquashstable" := Sstab]["Lorsquashstable" := Lstab]["SepOr" := Gtor]["nontrivial" := nontriv]["SS" := SS]
  ["SS" := SS]["SC" := SC]["CC" := CC]

Lemma: mk-eu_wf
[self:GeometryPrimitives]. ∀[Sstab:∀a,b,c,d:Point.  SqStable(ab>cd)]. ∀[Lstab:∀a,b,c:Point.  SqStable(a bc)].
[Sepor:∀a:Point. ∀b:{b:Point| b} . ∀c:Point.  (a c ∨ c)]. ∀[nontriv:∃a:Point. (∃b:Point [a b])].
[SS:∀a,b:Point. ∀u:{u:Point| leftof ab} . ∀v:{v:Point| leftof ba} .  (∃x:Point [(Colinear(a;b;x) ∧ B(uxv))])].
[SC:∀c,d,a:Point. ∀b:{b:Point| a ∧ B(cbd)} .  (∃u:Point [(cu ≅ cd ∧ B(abu) ∧ (b  u))])].
[CC:∀a,b:Point. ∀c:{c:Point| c} . ∀d:{d:Point| StrictOverlap(a;b;c;d)} .
       (∃u:Point [(ab ≅ au ∧ cd ≅ cu ∧ leftof ac)])].
  (primitive=self
   Ssquashstable=Sstab
   Lorsquashstable=Lstab
   SepOr=Sepor
   nontriv=nontriv
   SS=SS
   SC=SC
   CC=CC ∈ EuclideanPlaneStructure)

Lemma: mk-eu_wf2
[self:GeometryPrimitives]. ∀[Sstab:∀a,b,c,d:Point.  SqStable(ab>cd)]. ∀[Lstab:∀a,b,c:Point.  SqStable(a bc)].
[Sepor:∀a:Point. ∀b:{b:Point| b} . ∀c:Point.  (a c ∨ c)]. ∀[nontriv:∃a:Point. (∃b:Point [a b])].
[SS:∀a,b:Point. ∀u:{u:Point| leftof ab} . ∀v:{v:Point| leftof ba} .  (∃x:Point [(Colinear(a;b;x) ∧ B(uxv))])].
[SC:∀c,d,a:Point. ∀b:{b:Point| a ∧ B(cbd)} .  (∃u:Point [(cu ≅ cd ∧ B(abu) ∧ (b  u))])].
[CC:∀a,b:Point. ∀c:{c:Point| c} . ∀d:{d:Point| StrictOverlap(a;b;c;d)} .
       (∃u:Point [(ab ≅ au ∧ cd ≅ cu ∧ leftof ac)])].
  primitive=self
  Ssquashstable=Sstab
  Lorsquashstable=Lstab
  SepOr=Sepor
  nontriv=nontriv
  SS=SS
  SC=SC
  CC=CC ∈ EuclideanPlane 
  supposing BasicGeometryAxioms(self)

Definition: pgeo-point
Point ==  p."Point"

Definition: pgeo-line
Line ==  p."Line"

Definition: pgeo-primitives
ProjGeomPrimitives ==  "Point":Type"Line":Type"PS":Point ⟶ Line ⟶ ℙ

Lemma: pgeo-primitives_wf
ProjGeomPrimitives ∈ 𝕌'

Definition: mk-pgeo-prim
points=P lines=L plsep=S ==  λx.x["Point" := P]["Line" := L]["PS" := S]

Lemma: mk-pgeo-prim_wf
[P,L:Type]. ∀[S:P ⟶ L ⟶ ℙ].  (points=P lines=L plsep=S ∈ ProjGeomPrimitives)

Lemma: pgeo-point_wf
[g:ProjGeomPrimitives]. (Point ∈ Type)

Lemma: pgeo-line_wf
[g:ProjGeomPrimitives]. (Line ∈ Type)

Definition: pgeo-plsep
pgeo-plsep(p; a; b) ==  p."PS" b

Lemma: pgeo-plsep_wf
[p:ProjGeomPrimitives]. ∀[a:Point]. ∀[b:Line].  (pgeo-plsep(p; a; b) ∈ ℙ)

Definition: pgeo-dual-prim
pg* ==  points=Line lines=Point plsep=λl,p. pgeo-plsep(pg; p; l)

Lemma: pgeo-dual-prim_wf
[pg:ProjGeomPrimitives]. (pg* ∈ ProjGeomPrimitives)

Definition: pgeo-incident
==  ¬pgeo-plsep(g; a; b)

Lemma: pgeo-incident_wf
[g:ProjGeomPrimitives]. ∀[a:Point]. ∀[b:Line].  (a b ∈ ℙ)

Lemma: sq_stable__pgeo-incident
[g:ProjGeomPrimitives]. ∀[a:Point]. ∀[b:Line].  SqStable(a b)

Definition: pgeo-psep
a ≠ ==  ∃l:Line. (a l ∧ pgeo-plsep(p; b; l))

Lemma: pgeo-psep_wf
[p:ProjGeomPrimitives]. ∀[a,b:Point].  (a ≠ b ∈ ℙ)

Definition: pgeo-lsep
l ≠ ==  ∃a:Point. (a l ∧ pgeo-plsep(p; a; m))

Lemma: pgeo-lsep_wf
[p:ProjGeomPrimitives]. ∀[a,b:Line].  (a ≠ b ∈ ℙ)

Definition: pgeo-lpsep
a ≠ ==  pgeo-plsep(p; b; a)

Lemma: pgeo-lpsep_wf
[p:ProjGeomPrimitives]. ∀[a:Line]. ∀[b:Point].  (a ≠ b ∈ ℙ)

Lemma: pgeo-lpsep-dual
[p,l,b:Top].  (l ≠ pgeo-plsep(p*; l; b))

Definition: pgeo-peq
a ≡ ==  ¬a ≠ b

Lemma: pgeo-peq_wf
[g:ProjGeomPrimitives]. ∀[a,b:Point].  (a ≡ b ∈ ℙ)

Lemma: sq_stable__pgeo-peq
[g:ProjGeomPrimitives]. ∀[c,d:Point].  SqStable(c ≡ d)

Definition: pgeo-leq
a ≡ ==  ¬a ≠ b

Lemma: pgeo-leq_wf
[g:ProjGeomPrimitives]. ∀[a,b:Line].  (a ≡ b ∈ ℙ)

Definition: basic-pgeo-axioms
BasicProjectiveGeometryAxioms(g) ==
  ∀m,l:Line. ∀p,q:Point.  (p     ((¬p ≡ q) ∧ l ≡ m))))

Lemma: basic-pgeo-axioms_wf
[g:ProjGeomPrimitives]. (BasicProjectiveGeometryAxioms(g) ∈ ℙ)

Lemma: sq_stable-pgeo-axioms-if
[g:ProjGeomPrimitives]
  ((∀a:Point. ∀L:Line.  SqStable(pgeo-plsep(g; a; L)))  SqStable(BasicProjectiveGeometryAxioms(g)))

Definition: projective-plane-structure
ProjectivePlaneStructure ==
  ProjGeomPrimitives
  "Ssquashstable":∀l:Line. ∀a:Point.  SqStable(pgeo-plsep(self; a; l))
  "PLSepOr":∀a:Point. ∀l:{l:Line| pgeo-plsep(self; a; l)} . ∀m:Line.  (pgeo-plsep(self; a; m) ∨ m ≠ l)
  "LPSepOr":∀l:Line. ∀a:{a:Point| l ≠ a} . ∀b:Point.  (pgeo-plsep(self; b; l) ∨ b ≠ a)
  "join":∀a,b:Point.  (a ≠  (∃l:Line. (a l ∧ l)))
  "meet":∀l,m:Line.  (l ≠  (∃a:Point. (a l ∧ m)))
  "three-points":∀l:Line. ∃a,b,c:Point. (a l ∧ l ∧ l ∧ a ≠ b ∧ b ≠ c ∧ c ≠ a)
  "three-lines":∀a:Point. ∃l,m,n:Line. (a l ∧ m ∧ n ∧ l ≠ m ∧ m ≠ n ∧ n ≠ l)

Lemma: projective-plane-structure_wf
ProjectivePlaneStructure ∈ 𝕌'

Lemma: projective-plane-structure_subtype
ProjectivePlaneStructure ⊆ProjGeomPrimitives

Definition: projective-plane-structure-complete
ProjectivePlaneStructureComplete ==  ProjectivePlaneStructure"non-trivial":∃p:Point. p ≡ p

Lemma: projective-plane-structure-complete_wf
ProjectivePlaneStructureComplete ∈ 𝕌'

Lemma: projective-plane-structure-complete_subtype
ProjectivePlaneStructureComplete ⊆ProjectivePlaneStructure

Lemma: sq_stable__pgeo-plsep
p:ProjectivePlaneStructure. ∀a:Point. ∀b:Line.  SqStable(pgeo-plsep(p; a; b))

Definition: mk-pgeo
mk-pgeo(p; ss; por; lor; j; m; p3; l3) ==
  p["Ssquashstable" := ss]["PLSepOr" := por]["LPSepOr" := lor]["join" := j]["meet" := m]["three-points" := p3]
  ["three-lines" := l3]

Lemma: mk-pgeo_wf
[self:ProjGeomPrimitives]. ∀[ss:∀l:Line. ∀a:Point.  SqStable(pgeo-plsep(self; a; l))]. ∀[por:∀a:Point. ∀l:{l:Line| 
                                                                                                            pgeo-plsep
                                                                                                              (self;
                                                                                                               a;
                                                                                                               l)} .
                                                                                              ∀m:Line.
                                                                                                (pgeo-plsep(self; a; m)
                                                                                                ∨ m ≠ l)].
[lor:∀l:Line. ∀a:{a:Point| l ≠ a} . ∀b:Point.  (pgeo-plsep(self; b; l) ∨ b ≠ a)]. ∀[j:∀a,b:Point.
                                                                                        (a ≠ b
                                                                                         (∃l:Line. (a l ∧ l)))].
[m:∀l,m:Line.  (l ≠  (∃a:Point. (a l ∧ m)))]. ∀[p3:∀l:Line
                                                                ∃a,b,c:Point
                                                                 (a l ∧ l ∧ l ∧ a ≠ b ∧ b ≠ c ∧ c ≠ a)].
[l3:∀a:Point. ∃l,m,n:Line. (a l ∧ m ∧ n ∧ l ≠ m ∧ m ≠ n ∧ n ≠ l)].
  (mk-pgeo(self; ss; por; lor; j; m; p3; l3) ∈ ProjectivePlaneStructure)

Definition: mk-complete-pgeo
mk-complete-pgeo(pg;p) ==  pg["non-trivial" := <p, λx.x>]

Lemma: mk-complete-pgeo_wf
[pg:ProjectivePlaneStructure]. ∀[p:Point].  (mk-complete-pgeo(pg;p) ∈ ProjectivePlaneStructureComplete)

Definition: pgeo-dual
pg* ==
  mk-pgeo(pg*;
          λp,l. (pg."Ssquashstable" p);
          pg."LPSepOr";
          pg."PLSepOr";
          pg."meet";
          pg."join";
          pg."three-lines";
          pg."three-points")

Lemma: pgeo-dual_wf
[pg:ProjectivePlaneStructure]. (pg* ∈ ProjectivePlaneStructure)

Definition: complete-pgeo-dual
complete-pgeo-dual(pg;l) ==  mk-complete-pgeo(pg*;l)

Lemma: complete-pgeo-dual_wf
[pg:ProjectivePlaneStructure]. ∀[l:Line].  (complete-pgeo-dual(pg;l) ∈ ProjectivePlaneStructureComplete)

Definition: pgeo-PLSepOr
PLSepOr(a;l;m) ==  g."PLSepOr" m

Lemma: pgeo-PLSepOr_wf
g:ProjectivePlaneStructure. ∀a:Point. ∀l:{l:Line| pgeo-plsep(g; a; l)} . ∀m:Line.
  (PLSepOr(a;l;m) ∈ pgeo-plsep(g; a; m) ∨ m ≠ l)

Definition: pgeo-LPSepOr
LPSepOr(l;p;q) ==  g."LPSepOr" q

Lemma: pgeo-LPSepOr_wf
g:ProjectivePlaneStructure. ∀l:Line. ∀p:{p:Point| l ≠ p} . ∀q:Point.  (LPSepOr(l;p;q) ∈ pgeo-plsep(g; q; l) ∨ q ≠ p)

Lemma: PL-sep-or
g:ProjectivePlaneStructure. ∀a:Point. ∀l,m:Line.  (pgeo-plsep(g; a; l)  (pgeo-plsep(g; a; m) ∨ m ≠ l))

Lemma: LP-sep-or
g:ProjectivePlaneStructure. ∀l:Line. ∀p:Point.  (l ≠  (∀q:Point. (pgeo-plsep(g; q; l) ∨ q ≠ p)))

Lemma: LP-sep-or2
g:ProjectivePlaneStructure. ∀l:Line. ∀p,q:Point.  (pgeo-plsep(g; p; l)  (pgeo-plsep(g; q; l) ∨ q ≠ p))

Definition: pgeo-join
p ∨ ==  fst((g."join" s))

Lemma: pgeo-join_wf
g:ProjectivePlaneStructure. ∀p,q:Point. ∀s:p ≠ q.  (p ∨ q ∈ {L:Line| L ∧ L} )

Lemma: Join
g:ProjectivePlaneStructure. ∀p,q:Point.  (p ≠  (∃l:Line. (p l ∧ l)))

Definition: pgeo-meet
l ∧ ==  fst((g."meet" s))

Lemma: pgeo-meet_wf
g:ProjectivePlaneStructure. ∀l,m:Line. ∀s:l ≠ m.  (l ∧ m ∈ {p:Point| l ∧ m} )

Lemma: Meet
g:ProjectivePlaneStructure. ∀l,m:Line.  (l ≠  (∃p:Point. (p l ∧ m)))

Lemma: pgeo-meet-incident
g:ProjectivePlaneStructure. ∀l,m:Line. ∀s:l ≠ m.  (l ∧ l ∧ l ∧ m)

Definition: pgeo-three-points
pgeo-three-point-axiom(l) ==  g."three-points" l

Lemma: pgeo-three-points_wf
g:ProjectivePlaneStructure. ∀l:Line.
  (pgeo-three-point-axiom(l) ∈ ∃a,b,c:Point. (a l ∧ l ∧ l ∧ a ≠ b ∧ b ≠ c ∧ c ≠ a))

Lemma: pgeo-three-points-axiom
g:ProjectivePlaneStructure. ∀l:Line.  ∃a,b,c:Point. (a l ∧ l ∧ l ∧ a ≠ b ∧ b ≠ c ∧ c ≠ a)

Definition: pgeo-three-lines
pgeo-three-line-axiom(p) ==  g."three-lines" p

Lemma: pgeo-three-lines_wf
g:ProjectivePlaneStructure. ∀a:Point.
  (pgeo-three-line-axiom(a) ∈ ∃l,m,n:Line. (a l ∧ m ∧ n ∧ l ≠ m ∧ m ≠ n ∧ n ≠ l))

Lemma: pgeo-three-lines-axiom
g:ProjectivePlaneStructure. ∀p:Point.  ∃l,m,n:Line. (p l ∧ m ∧ n ∧ l ≠ m ∧ m ≠ n ∧ n ≠ l)

Definition: pgeo-unique
unique(lm,pq) ==      ((¬p ≡ q) ∧ l ≡ m)))

Lemma: pgeo-unique_wf
g:ProjectivePlaneStructure. ∀l,m:Line. ∀p,q:Point.  (unique(lm,pq) ∈ ℙ)

Definition: point-exists-axiom
point-exists-axiom(g) ==  g."non-trivial"

Lemma: point-exists-axiom_wf
[g:ProjectivePlaneStructureComplete]. (point-exists-axiom(g) ∈ ∃p:Point. p ≡ p)

Lemma: pgeo-non-trivial
g:ProjectivePlaneStructureComplete. ∃p:Point. p ≡ p

Lemma: sq_stable__pgeo-axioms
g:ProjectivePlaneStructure. SqStable(BasicProjectiveGeometryAxioms(g))

Lemma: basic-pgeo-axioms-imply
g:ProjectivePlaneStructure. (BasicProjectiveGeometryAxioms(g)  ((∀a:Point. a ≡ a) ∧ (∀l:Line. l ≡ l)))

Definition: basic-projective-plane
BasicProjectivePlane ==  {g:ProjectivePlaneStructure| BasicProjectiveGeometryAxioms(g)} 

Lemma: basic-projective-plane_wf
BasicProjectivePlane ∈ 𝕌'

Lemma: basic-projective-plane-subtype
BasicProjectivePlane ⊆ProjectivePlaneStructure

Lemma: basic-projective-plane-axioms
g:BasicProjectivePlane. ∀m,l:Line. ∀p,q:Point.  (p     ((¬p ≡ q) ∧ l ≡ m))))

Lemma: pgeo-dual_wf2
[pg:BasicProjectivePlane]. (pg* ∈ BasicProjectivePlane)

Lemma: dual-point-subtype
[pg:BasicProjectivePlane]. (Point ⊆Line)

Lemma: dual-line-subtype
[pg:BasicProjectivePlane]. (Line ⊆Point)

Lemma: Unique
g:BasicProjectivePlane. ∀[l,m:Line]. ∀[p,q:Point].  ¬((¬p ≡ q) ∧ l ≡ m)) supposing l ∧ l ∧ m ∧ m

Lemma: pgeo-plsep-to-psep
g:ProjectivePlaneStructure. ∀a,b:Point. ∀l:Line.  (pgeo-plsep(g; a; l)   b ≠ a)

Lemma: pgeo-plsep-to-lsep
g:ProjectivePlaneStructure. ∀a,b:Line. ∀l:Point.  (pgeo-plsep(g; l; a)   b ≠ a)

Lemma: incident-join-first
g:ProjectivePlaneStructure. ∀p,q:Point. ∀s:p ≠ q.  p ∨ q

Lemma: psep-join-implies-false
g:ProjectivePlaneStructure. ∀p,q:Point. ∀s:p ≠ q.  (pgeo-plsep(g; p; p ∨ q)  False)

Lemma: incident-join-second
g:ProjectivePlaneStructure. ∀p,q:Point. ∀s:p ≠ q.  p ∨ q

Lemma: pgeo-join-to-line
g:BasicProjectivePlane. ∀p,q:Point. ∀l:Line. ∀s:p ≠ q.  (p   p ∨ q ≡ l)

Lemma: pgeo-join-to-line_dual
g:BasicProjectivePlane. ∀p,q:Line. ∀l:Point. ∀s:p ≠ q.  (l   p ∧ q ≡ l)

Lemma: pgeo-join-to-line-2
g:BasicProjectivePlane. ∀p,q:Point. ∀l:Line. ∀s:p ≠ q.  (p   l ≡ p ∨ q)

Lemma: pgeo-plsep-implies-join
g:BasicProjectivePlane. ∀c:Point. ∀l:Line.
  (pgeo-plsep(g; c; l)  (∀a,b:Point. ∀s:a ≠ b.  ((a l ∧ l)  pgeo-plsep(g; c; a ∨ b))))

Lemma: pgeo-meet-to-point
g:BasicProjectivePlane. ∀p,q:Line. ∀l:Point. ∀s:p ≠ q.  (l   l ≡ p ∧ q)

Lemma: pgeo-meet-incidence
g:BasicProjectivePlane. ∀l,m:Line. ∀s:l ≠ m.  (l ∧ l ∧ l ∧ m)

Lemma: pgeo-join-implies-plsep
g:BasicProjectivePlane. ∀a,b,c:Point. ∀s:a ≠ b.
  (pgeo-plsep(g; c; a ∨ b)  (∀l:Line. ((a l ∧ l)  pgeo-plsep(g; c; l))))

Lemma: pgeo-meet-implies-plsep
g:BasicProjectivePlane. ∀a,b,c:Line. ∀s:a ≠ b.
  (pgeo-plsep(g; a ∧ b; c)  (∀l:Point. ((l a ∧ b)  pgeo-plsep(g; l; c))))

Lemma: pgeo-meet-implies-lsep
g:BasicProjectivePlane. ∀l,m,n:Line. ∀s:l ≠ m.  (pgeo-plsep(g; l ∧ m; n)  {l ≠ n ∧ m ≠ n})

Lemma: pgeo-meet-implies-psep
g:BasicProjectivePlane. ∀l,m:Line. ∀s:l ≠ m. ∀a:Point. ∀c:{c:Point| l ∧ m} .  (a ≠ l ∧  a ≠ c)

Definition: triangle-axiom1
triangle-axiom1(g) ==  ∀p,q,r:Point. ∀s:p ≠ q. ∀s1:q ≠ r.  (pgeo-plsep(g; r; p ∨ q)  pgeo-plsep(g; p; q ∨ r))

Lemma: triangle-axiom1_wf
g:BasicProjectivePlane. (triangle-axiom1(g) ∈ ℙ)

Definition: triangle-axiom2
triangle-axiom2(g) ==
  ∀p,q:Point. ∀l,m:Line. ∀s:p ≠ q. ∀s1:l ≠ m.
    (pgeo-plsep(g; p; l)  pgeo-plsep(g; q; m)    pgeo-plsep(g; l ∧ m; p ∨ q))

Lemma: triangle-axiom2_wf
g:BasicProjectivePlane. (triangle-axiom2(g) ∈ ℙ)

Definition: projective-plane
ProjectivePlane ==
  {g:ProjectivePlaneStructureComplete| BasicProjectiveGeometryAxioms(g) ∧ triangle-axiom1(g) ∧ triangle-axiom2(g)} 

Lemma: projective-plane_wf
ProjectivePlane ∈ 𝕌'

Lemma: projective-plane-subtype
ProjectivePlane ⊆ProjectivePlaneStructureComplete

Lemma: projective-plane-subtype-basic
ProjectivePlane ⊆BasicProjectivePlane

Lemma: projective-plane-axioms
g:ProjectivePlane
  ((∀p,q,r:Point. ∀s:p ≠ q. ∀s1:q ≠ r.  (pgeo-plsep(g; r; p ∨ q)  pgeo-plsep(g; p; q ∨ r)))
  ∧ (∀p,q:Point. ∀l,m:Line. ∀s:p ≠ q. ∀s1:l ≠ m.
       (pgeo-plsep(g; p; l)  pgeo-plsep(g; q; m)    pgeo-plsep(g; l ∧ m; p ∨ q))))

Lemma: use-triangle-axiom1
g:ProjectivePlane. ∀p,q,r:Point. ∀s:p ≠ q. ∀s1:q ≠ r.  (pgeo-plsep(g; r; p ∨ q)  pgeo-plsep(g; p; q ∨ r))

Lemma: use-triangle-axiom2
g:ProjectivePlane. ∀p,q:Point. ∀l,m:Line. ∀s:p ≠ q. ∀s1:l ≠ m.
  (pgeo-plsep(g; p; l)  pgeo-plsep(g; q; m)    pgeo-plsep(g; l ∧ m; p ∨ q))

Lemma: plsep-join-implies
g:ProjectivePlane. ∀p,q,r:Point. ∀s:p ≠ q.  (pgeo-plsep(g; r; p ∨ q)  {q ≠ r ∧ p ≠ r})

Lemma: point-implies-plsep-exists
g:ProjectivePlane. ∀a:Point.  ∃l:Line. pgeo-plsep(g; a; l)

Lemma: line-implies-plsep-exists
g:ProjectivePlane. ∀l:Line.  ∃p:Point. pgeo-plsep(g; p; l)

Lemma: plsep-implies-ptriangle
g:ProjectivePlane. ∀p:Point. ∀l:Line. ∀q:Point. ∀s:q ≠ p.
  (pgeo-plsep(g; p; l)   (∃r:Point. (r l ∧ pgeo-plsep(g; r; q ∨ p))))

Lemma: pgeo-psep-sym
g:ProjectivePlane. ∀p,q:Point.  (p ≠  q ≠ p)

Lemma: pgeo-lsep-sym
g:ProjectivePlane. ∀l,m:Line.  (l ≠  m ≠ l)

Lemma: pgeo-leq-sym
g:ProjectivePlane. ∀l,m:Line.  (l ≡  m ≡ l)

Lemma: pgeo-meet-implies-psep2
g:ProjectivePlane. ∀l,m:Line. ∀s:l ≠ m. ∀a:Point. ∀c:{c:Point| l ∧ m} .  (a ≠  a ≠ l ∧ m)

Lemma: pgeo-lsep-or
g:BasicProjectivePlane. ∀l,m,n:Line.  (l ≠  (l ≠ n ∨ n ≠ m))

Lemma: pgeo-lsep-implies-plsep
g:ProjectivePlane. ∀p:Point. ∀l,m:Line. ∀s:l ≠ m.  (p  p ≠ l ∧  pgeo-plsep(g; p; m))

Lemma: pgeo-psep-sym-iff
g:ProjectivePlane. ∀p,q:Point.  (p ≠ ⇐⇒ q ≠ p)

Lemma: pgeo-psep-or
g:ProjectivePlane. ∀p,q,r:Point.  (p ≠  {p ≠ r ∨ r ≠ q})

Lemma: pgeo-peq-preserves-incidence
g:ProjectivePlane. ∀a,b:Point. ∀l:Line.  (a  a ≡  l)

Lemma: pgeo-leq-preserves-incidence
g:ProjectivePlane. ∀a:Point. ∀l,m:Line.  (a  l ≡  m)

Lemma: pgeo-peq-preserves-plsep
g:ProjectivePlane. ∀a,b:Point. ∀l:Line.  (pgeo-plsep(g; a; l)  a ≡  pgeo-plsep(g; b; l))

Lemma: pgeo-leq-preserves-plsep
g:ProjectivePlane. ∀a:Point. ∀l,m:Line.  (pgeo-plsep(g; a; l)  l ≡  pgeo-plsep(g; a; m))

Lemma: pgeo-peq-sym
g:ProjectivePlane. ∀a,b:Point.  (a ≡  b ≡ a)

Lemma: pgeo-leq_weakening
g:ProjectivePlane. ∀l,m:Line.  ((l m ∈ Line)  l ≡ m)

Lemma: pgeo-leq_inversion
g:ProjectivePlane. ∀l,m:Line.  (l ≡  m ≡ l)

Lemma: pgeo-leq_transitivity
g:ProjectivePlane. ∀l,m,n:Line.  (l ≡  m ≡  l ≡ n)

Lemma: pgeo-leq-equiv
g:ProjectivePlane. EquivRel(Line;p,q.p ≡ q)

Lemma: pgeo-leq-test
g:ProjectivePlane. ∀l,m,l1,m1:Line.  (l ≡ l1  m ≡ m1  l ≡  l1 ≡ m1)

Lemma: pgeo-plsep_functionality
g:ProjectivePlane. ∀a,a1:Point. ∀l,l1:Line.  (a ≡ a1  l ≡ l1  {pgeo-plsep(g; a; l) ⇐⇒ pgeo-plsep(g; a1; l1)})

Lemma: pgeo-peq_weakening
g:ProjectivePlane. ∀l,m:Point.  ((l m ∈ Point)  l ≡ m)

Lemma: pgeo-peq_inversion
g:ProjectivePlane. ∀l,m:Point.  (l ≡  m ≡ l)

Lemma: pgeo-peq_transitivity
g:ProjectivePlane. ∀a,b,c:Point.  (a ≡  b ≡  a ≡ c)

Lemma: pgeo-peq-equiv
g:ProjectivePlane. EquivRel(Point;p,q.p ≡ q)

Lemma: pgeo-psep-test
g:ProjectivePlane. ∀a,b,a1,b1:Point.  (a ≡ a1  b ≡ b1  a ≡  a1 ≡ b1)

Lemma: pgeo-plsep-iff-all-psep
g:ProjectivePlane. ∀p:Point. ∀l:Line.  (pgeo-plsep(g; p; l) ⇐⇒ ∀q:Point. (q  p ≠ q))

Lemma: pgeo-meet-psep-sym
g:ProjectivePlane. ∀l,m:Line. ∀a:Point. ∀s:l ≠ m. ∀s2:m ≠ l.  (l ∧ m ≠  m ∧ l ≠ a)

Lemma: pgeo-meet-psep-implies-false
g:ProjectivePlane. ∀l,m:Line. ∀s:l ≠ m. ∀s2:m ≠ l.  (m ∧ l ≠ l ∧  False)

Lemma: pgeo-meet-plsep-sym
g:ProjectivePlane. ∀l,m,n:Line. ∀s:l ≠ m. ∀s2:m ≠ l.  (pgeo-plsep(g; l ∧ m; n)  pgeo-plsep(g; m ∧ l; n))

Lemma: pgeo-triangle-axiom1-dual
g:ProjectivePlane. ∀l,m,n:Line. ∀s:l ≠ m. ∀s1:m ≠ n.  (pgeo-plsep(g; l ∧ m; n)  pgeo-plsep(g; m ∧ n; l))

Lemma: pgeo-triangle-axiom2-dual
g:ProjectivePlane. ∀p,q:Line. ∀l,m:Point. ∀s:p ≠ q. ∀s1:l ≠ m.
  (pgeo-plsep(g; l; p)  pgeo-plsep(g; m; q)    pgeo-plsep(g; p ∧ q; l ∨ m))

Lemma: pgeo-non-trivial-dual
g:ProjectivePlane. (∃l:Line [l ≡ l])

Lemma: pgeo-non-trivial-dual-ext
g:ProjectivePlane. (∃l:Line [l ≡ l])

Definition: dual-plane
dual-plane(pg) ==  complete-pgeo-dual(pg;let p,_ pg "non-trivial" in let l,_ pg "three-lines" in l)

Lemma: dual-plane_wf
[pg:ProjectivePlane]. (dual-plane(pg) ∈ ProjectivePlane)

Lemma: pgeo-lsep-implies-plsep_dual
g:ProjectivePlane. ∀p:Line. ∀l,m:Point. ∀s:l ≠ m.  (l  p ≠ l ∨  pgeo-plsep(g; m; p))

Lemma: pgeo-plsep-to-psep2
g:ProjectivePlane. ∀a:Point. ∀l:Line.  (pgeo-plsep(g; a; l)  (∀b:{b:Point| l} a ≠ b))

Definition: distinct-triangles
distinct-triangles(pg;t1;t2) ==
  (fst(t1) ≠ fst(t2) ∧ fst(t1) ≠ fst(snd(t2)) ∧ fst(t1) ≠ fst(snd(snd(t2))))
  ∧ (fst(snd(t1)) ≠ fst(t2) ∧ fst(snd(t1)) ≠ fst(snd(t2)) ∧ fst(snd(t1)) ≠ fst(snd(snd(t2))))
  ∧ fst(snd(snd(t1))) ≠ fst(t2)
  ∧ fst(snd(snd(t1))) ≠ fst(snd(t2))
  ∧ fst(snd(snd(t1))) ≠ fst(snd(snd(t2)))

Lemma: pgeo-join-lsep-sym
pg:ProjectivePlane. ∀l,m:Point. ∀a:Line. ∀s:l ≠ m. ∀s2:m ≠ l.  (l ∨ m ≠  m ∨ l ≠ a)

Lemma: pgeo-join-plsep-sym
pg:ProjectivePlane. ∀a,b,c:Point. ∀s:a ≠ b. ∀s2:b ≠ a.  (pgeo-plsep(pg; c; a ∨ b)  pgeo-plsep(pg; c; b ∨ a))

Definition: point-triangle
(a;b;c) ==  ∀a,b,c:Point. ∀s:b ≠ c.  pgeo-plsep(g; a; b ∨ c)

Lemma: point-triangle_wf
g:ProjectivePlane. ∀a,b,c:Point.  (PΔ(a;b;c) ∈ ℙ)

Definition: line-triangle
(l;m;n) ==  ∀l,m,n:Line. ∀s:m ≠ n.  pgeo-plsep(g; m ∧ n; l)

Lemma: line-triangle_wf
g:ProjectivePlane. ∀l,m,n:Line.  (LΔ(l;m;n) ∈ ℙ)

Definition: point-sep-from-line-triangle
p ≠ (l;m;n) ==
  ∀p:Point. ∀l,m,n:Line.  (((pgeo-plsep(g; p; l) ∧ pgeo-plsep(g; p; m)) ∧ pgeo-plsep(g; p; n)) ∧ (l;m;n))

Lemma: point-sep-from-line-triangle_wf
g:ProjectivePlane. ∀p:Point. ∀l,m,n:Line.  (p ≠ (l;m;n) ∈ ℙ)

Definition: line-sep-from-point-triangle
l ≠ (a;b;c) ==
  ∀l:Line. ∀a,b,c:Point.  (((pgeo-plsep(g; a; l) ∧ pgeo-plsep(g; b; l)) ∧ pgeo-plsep(g; c; l)) ∧ (a;b;c))

Lemma: line-sep-from-point-triangle_wf
g:ProjectivePlane. ∀l:Line. ∀a,b,c:Point.  (l ≠ (a;b;c) ∈ ℙ)

Lemma: pgeo-plsep-cycle
g:ProjectivePlane. ∀a,b,c:Point. ∀s:a ≠ b. ∀s1:b ≠ c. ∀s2:a ≠ c.
  (pgeo-plsep(g; a; b ∨ c)  {pgeo-plsep(g; b; a ∨ c) ∧ pgeo-plsep(g; c; a ∨ b)})

Definition: pgeo-triangle
pgeo-triangle(pg) ==  a:Point × b:Point × c:Point × s:b ≠ c × pgeo-plsep(pg; a; b ∨ c)

Lemma: pgeo-triangle_wf
[pg:ProjectivePlane]. (pgeo-triangle(pg) ∈ Type)

Lemma: distinct-triangles_wf
pg:ProjectivePlane. ∀t1,t2:pgeo-triangle(pg).  (distinct-triangles(pg;t1;t2) ∈ ℙ)

Lemma: pgeo-triangle-dual
pg:ProjectivePlane. ∀t:pgeo-triangle(pg).
  ∃t*:pgeo-triangle(pg*)
   let a,b,c,s,s' in let lab,lbc,lca,s1,s2 t* in lab ∧ lab ∧ lbc ∧ lbc ∧ lca ∧ lca

Definition: point-perspective
pPerspective(PΔ(a;b;c);PΔ(A;B;C);o) ==  ∀t1,t2:pgeo-triangle(g).  fst(t1) ≠ fst(t2)

Lemma: point-perspective_wf
g:ProjectivePlane. ∀a,b,c,A,B,C,o:Point.  (pPerspective(PΔ(a;b;c);PΔ(A;B;C);o) ∈ ℙ)

Definition: line-perspective
LPerspective(LΔ(l;m;n);LΔ(L;M;N);y) ==
  ∀l,m,n,L,M,N,y:Line. ∀s1:l ≠ L. ∀s2:m ≠ M. ∀s3:n ≠ N.  ((LΔ(l;m;n) ∧ (L;M;N)) ∧ (l ∧ y ∧ m ∧ y) ∧ n ∧ y)

Lemma: line-perspective_wf
g:ProjectivePlane. ∀l,m,n,L,M,N,y:Line.  (LPerspective(LΔ(l;m;n);LΔ(L;M;N);y) ∈ ℙ)

Lemma: pgeo-meet-line-uniqueness
g:ProjectivePlane. ∀a,b:Point. ∀l,m:Line.  (a ≠  (a l ∧ m)  (b l ∧ m)  l ≡ m)

Lemma: pgeo-triangle-axiom1-sym
g:ProjectivePlane. ∀a,b,c:Point. ∀s:b ≠ a. ∀s1:a ≠ c.  (pgeo-plsep(g; c; b ∨ a)  pgeo-plsep(g; b; a ∨ c))

Lemma: pgeo-sep-points-exist
g:ProjectivePlane. ∃a,b:Point. a ≠ b

Lemma: pgeo-lsep-implies-plsep-or
g:ProjectivePlane. ∀p:Point. ∀l,m:Line. ∀s:l ≠ m.  (p ≠ l ∧  (pgeo-plsep(g; p; m) ∨ pgeo-plsep(g; p; l)))

Comment: existence of projective planes doc
From any integral domain with decidable equality, we can construct 
projective plane. (see rng-pps_wf)⋅

Definition: rng-pp-primitives
rng-pp-primitives(r) ==  points={p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))}  lines={p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))}  plse\000Cp=λp,l. ((p l) 0 ∈ |r|))

Lemma: rng-pp-primitives_wf
[r:Rng]. (rng-pp-primitives(r) ∈ ProjGeomPrimitives)

Lemma: rng-pp-nontrivial-1
r:IntegDom{i}
  ((∀x,y:|r|.  Dec(x y ∈ |r|))
   (∀l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
        ∃a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
         (∃b:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))}  [(((a l) 0 ∈ |r|)
                                               ∧ ((b l) 0 ∈ |r|)
                                               ∧ ((a b) 0 ∈ (ℕ3 ⟶ |r|))))])))

Lemma: rng-pp-nontrivial-1-ext
r:IntegDom{i}
  ((∀x,y:|r|.  Dec(x y ∈ |r|))
   (∀l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
        ∃a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
         (∃b:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))}  [(((a l) 0 ∈ |r|)
                                               ∧ ((b l) 0 ∈ |r|)
                                               ∧ ((a b) 0 ∈ (ℕ3 ⟶ |r|))))])))

Lemma: rng-pp-nontrivial-2
r:IntegDom{i}
  ((∀x,y:|r|.  Dec(x y ∈ |r|))
   (∀l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
        ∃a,b,c:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
         (((a l) 0 ∈ |r|)
         ∧ ((b l) 0 ∈ |r|)
         ∧ ((c l) 0 ∈ |r|)
         ∧ ((a b) 0 ∈ (ℕ3 ⟶ |r|)))
         ∧ ((b c) 0 ∈ (ℕ3 ⟶ |r|)))
         ∧ ((c a) 0 ∈ (ℕ3 ⟶ |r|))))))

Lemma: rng-pp-nontrivial-3
r:IntegDom{i}. ∀eq:EqDecider(|r|). ∀l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} .
  ∃a,b,c:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
   ((¬¬((a l) 0 ∈ |r|))
   ∧ (¬¬((b l) 0 ∈ |r|))
   ∧ (¬¬((c l) 0 ∈ |r|))
   ∧ (∃l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((a l) 0 ∈ |r|)) ∧ ((b l) 0 ∈ |r|))))
   ∧ (∃l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((b l) 0 ∈ |r|)) ∧ ((c l) 0 ∈ |r|))))
   ∧ (∃l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((c l) 0 ∈ |r|)) ∧ ((a l) 0 ∈ |r|)))))

Definition: rng-pp-nontriv1
rng-pp-nontriv1(r;eq;l) ==
  eval non-zero-component(r;λx,y. (eq y);3;l) in
  if x=0
  then <λx.if x=1 then else if x=0 then -r (l 1) else 0
       , λx.if x=2 then else if x=0 then -r (l 2) else 0
       x.if x=1 then else if x=0 then -r (l 1) else + λx.if x=2 then else if x=0 then -r (l 2) else 0)
       , λ%.Ax
       , λ%.Ax
       , λ%.Ax
       , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=1 then else if x=0 then -r (l 1) else 0;λx.if x=2
                                                                                                then 0
                                                                                                else if x=0
                                                                                                     then -r (l 2)
                                                                                                     else 0)
         , λ%.Ax
         , λ%.Ax>
       , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=2
                                            then 0
                                            else if x=0 then -r (l 2) else 0;(λx.if x=1
                                                                                 then 0
                                                                                 else if x=0
                                                                                      then -r (l 1)
                                                                                      else + λx.if x=2
                                                                                                  then 0
                                                                                                  else if x=0
                                                                                                       then -r (l 2)
                                                                                                       else 0))
         , λ%.Ax
         , λ%.Ax>
       nonzero-cross-imp(r;λx,y. (eq y);(λx.if x=1
                                            then 0
                                            else if x=0 then -r (l 1) else + λx.if x=2
                                                                                  then 0
                                                                                  else if x=0
                                                                                       then -r (l 2)
                                                                                       else 0);λx.if x=1
                                                                                                  then 0
                                                                                                  else if x=0
                                                                                                       then -r (l 1)
                                                                                                       else 0)
       , λ%.Ax
       , λ%.Ax>
  else if x=1
       then <λx.if x=0 then else if x=1 then -r (l 0) else 0
            , λx.if x=2 then else if x=1 then -r (l 2) else 0
            x.if x=0 then else if x=1 then -r (l 0) else + λx.if x=2
                                                                        then 1
                                                                        else if x=1 then -r (l 2) else 0)
            , λ%.Ax
            , λ%.Ax
            , λ%.Ax
            , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=0 then else if x=1 then -r (l 0) else 0;λx.if x=2
                                                                                                     then 1
                                                                                                     else if x=1
                                                                                                          then -r (l 2)
                                                                                                          else 0)
              , λ%.Ax
              , λ%.Ax>
            , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=2
                                                 then 1
                                                 else if x=1 then -r (l 2) else 0;(λx.if x=0
                                                                                      then 1
                                                                                      else if x=1
                                                                                           then -r (l 0)
                                                                                           else + λx.if x=2
                                                                                                       then 1
                                                                                                       else if x=1
                                                                                                            then -r 
                                                                                                                 (l 2)
                                                                                                            else 0))
              , λ%.Ax
              , λ%.Ax>
            nonzero-cross-imp(r;λx,y. (eq y);(λx.if x=0
                                                 then 1
                                                 else if x=1 then -r (l 0) else + λx.if x=2
                                                                                       then 1
                                                                                       else if x=1
                                                                                            then -r (l 2)
                                                                                            else 0);λx.if x=0
                                                                                                       then 1
                                                                                                       else if x=1
                                                                                                            then -r 
                                                                                                                 (l 0)
                                                                                                            else 0)
            , λ%.Ax
            , λ%.Ax>
       else if x=2
            then <λx.if x=0 then else if x=2 then -r (l 0) else 0
                 , λx.if x=1 then else if x=2 then -r (l 1) else 0
                 x.if x=0 then else if x=2 then -r (l 0) else + λx.if x=1
                                                                             then 2
                                                                             else if x=2 then -r (l 1) else 0)
                 , λ%.Ax
                 , λ%.Ax
                 , λ%.Ax
                 , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=0 then else if x=2 then -r (l 0) else 0;λx.if x=1
                                                                                                          then 2
                                                                                                          else if x=2
                                                                                                               then -r 
                                                                                                                    (l 
                                                                                                                     1)
                                                                                                               else 0)
                   , λ%.Ax
                   , λ%.Ax>
                 , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=1
                                                      then 2
                                                      else if x=2
                                                           then -r (l 1)
                                                           else 0;(λx.if x=0
                                                                      then 2
                                                                      else if x=2
                                                                           then -r (l 0)
                                                                           else + λx.if x=1
                                                                                       then 2
                                                                                       else if x=2
                                                                                            then -r (l 1)
                                                                                            else 0))
                   , λ%.Ax
                   , λ%.Ax>
                 nonzero-cross-imp(r;λx,y. (eq y);(λx.if ...=... then ... else ... ...);...)
                 ...>
            else ...

Lemma: rng-pp-nontrivial-3-ext
r:IntegDom{i}. ∀eq:EqDecider(|r|). ∀l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} .
  ∃a,b,c:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
   ((¬¬((a l) 0 ∈ |r|))
   ∧ (¬¬((b l) 0 ∈ |r|))
   ∧ (¬¬((c l) 0 ∈ |r|))
   ∧ (∃l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((a l) 0 ∈ |r|)) ∧ ((b l) 0 ∈ |r|))))
   ∧ (∃l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((b l) 0 ∈ |r|)) ∧ ((c l) 0 ∈ |r|))))
   ∧ (∃l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((c l) 0 ∈ |r|)) ∧ ((a l) 0 ∈ |r|)))))

Lemma: rng-pp-nontriv1_wf
[r:IntegDom{i}]. ∀[eq:EqDecider(|r|)]. ∀[l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ].
  (rng-pp-nontriv1(r;eq;l) ∈ ∃a,b,c:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
                              ((¬¬((a l) 0 ∈ |r|))
                              ∧ (¬¬((b l) 0 ∈ |r|))
                              ∧ (¬¬((c l) 0 ∈ |r|))
                              ∧ (∃l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
                                  ((¬¬((a l) 0 ∈ |r|)) ∧ ((b l) 0 ∈ |r|))))
                              ∧ (∃l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
                                  ((¬¬((b l) 0 ∈ |r|)) ∧ ((c l) 0 ∈ |r|))))
                              ∧ (∃l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
                                  ((¬¬((c l) 0 ∈ |r|)) ∧ ((a l) 0 ∈ |r|))))))

Lemma: rng-pp-nontrivial-4
r:IntegDom{i}. ∀eq:EqDecider(|r|). ∀p:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} .
  ∃l,m,n:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
   ((¬¬((p l) 0 ∈ |r|))
   ∧ (¬¬((p m) 0 ∈ |r|))
   ∧ (¬¬((p n) 0 ∈ |r|))
   ∧ (∃a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((a l) 0 ∈ |r|)) ∧ ((a m) 0 ∈ |r|))))
   ∧ (∃a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((a m) 0 ∈ |r|)) ∧ ((a n) 0 ∈ |r|))))
   ∧ (∃a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((a n) 0 ∈ |r|)) ∧ ((a l) 0 ∈ |r|)))))

Definition: rng-pp-nontriv2
rng-pp-nontriv2(r;eq;p) ==
  eval non-zero-component(r;λx,y. (eq y);3;p) in
  if x=0
  then <λx.if x=1 then else if x=0 then -r (p 1) else 0
       , λx.if x=2 then else if x=0 then -r (p 2) else 0
       x.if x=1 then else if x=0 then -r (p 1) else + λx.if x=2 then else if x=0 then -r (p 2) else 0)
       , λ%.Ax
       , λ%.Ax
       , λ%.Ax
       , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=1 then else if x=0 then -r (p 1) else 0;λx.if x=2
                                                                                                then 0
                                                                                                else if x=0
                                                                                                     then -r (p 2)
                                                                                                     else 0)
         , λ%.Ax
         , λ%.Ax>
       , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=2
                                            then 0
                                            else if x=0 then -r (p 2) else 0;(λx.if x=1
                                                                                 then 0
                                                                                 else if x=0
                                                                                      then -r (p 1)
                                                                                      else + λx.if x=2
                                                                                                  then 0
                                                                                                  else if x=0
                                                                                                       then -r (p 2)
                                                                                                       else 0))
         , λ%.Ax
         , λ%.Ax>
       nonzero-cross-imp(r;λx,y. (eq y);(λx.if x=1
                                            then 0
                                            else if x=0 then -r (p 1) else + λx.if x=2
                                                                                  then 0
                                                                                  else if x=0
                                                                                       then -r (p 2)
                                                                                       else 0);λx.if x=1
                                                                                                  then 0
                                                                                                  else if x=0
                                                                                                       then -r (p 1)
                                                                                                       else 0)
       , λ%.Ax
       , λ%.Ax>
  else if x=1
       then <λx.if x=0 then else if x=1 then -r (p 0) else 0
            , λx.if x=2 then else if x=1 then -r (p 2) else 0
            x.if x=0 then else if x=1 then -r (p 0) else + λx.if x=2
                                                                        then 1
                                                                        else if x=1 then -r (p 2) else 0)
            , λ%.Ax
            , λ%.Ax
            , λ%.Ax
            , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=0 then else if x=1 then -r (p 0) else 0;λx.if x=2
                                                                                                     then 1
                                                                                                     else if x=1
                                                                                                          then -r (p 2)
                                                                                                          else 0)
              , λ%.Ax
              , λ%.Ax>
            , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=2
                                                 then 1
                                                 else if x=1 then -r (p 2) else 0;(λx.if x=0
                                                                                      then 1
                                                                                      else if x=1
                                                                                           then -r (p 0)
                                                                                           else + λx.if x=2
                                                                                                       then 1
                                                                                                       else if x=1
                                                                                                            then -r 
                                                                                                                 (p 2)
                                                                                                            else 0))
              , λ%.Ax
              , λ%.Ax>
            nonzero-cross-imp(r;λx,y. (eq y);(λx.if x=0
                                                 then 1
                                                 else if x=1 then -r (p 0) else + λx.if x=2
                                                                                       then 1
                                                                                       else if x=1
                                                                                            then -r (p 2)
                                                                                            else 0);λx.if x=0
                                                                                                       then 1
                                                                                                       else if x=1
                                                                                                            then -r 
                                                                                                                 (p 0)
                                                                                                            else 0)
            , λ%.Ax
            , λ%.Ax>
       else if x=2
            then <λx.if x=0 then else if x=2 then -r (p 0) else 0
                 , λx.if x=1 then else if x=2 then -r (p 1) else 0
                 x.if x=0 then else if x=2 then -r (p 0) else + λx.if x=1
                                                                             then 2
                                                                             else if x=2 then -r (p 1) else 0)
                 , λ%.Ax
                 , λ%.Ax
                 , λ%.Ax
                 , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=0 then else if x=2 then -r (p 0) else 0;λx.if x=1
                                                                                                          then 2
                                                                                                          else if x=2
                                                                                                               then -r 
                                                                                                                    (p 
                                                                                                                     1)
                                                                                                               else 0)
                   , λ%.Ax
                   , λ%.Ax>
                 , <nonzero-cross-imp(r;λx,y. (eq y);λx.if x=1
                                                      then 2
                                                      else if x=2
                                                           then -r (p 1)
                                                           else 0;(λx.if x=0
                                                                      then 2
                                                                      else if x=2
                                                                           then -r (p 0)
                                                                           else + λx.if x=1
                                                                                       then 2
                                                                                       else if x=2
                                                                                            then -r (p 1)
                                                                                            else 0))
                   , λ%.Ax
                   , λ%.Ax>
                 nonzero-cross-imp(r;λx,y. (eq y);(λx.if ...=... then ... else ... ...);...)
                 ...>
            else ...

Lemma: rng-pp-nontrivial-4-ext
r:IntegDom{i}. ∀eq:EqDecider(|r|). ∀a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} .
  ∃l,m,n:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
   ((¬¬((a l) 0 ∈ |r|))
   ∧ (¬¬((a m) 0 ∈ |r|))
   ∧ (¬¬((a n) 0 ∈ |r|))
   ∧ (∃a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((a l) 0 ∈ |r|)) ∧ ((a m) 0 ∈ |r|))))
   ∧ (∃a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((a m) 0 ∈ |r|)) ∧ ((a n) 0 ∈ |r|))))
   ∧ (∃a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((¬¬((a n) 0 ∈ |r|)) ∧ ((a l) 0 ∈ |r|)))))

Lemma: rng-pp-nontriv2_wf
[r:IntegDom{i}]. ∀[eq:EqDecider(|r|)]. ∀[a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ].
  (rng-pp-nontriv2(r;eq;a) ∈ ∃l,m,n:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
                              ((¬¬((a l) 0 ∈ |r|))
                              ∧ (¬¬((a m) 0 ∈ |r|))
                              ∧ (¬¬((a n) 0 ∈ |r|))
                              ∧ (∃a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
                                  ((¬¬((a l) 0 ∈ |r|)) ∧ ((a m) 0 ∈ |r|))))
                              ∧ (∃a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
                                  ((¬¬((a m) 0 ∈ |r|)) ∧ ((a n) 0 ∈ |r|))))
                              ∧ (∃a:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} 
                                  ((¬¬((a n) 0 ∈ |r|)) ∧ ((a l) 0 ∈ |r|))))))

Definition: rng-pps
rng-pps(r;eq) ==
  mk-complete-pgeo(mk-pgeo(rng-pp-primitives(r);
                           λl,a,v,v. Ax;
                           λa,l,m. if eq (a m) then inr <a, λnp.(np Ax), λ%6.Ax>  else inl %.Ax) fi ;
                           λl,a,b. if eq (b l) then inr <l, λnp.(np Ax), λ%6.Ax>  else inl %.Ax) fi ;
                           λa,b,_. <(a b), λ_.Ax, λ_.Ax>;
                           λa,b,_. <(a b), λ_.Ax, λ_.Ax>;
                           λl.rng-pp-nontriv1(r;eq;l);
                           λa.rng-pp-nontriv2(r;eq;a));λi.1)

Lemma: rng-pps_wf
r:IntegDom{i}. ∀[eq:EqDecider(|r|)]. (rng-pps(r;eq) ∈ ProjectivePlane)

Definition: pgeo-point-class
PointClass ==  p,q:Point//p ≡ q

Lemma: pgeo-point-class_wf
[g:ProjectivePlane]. (PointClass ∈ Type)

Definition: pgeo-line-class
LineClass ==  l,m:Line//l ≡ m

Lemma: pgeo-line-class_wf
[g:ProjectivePlane]. (LineClass ∈ Type)

Definition: pgeo-plsep-class
pc lc ==  ∃p:Point. ∃l:Line. ((p pc ∈ PointClass) ∧ (l lc ∈ LineClass) ∧ pgeo-plsep(g; p; l))

Lemma: pgeo-plsep-class_wf
[g:ProjectivePlane]. ∀[pc:PointClass]. ∀[lc:LineClass].  (pc lc ∈ ℙ)

Definition: pgeo-incident-class
pc lc ==  ¬pc lc

Lemma: pgeo-incident-class_wf
[g:ProjectivePlane]. ∀[pc:PointClass]. ∀[lc:LineClass].  (pc lc ∈ ℙ)

Definition: pgeo-lsep-class
pgeo-lsep-class(g;m;n) ==  ∃l',l:Line. ((l' m ∈ LineClass) ∧ (l n ∈ LineClass) ∧ l' ≠ l)

Lemma: pgeo-lsep-class_wf
[g:ProjectivePlane]. ∀[m,n:LineClass].  (pgeo-lsep-class(g;m;n) ∈ ℙ)

Lemma: pgeo-psep-irrefl
e:ProjectivePlane. ∀[a,b:Point].  ¬a ≠ supposing b ∈ Point

Lemma: pgeo-psep-irrefl2
e:ProjectivePlane. ∀[a,b:Point].  ¬(a b ∈ Point) supposing a ≠ b

Definition: pgeo-order
order(pg) ==  ∀l:Line. p,q:{p:Point| l} //p ≡ ~ ℕ1

Lemma: pgeo-order-equiv_rel
pg:ProjectivePlane. ∀l:Line.  EquivRel({p:Point| l} ;p,q.p ≡ q)

Lemma: pgeo-order_wf
pg:ProjectivePlane. ∀n:ℕ.  (order(pg) n ∈ ℙ)

Lemma: pgeo-order_2-incidence
pg:ProjectivePlane. ∀l:Line.  (order(pg)  p,q:{p:Point| l} //p ≡ ~ ℕ3)

Lemma: pgeo-minimum-order
pg:ProjectivePlane. ∀n:ℕ.  (order(pg)  (n ≥ ))

Lemma: pgeo-minimum-order-proof2
pg:ProjectivePlane. ∀n:ℕ.  (order(pg)  (n ≥ ))

Lemma: pgeo-order-implies2
pg:ProjectivePlane. ∀n:ℕ.  (order(pg)  (∃l:Line. p,q:{p:Point| l} //p ≡ ~ ℕ1))

Lemma: pgeo-order_incidence-eq
pg:ProjectivePlane. ∀n:ℕ. ∀l1,l2:Line.  (order(pg)  p,q:{p:Point| l1} //p ≡ p,q:{p:Point| l2} //p ≡ q\000C)

Definition: pgeo-finite-plane
pgeo-finite-plane(pg) ==
  ((∃p_n:ℕPoint ~ ℕp_n) ∧ (∃l_n:ℕLine ~ ℕl_n)) ∧ (∀p:Point. ∀l:Line.  Dec(pgeo-plsep(pg; p; l)))

Lemma: pgeo-finite-plane_wf
pg:ProjectivePlane. (pgeo-finite-plane(pg) ∈ ℙ)

Lemma: Euclid-Prop16-construction-lemma
g:EuclideanPlane. ∀a,b,c:Point.
  (a bc  (∃x:{x:Point| b=x=c} . ∃y:{y:Point| a=x=y} (abc ≅a ycb ∧ (b x ∧ c) ∧ x ∧ y)))

Lemma: Euclid-prop16
g:EuclideanPlane. ∀a,b,c,d:Point.  (a bc  b-c-d  (cba < acd ∧ bac < acd))

Lemma: Euclid-Prop18-lemma
e:EuclideanPlane. ∀a,b,c,d:Point.  (a bc  b-c-d  bac < bad)

Lemma: Euclid-Prop18
e:EuclideanPlane. ∀a,b,c:Point.  (a bc  |ab| < |ac|  bca < abc)

Lemma: Euclid-Prop19-weak
e:EuclideanPlane. ∀a,b,c:Point.  (a bc  bca < abc  (¬¬|ab| < |ac|))

Lemma: Euclid-Prop19-lemma1
e:EuclideanPlane. ∀a,b,c,d:Point.  (a bc  bad ≅a cad  b-d-c  |bd| < |cd|  |ab| < |ac|)

Lemma: angle-bisector-unique
e:EuclideanPlane. ∀a,b,c,a',c',x,y:Point.
  (a bc  out(b aa')  out(b cc')  a-x-c  a'-y-c'  abx ≅a cbx  a'by ≅a c'by  {out(b xy) ∧ abx ≅a a'by})

Lemma: interior-angles-unique
e:EuclideanPlane. ∀a,b,c,d,b',c',p:Point.
  (a bc  out(b dc)  out(a bb')  out(a cc')  B(b'pc')  c'  bad < bac  bap ≅a bad  out(a dp))

Lemma: interior-angles-unique2
e:EuclideanPlane. ∀a,b,c,d,b',c',p:Point.
  (c leftof ab
   leftof ab
   leftof ab
   out(a bb')
   out(a cc')
   B(b'pc')
   c'
   bad < bac
   bap ≅a bad
   out(a dp))

Lemma: interior-angles-unique2-symm
e:EuclideanPlane. ∀a,b,c,d,a',c',p:Point.
  (c leftof ab
   leftof ab
   leftof ab
   out(b aa')
   out(b cc')
   B(a'pc')
   c'
   abd < abc
   abp ≅a abd
   out(b dp))

Lemma: lt-angle-implies-between-if-out
e:EuclideanPlane. ∀a,b,c,d:Point.  (a bc  bad < bac  out(b dc)  b-d-c)

Lemma: Euclid-Prop19-lemma2_1
e:EuclideanPlane. ∀a,b,c,d,f:Point.  (a bc  abd ≅a cbd  a=d=c  a-f-c  cbf < abf  abd < abf)

Lemma: Euclid-Prop19-lemma2
e:EuclideanPlane. ∀a,b,c,d,f:Point.  (a bc  cbd < abd  a=d=c  a-f-c  cbf ≅a abf  |af| < |cf|)

Lemma: Euclid-Prop9-with-between
e:EuclideanPlane. ∀a,b:Point. ∀c:{c:Point| ba} .  ∃f:Point. (acf ≅a bcf ∧ a-f-b)

Lemma: Euclid-Prop19
e:EuclideanPlane. ∀a,b,c:Point.  (a bc  bca < abc  |ab| < |ac|)

Lemma: Euclid-Prop20
e:EuclideanPlane. ∀a,b,c:Point.  (a bc  |bc| < |ba| |ac|)

Lemma: Euclid-Prop20_cycle
e:EuclideanPlane. ∀a,b,c:Point.  (a bc  (|bc| < |ba| |ac| ∧ |ac| < |ba| |bc| ∧ |ba| < |ac| |bc|))

Definition: geo-interior-point
I(abc;d) ==  leftof bc ∧ leftof bc ∧ leftof ca ∧ leftof ab

Lemma: geo-interior-point_wf
[e:EuclideanPlane]. ∀[a,b,c,d:Point].  (I(abc;d) ∈ ℙ)

Lemma: Euclid-Prop21
g:EuclideanPlane. ∀a,b,c,d:Point.  (I(abc;d)  {|cd| |bd| < |ba| |ac| ∧ bac < bdc})

Lemma: geo-perp-is-shortest-path
e:EuclideanPlane. ∀a,b,c,d:Point.  (a bc  ad  ⊥bc  (∀x:{x:Point| Colinear(b;c;x)} (d  |ad| < |ax|)))

Lemma: greatest-cevian-is-farthest-from-perp
e:EuclideanPlane. ∀a,b,c,d:Point.  (a bc  ad  ⊥bc  (∀x,y:{x:Point| Colinear(b;c;x)} .  (d-x-y  |ax| < |ay|)))

Lemma: Euclid-Prop22
e:EuclideanPlane. ∀a1,a2,b1,b2,c1,c2:Point.
  (|a1a2| < |b1b2| |c1c2|
   |b1b2| < |a1a2| |c1c2|
   |c1c2| < |a1a2| |b1b2|
   (∃a,b,c:Point. (((a bc ∧ ab ≅ a1a2) ∧ bc ≅ b1b2) ∧ ca ≅ c1c2)))

Lemma: Prop22-symmetric-point-construction-lemma
e:EuclideanPlane. ∀a,b,c:Point.
  (a bc
   (∃c1,c1',c1'',c2,c2',c2'':Point
       ((ac1 ≅ ac ∧ out(a bc1))
       ∧ (bc2 ≅ bc ∧ out(b ac2))
       ∧ (b-a-c1' ∧ ac1' ≅ ac1)
       ∧ (a-b-c2' ∧ bc2' ≅ bc2)
       ∧ (B(abc1'') ∧ bc1'' ≅ bc1)
       ∧ (B(bac2'') ∧ ac2'' ≅ ac2)
       ∧ (a-c1-c2' ∧ b-c2-c1')
       ∧ (c1'-a-c1 ∧ c2'-b-c2)
       ∧ (c1'-c2-c2' ∧ c2'-c1-c1')
       ∧ c1'-c2-c1
       ∧ c2'-c1-c2)))

Lemma: Prop22-inequality-to-triangle-construction
e:EuclideanPlane. ∀a,b,c:Point.
  (|ac| < |ab| |bc|
   |ab| < |ac| |bc|
   |bc| < |ac| |ab|
   (∃c1,c2:Point. ((ac ≅ ac1 ∧ bc2 > bc1) ∧ bc ≅ bc2 ∧ ac1 > ac2)))

Lemma: Prop22-inequality-implies-triangle
e:EuclideanPlane. ∀a,b,c:Point.  (|ac| < |ab| |bc|  |ab| < |ac| |bc|  |bc| < |ac| |ab|  bc)

Lemma: cong-angle-preserves-lsep_strong
g:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (x yz  abc ≅a xyz  bc)

Lemma: hp-angle-sum-lt3
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k,a',b',c',x',y',z',i',j',k':Point.
  (a' b'c'
   abc xyz ≅ ijk
   a'b'c' x'y'z' ≅ i'j'k'
   ijk ≅a i'j'k'
   bc
   yz
   jk
   abc < a'b'c'
   x'y'z' < xyz)

Lemma: hp-angle-sum-lt4
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k,a',b',c',x',y',z',i',j',k':Point.
  (x' y'z'
   abc xyz ≅ ijk
   a'b'c' x'y'z' ≅ i'j'k'
   ijk ≅a i'j'k'
   a' b'c'
   yz
   jk
   x'y'z' < xyz
   abc < a'b'c')

Lemma: hp-angle-sum-implies-lsep
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k:Point.  (i-j-k  abc xyz ≅ ijk  bc  yz)

Lemma: hp-angle-sum-eq-straight-angle
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k,i',j',k':Point.  (abc xyz ≅ ijk  abc xyz ≅ i'j'k'  i-j-k  i'-j'-k')

Lemma: hp-angle-sum-eq-straight-angle2
e:EuclideanPlane. ∀a,b,c,x,y,z,a',b',c',x',y',z',i,j,k,i',j',k':Point.
  (abc xyz ≅ ijk  a'b'c' x'y'z' ≅ i'j'k'  abc ≅a a'b'c'  xyz ≅a x'y'z'  i-j-k  i'-j'-k')

Lemma: hp-angle-sum-eq2
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k,a',b',c',x',y',z',i',j',k':Point.
  (abc ≅a a'b'c'  xyz ≅a x'y'z'  abc xyz ≅ ijk  a'b'c' x'y'z' ≅ i'j'k'  bc  yz  ijk ≅a i'j'k')

Lemma: hp-angle-sum-eq3
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k,a',b',c',x',y',z',i',j',k':Point.
  (abc ≅a a'b'c'  ijk ≅a i'j'k'  abc xyz ≅ ijk  a'b'c' x'y'z' ≅ i'j'k'  bc  jk  xyz ≅a x'y'z')

Lemma: hp-angle-sum-lt
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k,a',b',c',x',y',z',i',j',k':Point.
  (abc ≅a a'b'c'
   abc xyz ≅ ijk
   a'b'c' x'y'z' ≅ i'j'k'
   jk
   i' j'k'
   yz
   xyz < x'y'z'
   ijk < i'j'k')

Lemma: geo-lt-angle-in-half-plane-implies-lsep
e:EuclideanPlane. ∀w,x,y,z:Point.  (xyz < wyz  leftof yz  leftof yz  xy)

Lemma: geo-lt-angle-left
e:EuclideanPlane. ∀a,b,x,y:Point.  (x leftof ab  leftof ab  leftof xa  yab < xab)

Lemma: geo-lt-angle-left2
e:EuclideanPlane. ∀a,b,x,y:Point.  (x leftof ab  leftof ab  leftof yb  yba < xba)

Lemma: geo-lt-angle-in-half-plane-implies-left
e:EuclideanPlane. ∀w,x,y,z:Point.  (xyz < wyz  leftof yz  leftof yz  leftof yx)

Lemma: geo-lt-angle-in-half-plane-implies-left2
e:EuclideanPlane. ∀w,x,y,z:Point.  (xyz < wyz  leftof zy  leftof zy  leftof xy)

Lemma: geo-lt-angle-in-half-plane-point-exists
e:EuclideanPlane. ∀w,x,y,z:Point.  (xyz < wyz  leftof yz  leftof yz  (∃q:Point. (w-q-z ∧ out(y qx))))

Lemma: Prop23-construction-lemma
e:EuclideanPlane. ∀p,q,r,a,a':Point.
  (p qr  a'  (∃b,c1,c2:Point. (((pq ≅ ab ∧ out(a a'b)) ∧ pr ≅ ac1 ∧ bc2 > bc1) ∧ qr ≅ bc2 ∧ ac1 > ac2)))

Lemma: Euclid-Prop23
e:EuclideanPlane. ∀a,b,x,y,z:Point.  (z xy   (∃x',b':Point. (out(a bb') ∧ x' ab' ∧ x'ab' ≅a zxy)))

Lemma: Euclid-Prop23_half-plane
e:EuclideanPlane. ∀a,b,x,y,z:Point.  (z xy   (∃x',b':Point. (out(a bb') ∧ x' leftof ab' ∧ x'ab' ≅a zxy)))

Lemma: Euclid-Prop23_half-plane2
e:EuclideanPlane. ∀a,b,x,y,z:Point.  (z xy   (∃x',b':Point. (out(a bb') ∧ x' leftof b'a ∧ x'ab' ≅a zxy)))

Lemma: geo-cong-angle-preserves-lt-angle3
g:EuclideanPlane. ∀a,b,c,d,e,f,x,y,z:Point.  (abc < xyz  def ≅a xyz  bc  x-y-z  abc < def)

Lemma: hp-angle-sum-subst4
g:EuclideanPlane. ∀a,b,c,d,e,f,x,y,z,i,j,k:Point.
  (abc def ≅ xyz  xyz ≅a ijk  x-y-z  bc  ef  abc def ≅ ijk)

Lemma: lsep-lt-straight-angle
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.  (a bc  x-y-z  abc < xyz)

Lemma: hp-angle-sum-lt2
e:EuclideanPlane. ∀a,b,c,x,y,z,i,j,k,a',b',c',x',y',z',i',j',k':Point.
  (abc ≅a a'b'c'
   abc xyz ≅ ijk
   a'b'c' x'y'z' ≅ i'j'k'
   i'-j'-k'
   bc
   yz
   xyz < x'y'z'
   ijk < i'j'k')

Lemma: Euclid-Prop17
g:EuclideanPlane. ∀a,b,c,i,j,k:Point.  (a bc  acb abc ≅ ijk  (∀a1,a2,a3:Point.  (a1-a2-a3  ijk < a1a2a3)))

Lemma: geo-lt-angle-construction
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.
  (xyz < abc  yz  bc  (∃a',x',z':Point. (xya' ≅a abc ∧ x'-z'-a' ∧ out(y xx') ∧ out(y zz'))))

Lemma: geo-lt-angle-or
e:EuclideanPlane. ∀b,y:Point. ∀a,c:{p:Point| b} . ∀x,z:{q:Point| y} .  (¬¬(xyz < abc ∨ abc < xyz ∨ abc ≅a xyz))

Lemma: lsep-implies-sep-or-lsep
e:EuclideanPlane. ∀a,b,c,x:Point.  (a bc  (c x ∨ ab))

Lemma: geo-lt-or
e:EuclideanPlane. ∀a,b,c,d,x,y:Point.  (|ab| < |cd|  (|ab| < |xy| ∨ |xy| < |cd|))

Lemma: geo-lt-lengths-to-sep
e:EuclideanPlane. ∀a,b,c:Point.  (|ab| < |ac|  c)

Lemma: Euclid-Prop24
p:EuclideanPlane. ∀a,b,c,d,e,f:Point.  (a bc  ef  ab ≅ de  ac ≅ df  edf < bac  bc > ef)

Lemma: Euclid-Prop25
p:EuclideanPlane. ∀a,b,c,d,e,f:Point.  (a bc  ef  ab ≅ de  ac ≅ df  |ef| < |bc|  edf < bac)

Lemma: Euclid-Prop26-1
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.
  (a bc  yz  abc ≅a xyz  bac ≅a yxz  ab ≅ xy  (ac ≅ xz ∧ bc ≅ yz ∧ bca ≅a yzx))

Lemma: Euclid-Prop26-2
e:EuclideanPlane. ∀a,b,c,x,y,z:Point.
  (a bc  yz  abc ≅a xyz  bac ≅a yxz  ac ≅ xz  (ab ≅ xy ∧ bc ≅ yz ∧ bca ≅a yzx))

Lemma: rectangle-sides-cong
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.
  (e ac
   eb
   ac  ⊥be
   df  ⊥eb
   d-e-f
   a-b-c
   ab ≅ eb
   bc ≅ eb
   de ≅ eb
   ef ≅ eb
   {ad ≅ fc ∧ dc ≅ fa})

Definition: Post5
Post5(e) ==
  ∀a,b,c,d,x,y:Point.
    (((Colinear(x;a;b) ∧ Colinear(y;c;d)) ∧ leftof yx ∧ leftof yx ∧ (∀i,j,k:Point.  (axy cyx ≅ ijk ∧ jk)))
     ab \/ cd)

Lemma: Post5_wf
e:EuclideanPlane. (Post5(e) ∈ ℙ)

Lemma: Euclid-Prop27
e:EuclideanPlane. ∀a,b,c,d,x,y:Point.
  (((Colinear(x;a;b) ∧ Colinear(y;c;d)) ∧ (a b ∧ d) ∧ leftof yx ∧ leftof xy ∧ axy ≅a cyx)
   geo-parallel-points(e;a;b;c;d))

Lemma: Euclid-Prop28_1
e:EuclideanPlane. ∀a,b,c,d,x,y,p:Point.
  (((Colinear(x;a;b) ∧ Colinear(y;c;d)) ∧ (a leftof yx ∧ a-x-b) ∧ (c leftof xy ∧ c-y-d) ∧ p-x-y ∧ bxp ≅a cyx)
   geo-parallel-points(e;a;b;c;d))

Lemma: Euclid-Prop28_2
e:EuclideanPlane. ∀a,b,c,d,x,y,p:Point.
  (((Colinear(x;a;b) ∧ Colinear(y;c;d)) ∧ (a leftof yx ∧ a-x-b) ∧ (c leftof xy ∧ c-y-d) ∧ p-x-y ∧ Ryxa ∧ Rxyc)
   geo-parallel-points(e;a;b;c;d))

Lemma: Euclid-Prop31
e:EuclideanPlane. ∀a,b,x:Point.  (a  ab  (∃y:Point. geo-parallel-points(e;a;b;x;y)))

Lemma: Euclid-Prop31-sep
e:EuclideanPlane. ∀a,b,x:Point.  (a  ab  (∃y:Point. (geo-parallel-points(e;a;b;x;y) ∧ y)))

Lemma: parallelogram-construction2
e:EuclideanPlane. ∀a,b,c,x,y:Point.
  (a bc
   a-x-b
   a-y-c
   (∃t:Point
       (geo-parallel-points(e;b;x;y;t)
       ∧ bx ≅ yt
       ∧ xt ≅ by
       ∧ xby ≅a xty
       ∧ (¬¬((a leftof bc  (t leftof ac ∧ leftof bc)) ∧ (a leftof cb  (t leftof ca ∧ leftof cb)))))))

Lemma: parallelogram-construction
e:EuclideanPlane. ∀a,b,c,x,y:Point.
  (a bc
   a-x-b
   a-y-c
   (∃t:Point
       (geo-parallel-points(e;b;x;y;t)
       ∧ (¬¬((a leftof bc  (t leftof ac ∧ leftof bc)) ∧ (a leftof cb  (t leftof ca ∧ leftof cb)))))))

Lemma: Steiner-LehmusTheorem
e:EuclideanPlane. ∀a,b,c,x,y:Point.  (a bc  a-x-b  c-y-b  ay ≅ cx  cay ≅a bay  acx ≅a bcx  ab ≅ cb)

Definition: geo-line
Line ==  x:Point × y:Point × y

Lemma: geo-line_wf
e:GeometryPrimitives. (Line ∈ Type)

Lemma: geo-line-pt-sep
eu:EuclideanPlane. ∀l:Line.  fst(l) fst(snd(l))

Definition: geo-line-sep
(l m) ==  ∃p:Point. (Colinear(p;fst(l);fst(snd(l))) ∧ fst(m)fst(snd(m)))

Lemma: geo-line-sep_wf
[g:GeometryPrimitives]. ∀[l,m:Line].  ((l m) ∈ ℙ)

Definition: geo-line-eq
l ≡ ==  ¬(l m)

Lemma: geo-line-eq_wf
[g:GeometryPrimitives]. ∀[l,m:Line].  (l ≡ m ∈ ℙ)

Lemma: geo-line-from-points
e:EuclideanPlane. ∀a,b:Point.  (a  (∃l:Line. (a ≡ fst(l) ∧ b ≡ fst(snd(l)))))

Lemma: geo-colinear-line-eq
e:EuclideanPlane. ∀a,b,c:Point. ∀l:{l:Line| a ≡ fst(l) ∧ b ≡ fst(snd(l))} . ∀m:{m:Line| b ≡ fst(m) ∧ c ≡ fst(snd(m))} .
  (Colinear(a;b;c)  l ≡ m)

Lemma: geo-colinear-line-eq2
e:EuclideanPlane. ∀l1,l2:Line.
  (Colinear(fst(l1);fst(l2);fst(snd(l2)))  Colinear(fst(snd(l1));fst(l2);fst(snd(l2)))  l1 ≡ l2)

Lemma: geo-line-eq-to-col
g:EuclideanPlane. ∀l,m:Line.
  (l ≡  {Colinear(fst(l);fst(snd(l));fst(m)) ∧ Colinear(fst(l);fst(snd(l));fst(snd(m)))})

Lemma: geo-line-eq_weakening
g:EuclideanPlane. ∀l,m:Line.  ((l m ∈ Line)  l ≡ m)

Lemma: geo-line-eq_inversion
g:EuclideanPlane. ∀l,m:Line.  (l ≡  m ≡ l)

Lemma: geo-line-eq_transitivity
g:EuclideanPlane. ∀l,m,n:Line.  (l ≡  m ≡  l ≡ n)

Lemma: geo-line-eq_functionality
e:EuclideanPlane. ∀l,m,l1,m1:Line.  (l ≡ l1  m ≡ m1  (l ≡ ⇐⇒ l1 ≡ m1))

Lemma: geo-line-eq-equiv
g:EuclideanPlane. EquivRel(Line;l,m.l ≡ m)

Lemma: sq_stable__geo-line-eq
e:EuclideanPlane. ∀m,l:Line.  SqStable(l ≡ m)

Definition: geoline
LINE ==  l,m:Line//l ≡ m

Lemma: geoline_wf
[e:EuclideanPlane]. (LINE ∈ Type)

Lemma: geoline-subtype1
[e:EuclideanPlane]. (Line ⊆LINE)

Lemma: geo-line-eq_weakening2
g:EuclideanPlane. ∀l,m:Line.  ((l m ∈ LINE)  l ≡ m)

Definition: geo-incident
==  ∀l:Line. ((l L ∈ LINE)  Colinear(p;fst(l);fst(snd(l))))

Lemma: geo-incident_wf
[e:EuclideanPlane]. ∀[p:Point]. ∀[l:LINE].  (p l ∈ ℙ)

Lemma: geo-incident-line
[e:EuclideanPlane]. ∀[p:Point]. ∀[l:Line].  uiff(p l;Colinear(p;fst(l);fst(snd(l))))

Lemma: geo-line-eq-geoline
[e:EuclideanPlane]. ∀[P:LINE]. ∀[l:Line].  uiff(fst(l) P ∧ fst(snd(l)) P;l P ∈ LINE)

Lemma: stable__incident
e:EuclideanPlane. ∀a:Point. ∀l:LINE.  Stable{a l}

Lemma: sq_stable__incident
e:EuclideanPlane. ∀a:Point. ∀l:LINE.  SqStable(a l)

Lemma: geo-line-eq-preserves-incidence
g:EuclideanPlane. ∀a:Point. ∀l,m:Line.  (a  l ≡  m)

Lemma: geo-colinear-incident
[e:EuclideanPlane]. ∀[l:LINE]. ∀[a,b,v:Point].  (a  Colinear(a;b;v)    l)

Lemma: geo-strict-between-incident
[e:EuclideanPlane]. ∀[l:LINE]. ∀[a,b,v:Point].  (a-v-b    l)

Definition: geo-intersect
\/ ==
  ∃l,m:Line
   ((l L ∈ LINE)
   ∧ (m M ∈ LINE)
   ∧ (∃a,b:{c:Point| l} (a leftof fst(m)fst(snd(m)) ∧ leftof fst(snd(m))fst(m))))

Lemma: geo-intersect_wf
[e:EuclideanPlane]. ∀[p,l:LINE].  (p \/ l ∈ ℙ)

Lemma: geo-intersect-iff
e:EuclideanPlane. ∀P,L:LINE.
  (P \/ ⇐⇒ ∃a,b,c,d,v:Point. (a-v-b ∧ c-v-d ∧ P ∧ P ∧ L ∧ L ∧ leftof cd ∧ leftof dc))

Lemma: geo-intersect-iff2
e:EuclideanPlane. ∀p,l:LINE.
  (p \/ l
  ⇐⇒ ∃a,b,c,d,v:Point
       (a-v-b ∧ c-v-d ∧ p ∧ p ∧ l ∧ l ∧ leftof cd ∧ leftof dc ∧ leftof ba ∧ leftof ab))

Lemma: geo-intersect-iff3
e:EuclideanPlane. ∀p,l:LINE.
  (p \/ l
  ⇐⇒ ∃a,b,c,d,v:Point
       ∃sab:a b
        ∃scd:c d
         ((p = <a, b, sab> ∈ LINE)
         ∧ (l = <c, d, scd> ∈ LINE)
         ∧ a-v-b
         ∧ c-v-d
         ∧ leftof cd
         ∧ leftof dc
         ∧ leftof ba
         ∧ leftof ab))

Lemma: geo-intersect-lines
e:EuclideanPlane. ∀p,l:Line.
  (p \/ l
  ⇐⇒ ∃a,b:Point
       (Colinear(a;fst(p);fst(snd(p)))
       ∧ Colinear(b;fst(p);fst(snd(p)))
       ∧ leftof fst(l)fst(snd(l))
       ∧ leftof fst(snd(l))fst(l)))

Lemma: geo-intersect-lines-iff
e:EuclideanPlane. ∀p,l:Line.  (p \/ ⇐⇒ (p l) ∧ (∃x:Point. (x p ∧ l)))

Lemma: geo-intersect-symmetry
e:EuclideanPlane. ∀l,m:LINE.  (l \/  \/ l)

Lemma: geo-intersect-irreflexive
[g:EuclideanPlane]. ∀[m:LINE].  \/ m)

Definition: geo-plsep
==  fst(l)fst(snd(l))

Lemma: geo-plsep_wf
[e:GeometryPrimitives]. ∀[p:Point]. ∀[l:Line].  (p l ∈ ℙ)

Lemma: geo-plsep_functionality
e:EuclideanPlane. ∀a1,a2:Point. ∀l1,l2:Line.  (a1 ≡ a2  l1 ≡ l2  (a1 l1 ⇐⇒ a2 l2))

Lemma: geo-incident-not-plsep
[e:EuclideanPlane]. ∀[x:Point]. ∀[m:Line].  ¬supposing m

Lemma: geo-incident-iff-not-plsep
[e:EuclideanPlane]. ∀[x:Point]. ∀[m:Line].  (x ⇐⇒ ¬m)

Definition: geo-Aparallel
|| ==  ¬\/ m

Lemma: geo-Aparallel_wf
[e:EuclideanPlane]. ∀[l,m:LINE].  (l || m ∈ ℙ)

Lemma: sq_stable__geo-Aparallel
[g:EuclideanPlane]. ∀l,m:Line.  SqStable(l || m)

Lemma: Euclid-parallel-exists
e:EuclideanPlane. ∀l:Line. ∀p:Point.  ∃m:Line. (m || l ∧ m)

Lemma: Euclid-parallel-points-exists
e:EuclideanPlane. ∀a:Point. ∀b:{b:Point| b} . ∀p:Point.  ∃q:Point. geo-parallel-points(e;a;b;p;q)

Definition: Playfair-axiom
Playfair-axiom(e) ==  ∀p:Point. ∀l,m,n:Line.  ((p m ∧ || l)  (p n ∧ || l)  m ≡ n)

Lemma: Playfair-axiom_wf
g:EuclideanPlane. (Playfair-axiom(g) ∈ ℙ)

Lemma: stable__Playfair-axiom
g:EuclideanPlane. Stable{Playfair-axiom(g)}

Definition: euclidean-parallel-plane
EuclideanParPlane ==  {g:EuclideanPlane| Playfair-axiom(g)} 

Lemma: euclidean-parallel-plane_wf
EuclideanParPlane ∈ 𝕌'

Lemma: euclidean-planes-subtype
EuclideanParPlane ⊆EuclideanPlane

Lemma: geo-playfair-axiom
e:EuclideanParPlane. ∀p:Point. ∀l,m,n:Line.  ((p m ∧ || l)  (p n ∧ || l)  m ≡ n)

Lemma: geo-Aparallel_functionality
[e1:EuclideanPlane]. ∀[l,m,l2,m2:Line].  ({uiff(l || m;l2 || m2)}) supposing (m ≡ m2 and l ≡ l2)

Lemma: geo-incident_functionality
[e1:EuclideanPlane]. ∀[l,m:Line]. ∀[p,q:Point].  ({uiff(p l;q m)}) supposing (p ≡ and l ≡ m)

Lemma: geo-Aparallel_sym
e:EuclideanPlane. ∀l,m:LINE.  (l ||  || l)

Lemma: geo-Aparallel_weakening
g:EuclideanPlane. ∀l,m:LINE.  ((l m ∈ LINE)  || m)

Lemma: geo-Aparallel_inversion
e:EuclideanPlane. ∀l,m:LINE.  (l ||  || l)

Lemma: geo-Aparallel-trans-lines
e:EuclideanParPlane. ∀l,m,n:Line.  (l ||  ||  || n)

Lemma: geo-Aparallel_transitivity
e:EuclideanParPlane. ∀l,m,n:LINE.  (l ||  ||  || n)

Lemma: geo-Aparallel-equiv
g:EuclideanParPlane. EquivRel(Line;l,m.l || m)

Lemma: geo-Aparallel-equiv2
e:EuclideanParPlane. EquivRel(LINE;l,m.l || m)

Lemma: geoline-subtype2
[e:EuclideanParPlane]. (LINE ⊆(l,m:Line//l || m))

Lemma: geo-Aparallel_weakening2
g:EuclideanParPlane. ∀l,m:LINE.  ((l m ∈ (l,m:Line//l || m))  || m)

Definition: geo-non-parallel
geo-non-parallel(g;l;L) ==  ↓∀a:Line. ((a L ∈ (l,m:Line//l || m))  (∃p:Point. (p l ∧ a)))

Lemma: geo-non-parallel_wf
[g:EuclideanParPlane]. ∀[l:Line]. ∀[L:l,m:Line//l || m].  (geo-non-parallel(g;l;L) ∈ ℙ)

Definition: geo-not-parallel
geo-not-parallel(g;l;L) ==  ∀m:Line. ((m L ∈ (l,m:Line//l || m))  || m))

Lemma: sq_stable__geo-non-parallel
[g:EuclideanParPlane]. ∀[l:Line]. ∀[L:l,m:Line//l || m].  SqStable(geo-non-parallel(g;l;L))

Lemma: geo-intersect-all-parallel2
e:EuclideanPlane. ∀L,M,N:Line.  ((L \/ N ∧ (∀l,m:LINE.  (l \/  (∀n:LINE. (l \/ n ∨ \/ n)))))  ||  \/ N)

Lemma: geo-intersect-unique
eu:EuclideanParPlane. ∀l,m:Line. ∀x,y:Point.  (l \/  (x l ∧ m)  (y l ∧ m)  x ≡ y)

Definition: pp-sep
pp-sep(eu;p;l) ==
  case p
   of inl(p') =>
   case of inl(l') => p' l' inr(_) => True
   inr(p') =>
   case of inl(l') => p' \/ l' inr(_) => False

Lemma: pp-sep_wf
[eu:EuclideanParPlane]. ∀[p:Point Line]. ∀[l:Line?].  (pp-sep(eu;p;l) ∈ ℙ)

Definition: proj-point-sep
proj-point-sep(eu;p;q) ==
  case p
   of inl(p') =>
   case of inl(q') => p' q' inr(q') => True
   inr(p') =>
   case of inl(q') => True inr(q') => p' \/ q'

Lemma: proj-point-sep_wf
[e:EuclideanParPlane]. ∀[p,q:Point Line].  (proj-point-sep(e;p;q) ∈ ℙ)

Lemma: proj-point-sep-irrefl
e:EuclideanParPlane. ∀x:Point Line.  proj-point-sep(e;x;x))

Lemma: proj-point-sep-symmetry
e:EuclideanParPlane. ∀x,y:Point Line.  (proj-point-sep(e;x;y)  proj-point-sep(e;y;x))

Lemma: proj-point-sep-cotrans
e:EuclideanParPlane
  ((∀l,m:Line.  (l \/  (∀n:Line. (l \/ n ∨ \/ n))))
   (∀x,y:Point Line.
        (proj-point-sep(e;x;y)  (∀z:Point Line. (proj-point-sep(e;x;z) ∨ proj-point-sep(e;y;z))))))

Lemma: not-proj-point-sep-is-equiv
e:EuclideanParPlane
  ((∀l,m:Line.  (l \/  (∀n:Line. (l \/ n ∨ \/ n))))  EquivRel(Point Line;p,q.¬proj-point-sep(e;p;q)))

Lemma: projective-lines-exist
e:EuclideanParPlane. ∀p1,p2:Point Line.
  (proj-point-sep(e;p1;p2)  (∃l:Line?. ((¬pp-sep(e;p1;l)) ∧ pp-sep(e;p2;l)))))

Definition: proj-line-sep
proj-line-sep(eu;l;m) ==
  case l
   of inl(l') =>
   case of inl(m') => (l' m') inr(_) => True
   inr(_) =>
   case of inl(m') => True inr(_) => False

Lemma: proj-line-sep_wf
[e:EuclideanParPlane]. ∀[l,m:Line?].  (proj-line-sep(e;l;m) ∈ ℙ)

Lemma: proj-line-sep-irrefl
e:EuclideanParPlane. ∀x:Line?.  proj-line-sep(e;x;x))

Lemma: projective-points-exist
e:EuclideanParPlane. ∀l,m:Line?.  (¬¬(∃p:Point Line. ((¬pp-sep(e;p;l)) ∧ pp-sep(e;p;m)))))

Lemma: not-parallel-implies
eu:EuclideanParPlane. ∀l,m,n:Line.  ((¬|| m)  (l || n ∧ || n)))

Lemma: p_inf-l_eu-sep-exists
eu:EuclideanParPlane. ∀p:l,m:Line//l || m. ∀m:Line.  ((m p ∈ (l,m:Line//l || m))  (∃L:Line. || L)))

Lemma: canonical-parallel
e:EuclideanParPlane. ∀c:l,m:Line//l || m.  (∃l:LINE [(l c ∈ (l,m:Line//l || m))])

Lemma: proj-point-sep_defA
e:EuclideanParPlane. ∀p,q:Point Line.  (proj-point-sep(e;p;q)  (∃n:Line?. ((¬pp-sep(e;p;n)) ∧ pp-sep(e;q;n))))

Lemma: proj-point-sep_defB
e:EuclideanParPlane. ∀p,q:Point Line.
  (((∃n:Line?. ((¬pp-sep(e;p;n)) ∧ pp-sep(e;q;n))) ∧ (∀l,m:Line.  (l \/  (∀n:Line. (l \/ n ∨ \/ n)))))
   proj-point-sep(e;p;q))

Lemma: proj-point-sep-iff-pp-sep
e:EuclideanParPlane
  ((∀l,m:Line.  (l \/  (∀n:Line. (l \/ n ∨ \/ n))))
   (∀p,q:Point Line.  (proj-point-sep(e;p;q) ⇐⇒ ∃n:Line?. ((¬pp-sep(e;p;n)) ∧ pp-sep(e;q;n)))))

Definition: eu-pp-prim
pp(eu) ==  points=Point Line lines=Line? plsep=λp,l. pp-sep(eu;p;l)

Lemma: eu-pp-prim_wf
[eu:EuclideanParPlane]. (pp(eu) ∈ ProjGeomPrimitives)

Lemma: geo-pt-swap-preserves-parallel
e:EuclideanPlane. ∀a,b,c,d:Point. ∀A:a b. ∀C:c d. ∀A':b a.  (<a, b, A> || <c, d, C>  <b, a, A'> || <c, d, C>)

Lemma: geo-Aax2
g:EuclideanPlane. ∀a,b:Point. ∀l,m:Line.  (a  (a l ∧ m)  (b l ∧ m)  l ≡ m)

Lemma: geo-Aax4
g:EuclideanPlane. ∀a,b,c:Point. ∀l,m:Line.  (a  (a l ∧ l)  ((a m ∧ m) ∧ l)  m)

Lemma: geo-line-sep-or-lemma
g:EuclideanParPlane. ∀l,m,p:Line.  (((∀L,M,N:Line.  (L \/  (L \/ N ∨ \/ N))) ∧ \/ m)  ((p l) ∨ (p m)))

Lemma: geo-line-sep-symmetry
g:EuclideanParPlane. ∀l,m:Line.  (((l m) ∧ (∀L,M,N:Line.  (L \/  (L \/ N ∨ \/ N))))  (m l))

Lemma: geo-line-exists
g:EuclideanPlane. Line

Lemma: geo-intersect-LINE-iff-line
eu:EuclideanParPlane. ∀L,M:LINE.  (L \/ ⇐⇒ ∃l:{l:Line| L ∈ LINE} . ∃m:{m:Line| M ∈ LINE} \/ m)

Definition: dist
D(a;b;c;d;e;f) ==  ∃a',b',c':Point. ∃u:{u:Point| c' u} (B(a'b'c') ∧ B(a'uc') ∧ ab ≅ a'b' ∧ cd ≅ b'c' ∧ ef ≅ a'u)

Lemma: dist_wf
[g:EuclideanPlaneStructure]. ∀[a,b,c,d,e,f:Point].  (D(a;b;c;d;e;f) ∈ ℙ)

Definition: dist-axiomsA
dist-axiomsA(g) ==
  (∀a,b,c,d,e,f,h:Point.  (D(a;b;c;d;e;f)  D(a;b;c;d;h;h)))
  ∧ (∀a,b,c,d,e,f:Point.  (D(a;b;c;c;e;f)  D(a;b;d;d;e;f)))
  ∧ (∀a,b,c,d,e,f:Point.  (D(a;b;c;d;e;f)  (D(b;a;c;d;e;f) ∧ D(a;b;c;d;f;e))))
  ∧ (∀a,b,c,d,e,f:Point.  (D(a;b;c;d;e;f)  D(c;d;a;b;e;f)))
  ∧ (∀a,b,c,d:Point.  (D(a;b;b;b;c;d)  D(c;d;d;d;a;b))))
  ∧ (∀a,b,c,d,e,f,x,y:Point.  ((D(a;b;c;d;e;f) ∧ D(x;y;y;y;e;f)))  D(a;b;c;d;x;y)))
  ∧ (∀a,b,c,d,e,f,x,y:Point.  ((D(a;b;c;d;e;f) ∧ D(a;b;b;b;x;y)))  D(x;y;c;d;e;f)))
  ∧ (∀a,b,c,d,e,f:Point.  (D(a;b;b;b;c;d)  (D(a;b;b;b;e;f) ∨ D(e;f;f;f;c;d))))

Lemma: dist-axiomsA_wf
[g:EuclideanPlane]. (dist-axiomsA(g) ∈ ℙ)

Definition: dist-sep
Dsep(g;a;b) ==  D(a;b;b;b;b;b)

Lemma: dist-sep_wf
[g:EuclideanPlane]. ∀[a,b:Point].  (Dsep(g;a;b) ∈ ℙ)

Definition: dist-tri
Dtri(g;a;b;c) ==  D(a;b;b;c;a;c) ∧ D(a;c;b;c;a;b) ∧ D(a;c;a;b;b;c)

Lemma: dist-tri_wf
[g:EuclideanPlane]. ∀[a,b,c:Point].  (Dtri(g;a;b;c) ∈ ℙ)

Definition: dist-bet
Dbet(g;a;b;c) ==  ¬D(a;b;b;c;a;c)

Lemma: dist-bet_wf
[g1:EuclideanPlane]. ∀[a,b,c:Point].  (Dbet(g1;a;b;c) ∈ ℙ)

Definition: dist-cong
Dcong(g;a;b;c;d) ==  D(a;b;b;b;c;d)) ∧ D(c;d;d;d;a;b))

Lemma: dist-cong_wf
[g1:EuclideanPlane]. ∀[a,b,c,d:Point].  (Dcong(g1;a;b;c;d) ∈ ℙ)

Definition: dist-axiomsB
dist-axiomsB(g) ==
  (∀a,b,c,d:Point.  ((Dbet(g;a;b;c) ∧ Dbet(g;a;c;d))  Dbet(g;b;c;d)))
  ∧ (∀a,b,c,d:Point.  ((Dbet(g;a;b;d) ∧ Dbet(g;b;c;d))  Dbet(g;a;c;d)))
  ∧ (∀a,b,c,d:Point.  (((Dsep(g;b;c) ∧ Dbet(g;a;b;c)) ∧ Dbet(g;b;c;d))  Dbet(g;a;b;d)))
  ∧ (∀a,b,c:Point.  ((Dbet(g;a;b;c) ∧ Dsep(g;b;c))  D(a;c;c;c;a;b)))
  ∧ (∀a,b,c,d:Point.
       (((Dbet(g;a;b;c) ∧ Dbet(g;a;b;d)) ∧ Dsep(g;a;b) ∧ Dsep(g;c;d))  (Dbet(g;a;c;d) ∨ Dbet(g;a;d;c))))
  ∧ (∀a,b,c,d,e:Point.  (Dbet(g;a;b;c)  (D(a;b;b;c;d;e) ⇐⇒ D(a;c;c;c;d;e))))
  ∧ (∀a,b,c,x:Point.  (Dtri(g;a;b;c)  (Dsep(g;c;x) ∨ Dtri(g;a;b;x))))

Lemma: dist-axiomsB_wf
[g:EuclideanPlane]. (dist-axiomsB(g) ∈ ℙ)

Lemma: not-dist-lemma
g:EuclideanPlane. ∀a,b,c,d:Point.  ((¬D(a;b;b;b;c;d))  ab > cd))

Lemma: dist-lemma-le
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.  (D(a;b;c;d;e;f)  |ef| ≤ |ab| |cd|)

Lemma: dist-lemma-lt
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.  (D(a;b;c;d;e;f)  |ef| < |ab| |cd|)

Lemma: dist-lemma-lt-2
g:EuclideanPlane. ∀a,b,e,f:Point.  (D(a;b;b;b;e;f)  |ef| < |ab|)

Lemma: dist-to-gt
g:EuclideanPlane. ∀a,b,c,d:Point.  (D(a;b;b;b;c;d)  ab > cd)

Lemma: geo-lt-not-congruent
g:EuclideanPlane. ∀a,b,c,d:Point.  (|ab| < |cd|  ab ≅ cd))

Lemma: geo-bet-or
g:EuclideanPlane. ∀a,b,c,d:Point.  (((B(abc) ∧ B(abd)) ∧ b)  (¬¬(B(bcd) ∨ B(bdc))))

Lemma: geo-lt-implies-gt
g:EuclideanPlane. ∀a,b,c,d:Point.  (|cd| < |ab|  (¬¬ab > cd))

Lemma: dist-lemma-lt2
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.  (|ef| < |ab| |cd|  D(a;b;c;d;e;f))

Lemma: dist-iff-lt
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.  (|ef| < |ab| |cd| ⇐⇒ D(a;b;c;d;e;f))

Lemma: not-dist-lemma-lt
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.  ((¬D(a;b;c;d;e;f))  |ef| < |ab| |cd|))

Lemma: not-dist-cong
g:EuclideanPlane. ∀a,b,c,d:Point.  (((¬D(a;b;b;b;c;d)) ∧ D(c;d;d;d;a;b)))  ab ≅ cd)

Lemma: geo-ge-between-sep
g:EuclideanPlane. ∀a,b,c,a1,a2,x,y,t:Point.  (B(abc)   ab ≅ a1a2  a1a2 ≥ xy  B(atc)  at ≅ xy  c)

Lemma: geo-not-gt-to-ge
g:EuclideanPlane. ∀x,y,e,f:Point.  ((¬xy > ef)  ef ≥ xy)

Lemma: geo-not-lt-to-le
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.  ((¬|ef| < |ab| |cd|)  |ab| |cd| ≤ |ef|)

Lemma: not-dist-to-le
g:EuclideanPlane. ∀a,b,c,d,e,f:Point.  ((¬D(a;b;c;d;e;f))  |ab| |cd| ≤ |ef|)

Lemma: Dbet-to-le
g:EuclideanPlane. ∀a,b,c:Point.  (Dbet(g;a;b;c)  |ab| |bc| ≤ |ac|)

Lemma: Dbet-to-between
e:EuclideanPlane. ∀a,b,c:Point.  ((∀A,B,C:Point.  (A BC  |AC| < |AB| |BC|))  Dbet(e;a;b;c)  B(abc))

Lemma: Dbet-iff-between
e:EuclideanPlane. ∀a,b,c:Point.  ((∀A,B,C:Point.  (A BC  |AC| < |AB| |BC|))  (Dbet(e;a;b;c) ⇐⇒ B(abc)))

Lemma: Dsep-to-sep
e:EuclideanPlane. ∀a,b:Point.  (Dsep(e;a;b)  b)

Lemma: Dsep-iff-sep
e:EuclideanPlane. ∀a,b:Point.  (Dsep(e;a;b) ⇐⇒ b)

Lemma: Dtri-iff-lsep
e:EuclideanPlane. ∀a,b,c:Point.  (Dtri(e;a;b;c) ⇐⇒ bc)

Lemma: Dtri-cycle
e:EuclideanPlane. ∀a,b,c:Point.
  (Dtri(e;a;b;c)  {(Dtri(e;a;c;b) ∧ Dtri(e;c;a;b)) ∧ (Dtri(e;c;b;a) ∧ Dtri(e;b;a;c)) ∧ Dtri(e;b;c;a)})

Lemma: Dcong-iff-cong
g:EuclideanPlane. ∀a,b,c,d:Point.  (Dcong(g;a;b;c;d) ⇐⇒ ab ≅ cd)

Lemma: lsep-implies-sep-or-not-colinear
e:EuclideanPlane. ∀a,b,c,x:Point.  (a bc  (c x ∨ Colinear(a;b;x))))

Lemma: eu-eq_dist-axiomsB
g:EuclideanPlane. ((∀a,b,c:Point.  (a bc  |ac| < |ab| |bc|))  dist-axiomsB(g))

Lemma: eu-eq_dist-axiomsA
g:EuclideanPlane. dist-axiomsA(g)

Lemma: geo-lt-or2
e:EuclideanPlane. ∀a,b,c,d:Point.  (|ab| < |ac|  (|ab| < |ad| ∨ |ad| < |ac|))

Lemma: eu-eq_dist-axiomA9
e:EuclideanPlane. ∀a1,a2,a3,a4,a5,a6,b:Point.  (D(a1;a2;a3;a4;a5;a6)  (a4 b ∨ D(a1;a2;a3;b;a5;a6)))

Lemma: eu-eq_dist-axiomA10
G:EuclideanPlane. ∀a,b,c,d,e,f,g:Point.  (D(a;b;c;d;e;f)  D(c;d;e;f;a;b)  d)

Lemma: eu-eq_dist-axiomsC-Pasch
e:EuclideanPlane. ∀x,y,z,u,t:Point.
  (((((Dbet(e;x;t;u) ∧ Dsep(e;x;t)) ∧ Dbet(e;y;u;z)) ∧ Dtri(e;x;y;u)) ∧ Dtri(e;u;z;t))
   (∃v:Point. ((Dbet(e;x;v;y) ∧ Dsep(e;x;v) ∧ Dsep(e;v;y)) ∧ Dbet(e;z;t;v) ∧ Dsep(e;z;t) ∧ Dsep(e;t;v))))

Lemma: eu-eq_dist-axiomsC-five-segment
e:EuclideanPlane. ∀x,y,z,x',y',z',u,u':Point.
  (Dcong(e;x;y;x';y')
   Dcong(e;y;z;y';z')
   Dcong(e;x;u;x';u')
   Dcong(e;y;u;y';u')
   (Dbet(e;x;y;z) ∧ Dsep(e;x;y) ∧ Dsep(e;y;z))
   (Dbet(e;x';y';z') ∧ Dsep(e;x';y') ∧ Dsep(e;y';z'))
   Dcong(e;z;u;z';u'))

Definition: P_point
P_point(eu) ==  p:Point × l:Line × n:Line × (p n ∧ l)

Lemma: P_point_wf
eu:EuclideanParPlane. (P_point(eu) ∈ Type)

Definition: P_line
P_line(eu) ==  l:Line × p:Point × n:{n:Line| n}  × l

Lemma: P_line_wf
e:EuclideanParPlane. (P_line(e) ∈ Type)

Definition: P_point-line-sep
P_point-line-sep(e;P;L) ==
  (fst(snd(P)) \/ fst(L) ∨ fst(snd(snd(P))) \/ fst(L))
  ∧ (∀x:{x:Point| fst(snd(P)) ∧ fst(snd(snd(P)))} fst(L))

Lemma: P_point-line-sep_wf
[eu:EuclideanParPlane]. ∀P:P_point(eu). ∀n:P_line(eu).  (P_point-line-sep(eu;P;n) ∈ ℙ)

Definition: P_point-sep
P_point-sep(eu;P;Q) ==  ∃L:P_line(eu). ((¬P_point-line-sep(eu;P;L)) ∧ P_point-line-sep(eu;Q;L))

Lemma: P_point-sep_wf
[eu:EuclideanParPlane]. ∀P,Q:P_point(eu).  (P_point-sep(eu;P;Q) ∈ ℙ)

Lemma: P_point-apartness-relation1
e:EuclideanParPlane. ∀P:P_point(e).  P_point-sep(e;P;P))

Definition: P_line-sep
P_line-sep(eu;L;M) ==  ∃P:P_point(eu). ((¬P_point-line-sep(eu;P;L)) ∧ P_point-line-sep(eu;P;M))

Lemma: P_line-sep_wf
[eu:EuclideanParPlane]. ∀[l,m:P_line(eu)].  (P_line-sep(eu;l;m) ∈ ℙ)

Lemma: common-P_point-intersecting-P_lines
e:EuclideanParPlane. ∀P:P_point(e). ∀L:P_line(e).
  ((¬P_point-line-sep(e;P;L))
   (fst(snd(P)) \/ fst(snd(snd(P))) ∧ (∀l,m,n:Line.  (l \/  (l \/ n ∨ \/ n))))
   (∃x:Point. ((x fst(snd(P)) ∧ fst(snd(snd(P)))) ∧ fst(L))))

Lemma: common-P_point-intersecting-P_lines2
e:EuclideanParPlane. ∀P:P_point(e). ∀L,L1:P_line(e).
  (((¬P_point-line-sep(e;P;L)) ∧ P_point-line-sep(e;P;L1)))
   fst(L) \/ fst(L1)
   (∀l,m,n:Line.  (l \/  (l \/ n ∨ \/ n)))
   (∃x:Point. ((x fst(snd(P)) ∧ fst(snd(snd(P)))) ∧ fst(L) ∧ fst(L1))))

Lemma: common-P_point-parallel-P_lines
e:EuclideanParPlane. ∀P:P_point(e). ∀L:P_line(e).
  ((¬P_point-line-sep(e;P;L))
   (fst(snd(P)) || fst(snd(snd(P))) ∧ (∀l,m,n:Line.  (l \/  (l \/ n ∨ \/ n))))
   fst(L) || fst(snd(snd(P))))

Lemma: AX3
e:EuclideanParPlane. ∀l,m:P_line(e).
  ((P_line-sep(e;l;m) ∧ (∀l,m,n:Line.  (l \/  (l \/ n ∨ \/ n))))
   (∃P:P_point(e). ((¬P_point-line-sep(e;P;l)) ∧ P_point-line-sep(e;P;m)))))

Lemma: canonical-parallel2
e:EuclideanParPlane. ∀c:l,m:Line//l || m. ∀a:Point.  (∃l:{l:LINE| l}  [(l c ∈ (l,m:Line//l || m))])

Lemma: P_ptsep-apartness2
eu:EuclideanParPlane
  ((∀l,m,n:Line.  (l \/  (l \/ n ∨ \/ n)))
   (∀p,q,r:l,m:Line//l || m. ∀P:{P:Line| P ∈ (l,m:Line//l || m)} . ∀Q:{Q:Line| Q ∈ (l,m:Line//l || m)} .
      ∀R:{R:Line| R ∈ (l,m:Line//l || m)} .
        (P \/  (P \/ R ∨ \/ R))))

Lemma: parallel-preserves-intersection
eu:EuclideanParPlane. ∀l,m,n:Line.  ((l \/  (l \/ n ∨ \/ n))  (l \/ m ∧ || n)  \/ n)



Home Index