Section first_order.
Context `{Tn:Tarski_neutral_dimensionless}.
(** Dedekind's axiom of continuity implies the Tarski's axiom schema of continuity *)
(** This is a type whose members describe first-order formulas *)
Inductive tFOF :=
eq_fof1 : Tpoint -> Tpoint -> tFOF
| bet_fof1 : Tpoint -> Tpoint -> Tpoint -> tFOF
| cong_fof1 : Tpoint -> Tpoint -> Tpoint -> Tpoint -> tFOF
| not_fof1 : tFOF -> tFOF
| and_fof1 : tFOF -> tFOF -> tFOF
| or_fof1 : tFOF -> tFOF -> tFOF
| implies_fof1 : tFOF -> tFOF -> tFOF
| forall_fof1 : (Tpoint -> tFOF) -> tFOF
| exists_fof1 : (Tpoint -> tFOF) -> tFOF.
(** This function interperts tFOF elements as Prop *)
Fixpoint fof1_prop (F:tFOF) := match F with
eq_fof1 A B => A = B
| bet_fof1 A B C => Bet A B C
| cong_fof1 A B C D => Cong A B C D
| not_fof1 F1 => ~ fof1_prop F1
| and_fof1 F1 F2 => fof1_prop F1 /\ fof1_prop F2
| or_fof1 F1 F2 => fof1_prop F1 \/ fof1_prop F2
| implies_fof1 F1 F2 => fof1_prop F1 -> fof1_prop F2
| forall_fof1 P => forall A, fof1_prop (P A)
| exists_fof1 P => exists A, fof1_prop (P A) end.
(** Every first-order formula is equivalent to a Prop built with fof1_prop *)

Lemma fof__fof1 : FunctionalChoice_on Tpoint tFOF ->
forall F, FOF F -> exists F1,  F <-> fof1_prop F1 .