(* Julien Narboux *)
(* Formalization of *)
(* Tarski's axiomatic *)

(* Some general tactics *)
Ltac ex_elim H x := elim H; intros x ; intro; clear H.Ltac DecompEx H P := elim H;intro P;intro;clear H.Ltac DecompExAnd H P :=
  elim H;intro P;let id:=fresh in
(intro id;decompose [and] id;clear id;clear H).Ltac exist_hyp t := match goal with
  | H1:t |- _ => idtac
 end.Ltac hyp_of_type t := match goal with
  | H1:t |- _ => H1
end.Ltac clean_duplicated_hyps :=
  repeat match goal with
      | H:?X1 |- _ => clear H; exist_hyp X1
end.Ltac suppose H := cut H;[intro|idtac].Ltac not_exist_hyp t := match goal with
  | H1:t |- _ => fail 2
 end || idtac.Ltac DecompAndAll :=
 repeat
 match goal with
   | H:(?X1 /\ ?X2) |- _ => decompose [and] H;clear H
end.Ltac assert_if_not_exist H :=
  not_exist_hyp H;assert H.Ltac absurde :=
match goal with
   |H : (?X <> ?X) |- _ => apply False_ind; apply H; reflexivity
end.Ltac spliter := repeat
match goal with
   | H:(?X1 /\ ?X2) |- _ => induction H
end.Ltac ex_and H x := elim H; intro x; intros; clear H;spliter.(* Ltac ex_and H x := ex_elim H x; spliter. *)

Ltac use H := decompose [and] H;clear H.Ltac try_or T :=
 match goal with
 | |- ?A \/ ?B =>
   (left; try_or T) || (right;try_or T)
 | |- _ => T
 end.Ltac sort_tactic :=
  try match goal with H: ?T |- _ =>
  match type of T with Prop =>
    generalizes H; (try sort_tactic); intro
  end end.Definition ltac_something (P:Type) (e:P) := e.Notation "'Something'" :=
  (@ltac_something _ _).

(* Specifications: *)
Lemma ltac_something_eq : forall (e:Type), e = (@ltac_something _ e).
Lemma ltac_something_hide : forall (e:Type), e -> (@ltac_something _ e).
Lemma ltac_something_show : forall (e:Type), (@ltac_something _ e) -> e.