mirror of https://github.com/nmvdw/HITs-Examples
225 lines
5.9 KiB
Coq
225 lines
5.9 KiB
Coq
(** If [A] has a total order, then we can pick the minimum of finite sets. *)
|
||
Require Import HoTT HitTactics.
|
||
Require Import HoTT.Classes.interfaces.orders.
|
||
Require Import kuratowski.kuratowski_sets kuratowski.operations kuratowski.properties.
|
||
|
||
Section minimum.
|
||
Context {A : Type}.
|
||
Context (Ale : Le A).
|
||
Context `{@TotalOrder A Ale}.
|
||
|
||
Class IsTop `{Top A} := is_top : forall (x : A), x ≤ ⊤.
|
||
|
||
Definition min (x y : A) : A.
|
||
Proof.
|
||
destruct (total _ x y).
|
||
- apply x.
|
||
- apply y.
|
||
Defined.
|
||
|
||
Lemma min_spec1 x y : (min x y) ≤ x.
|
||
Proof.
|
||
unfold min.
|
||
destruct (total _ x y) ; simpl.
|
||
- reflexivity.
|
||
- assumption.
|
||
Defined.
|
||
|
||
Lemma min_spec2 x y z : z ≤ x -> z ≤ y -> z ≤ (min x y).
|
||
Proof.
|
||
intros.
|
||
unfold min.
|
||
destruct (total _ x y); simpl; assumption.
|
||
Defined.
|
||
|
||
Lemma min_comm x y : min x y = min y x.
|
||
Proof.
|
||
unfold min.
|
||
destruct (total _ x y) ; destruct (total _ y x) ; simpl; try reflexivity.
|
||
+ apply antisymmetry with (≤); [apply _|assumption..].
|
||
+ apply antisymmetry with (≤); [apply _|assumption..].
|
||
Defined.
|
||
|
||
Lemma min_idem x : min x x = x.
|
||
Proof.
|
||
unfold min.
|
||
destruct (total _ x x) ; simpl; reflexivity.
|
||
Defined.
|
||
|
||
Lemma min_assoc x y z : min (min x y) z = min x (min y z).
|
||
Proof.
|
||
apply antisymmetry with (≤). apply _.
|
||
- apply min_spec2.
|
||
* etransitivity ; apply min_spec1.
|
||
* apply min_spec2.
|
||
** etransitivity ; try (apply min_spec1).
|
||
simpl.
|
||
rewrite min_comm ; apply min_spec1.
|
||
** rewrite min_comm ; apply min_spec1.
|
||
- apply min_spec2.
|
||
* apply min_spec2.
|
||
** apply min_spec1.
|
||
** etransitivity.
|
||
{ rewrite min_comm ; apply min_spec1. }
|
||
apply min_spec1.
|
||
* transitivity (min y z); simpl
|
||
; rewrite min_comm ; apply min_spec1.
|
||
Defined.
|
||
|
||
Lemma min_nr `{IsTop} x : min x ⊤ = x.
|
||
Proof.
|
||
intros.
|
||
unfold min.
|
||
destruct (total _ x ⊤).
|
||
- reflexivity.
|
||
- apply antisymmetry with (≤). apply _.
|
||
+ assumption.
|
||
+ apply is_top.
|
||
Defined.
|
||
|
||
Lemma min_nl `{IsTop} x : min ⊤ x = x.
|
||
Proof.
|
||
rewrite min_comm.
|
||
apply min_nr.
|
||
Defined.
|
||
|
||
Lemma min_top_l `{IsTop} x y : min x y = ⊤ -> x = ⊤.
|
||
Proof.
|
||
unfold min.
|
||
destruct (total _ x y) as [?|s].
|
||
- apply idmap.
|
||
- intros X.
|
||
rewrite X in s.
|
||
apply antisymmetry with (≤). apply _.
|
||
* apply is_top.
|
||
* assumption.
|
||
Defined.
|
||
|
||
Lemma min_top_r `{IsTop} x y : min x y = ⊤ -> y = ⊤.
|
||
Proof.
|
||
rewrite min_comm.
|
||
apply min_top_l.
|
||
Defined.
|
||
|
||
End minimum.
|
||
|
||
Section add_top.
|
||
Variable (A : Type).
|
||
Context `{TotalOrder A}.
|
||
|
||
Definition Topped := (A + Unit)%type.
|
||
Global Instance top_topped : Top Topped := inr tt.
|
||
|
||
Global Instance RTop : Le Topped.
|
||
Proof.
|
||
intros [a1 | ?] [a2 | ?].
|
||
- apply (a1 ≤ a2).
|
||
- apply Unit_hp.
|
||
- apply False_hp.
|
||
- apply Unit_hp.
|
||
Defined.
|
||
|
||
Instance rtop_hprop :
|
||
is_mere_relation A R -> is_mere_relation Topped RTop.
|
||
Proof.
|
||
intros ? P a b.
|
||
destruct a ; destruct b ; simpl; apply _.
|
||
Defined.
|
||
|
||
Global Instance RTopOrder : TotalOrder RTop.
|
||
Proof.
|
||
repeat split; try apply _.
|
||
- intros [?|?] ; cbv.
|
||
* reflexivity.
|
||
* apply tt.
|
||
- intros [a1 | []] [a2 | []] [a3 | []]; cbv
|
||
; try contradiction; try (by intros; apply tt).
|
||
apply transitivity.
|
||
- intros [a1 |[]] [a2 |[]]; cbv; try contradiction.
|
||
+ intros. f_ap. apply antisymmetry with Ale; [apply _|assumption..].
|
||
+ intros; reflexivity.
|
||
- intros [a1|[]] [a2|[]]; cbv.
|
||
* apply total. apply _.
|
||
* apply (inl tt).
|
||
* apply (inr tt).
|
||
* apply (inr tt).
|
||
Defined.
|
||
|
||
Global Instance is_top_topped : IsTop RTop.
|
||
Proof. intros [?|?]; cbv; apply tt. Defined.
|
||
End add_top.
|
||
|
||
(** If [A] has a total order, then a nonempty finite set has a minimum element. *)
|
||
Section min_set.
|
||
Variable (A : Type).
|
||
Context `{TotalOrder A}.
|
||
Context `{Univalence} `{IsHSet A}.
|
||
|
||
(* The reason why we put an additional element on top, is so that we can take the minimum of two results when considering union *)
|
||
Definition min_set : FSet A -> Topped A.
|
||
Proof.
|
||
hrecursion.
|
||
- apply ⊤.
|
||
- apply inl.
|
||
- apply min with (RTop A). apply _.
|
||
- intros ; symmetry ; apply min_assoc.
|
||
- apply min_comm.
|
||
- apply min_nl. apply _.
|
||
- apply min_nr. apply _.
|
||
- intros ; apply min_idem.
|
||
Defined.
|
||
|
||
Definition empty_min : forall (X : FSet A), min_set X = ⊤ -> X = ∅.
|
||
Proof.
|
||
simple refine (FSet_ind _ _ _ _ _ _ _ _ _ _ _)
|
||
; try (intros ; apply path_forall ; intro q ; apply set_path2)
|
||
; simpl.
|
||
- intros ; reflexivity.
|
||
- intros.
|
||
unfold top in X.
|
||
enough Empty.
|
||
{ contradiction. }
|
||
refine (not_is_inl_and_inr' (inl a) _ _).
|
||
* apply tt.
|
||
* rewrite X ; apply tt.
|
||
- intros x y ? ? ?.
|
||
assert (min_set x = ⊤).
|
||
{ simple refine (min_top_l _ _ (min_set y) _) ; assumption. }
|
||
rewrite (X X2).
|
||
rewrite nl.
|
||
assert (min_set y = ⊤).
|
||
{ simple refine (min_top_r _ (min_set x) _ _) ; assumption. }
|
||
rewrite (X0 X3).
|
||
reflexivity.
|
||
Defined.
|
||
|
||
Definition min_set_spec (a : A) : forall (X : FSet A),
|
||
a ∈ X -> min_set X ≤ inl a.
|
||
Proof.
|
||
simple refine (FSet_ind _ _ _ _ _ _ _ _ _ _ _)
|
||
; try (intros ; apply path_ishprop)
|
||
; simpl.
|
||
- contradiction.
|
||
- intros.
|
||
strip_truncations.
|
||
rewrite X.
|
||
reflexivity.
|
||
- intros.
|
||
strip_truncations.
|
||
unfold member in X, X0.
|
||
destruct X1.
|
||
* specialize (X t).
|
||
assert (RTop A (min _ (min_set x) (min_set y)) (min_set x)) as X1.
|
||
{ apply min_spec1. }
|
||
etransitivity.
|
||
{ apply X1. }
|
||
assumption.
|
||
* specialize (X0 t).
|
||
assert (RTop A (min _ (min_set x) (min_set y)) (min_set y)) as X1.
|
||
{ rewrite min_comm ; apply min_spec1. }
|
||
etransitivity.
|
||
{ apply X1. }
|
||
assumption.
|
||
Defined.
|
||
End min_set.
|