Require Export HFS.Operations.
Section Ordinals.
Variable X: HF.
Implicit Types x y z alpha beta : X.
Inductive ord : X -> Prop :=
| Ord0 : ord 0
| OrdS x : ord x -> ord (x@x).
Fact ord_trans alpha (A : ord alpha) :
trans alpha.
Proof.
induction A; hfs.
Qed.
Fact ord_ord alpha z (A : ord alpha) :
z el alpha -> ord z.
Proof.
induction A; hfs.
Qed.
Fact ord_eset' alpha (A : ord alpha) :
alpha <> 0 -> 0 el alpha.
Proof.
intros B. induction A as [|alpha A IH].
- exfalso; auto.
- decide (alpha=0) as [-> |C]; hfs.
Qed.
Fact ord_eset alpha (A : ord alpha) :
(alpha = 0) + (0 el alpha).
Proof.
decide (alpha=0) as [-> |B]; auto using ord_eset'.
Qed.
Fact ord_pred alpha (A : ord alpha) :
alpha <> 0 -> alpha = union alpha @ union alpha.
Proof.
intros B. induction A as [|alpha A IH].
- exfalso; auto.
- rewrite succ_inv; auto using ord_trans.
Qed.
Fact ord_pred' alpha (A : ord alpha) :
ord (union alpha).
Proof.
induction A as [|alpha A IH].
- rewrite unionE_eq. constructor.
- rewrite succ_inv; auto using ord_trans.
Qed.
Fact ord_inv alpha (A : ord alpha) :
(alpha = 0) + Sigma gamma, ord gamma /\ alpha = gamma @ gamma.
Proof.
decide (alpha = 0) as [-> |B]. now left.
right. exists (union alpha). auto using ord_pred, ord_pred'.
Qed.
Fact ord_sip (p : X -> Type) :
p 0 -> (forall alpha, ord alpha -> p alpha -> p (alpha @ alpha)) ->
forall alpha, ord alpha -> p alpha.
Proof.
intros A B alpha. epsilon_induction alpha.
intros alpha IH [-> |(gamma&C&->)] % ord_inv.
- exact A.
- apply (B gamma C), IH; hfs.
Qed.
Fact ord_mono alpha beta (B : ord beta) :
alpha el beta -> alpha @ alpha el beta @ beta.
Proof.
induction B; hfs.
Qed.
Fact ord_tricho alpha beta (A : ord alpha) (B : ord beta) :
(alpha el beta) + (alpha = beta) + (beta el alpha).
Proof.
revert beta B. pattern alpha. revert alpha A. apply ord_sip.
- intros beta [B|B] % ord_eset; eauto.
- intros alpha A IH beta B.
destruct (ord_inv B) as [->|(gamma&C&->)].
+ right. apply ord_eset in A as [-> |A]; hfs.
+ destruct (IH gamma C) as [[D| -> ]|D]; auto using ord_mono.
Qed.
Fact ord_incl alpha beta (A : ord alpha) (B : ord beta) :
alpha el beta <-> alpha <<= beta /\ alpha <> beta.
Proof.
split.
- intros C. split.
+ now apply ord_trans.
+ intros <-. contradiction (el_irrefl C).
- intros [C D].
destruct (ord_tricho A B) as [[E|<- ]|E].
+ exact E.
+ exfalso. auto.
+ exfalso. pose proof (ord_trans A E) as F.
apply D. extensio as z. hfs.
Qed.
Fact ord_chain x :
(forall z, z el x -> ord z) -> chain x.
Proof.
intros C alpha beta A B.
destruct (ord_tricho (C _ A) (C _ B)) as [[D| <-]|D].
- left. apply ord_incl; auto.
- auto.
- right. apply ord_incl; auto.
Qed.
Fact ord_chain' alpha (A : ord alpha) :
chain alpha.
Proof.
apply ord_chain. eauto using ord_ord.
Qed.
Bernays characterization of ordinals as hereditarily transitive sets
Definition HT x := trans x /\ forall z, z el x -> trans z.
Fact HT_trans x y :
HT x -> y el x -> HT y.
Proof.
intros [A B] C. split.
- auto.
- apply A in C. hfs.
Qed.
Fact ord_trans_ord x :
trans x -> (forall z, z el x -> ord z) -> ord x.
Proof.
intros A B.
decide (x=0) as [-> |C]. now constructor.
assert (D: union x el x).
{ apply chain_union. hfs. now apply ord_chain. }
enough (union x @ union x = x) as <- by auto using ord.
extensio as z. split; intros E.
- hnf in A. hfs.
- assert (F: z <<= union x) by apply union_el_incl, E.
decide (z = union x) as [-> |G]. hfs.
enough (z el union x) by hfs.
apply ord_incl; auto.
Qed.
Theorem ord_HT x :
ord x <-> HT x.
Proof.
split.
- intros A. split; eauto using ord_trans, ord_ord.
- epsilon_induction x. intros x IH A. apply ord_trans_ord.
+ now destruct A.
+ eauto using HT_trans.
Qed.
End Ordinals.