Library ZFind_wd
A theory of dependent inductive families (here W-types) as a subset
of a W-type
Parameters of W-types
Index type
Constraints on the subterms
Hypothesis f : set -> set -> set.
Hypothesis fm : morph2 f.
Hypothesis ftyp : ∀ x i,
x ∈ A -> i ∈ B x -> f x i ∈ Arg.
Hypothesis fm : morph2 f.
Hypothesis ftyp : ∀ x i,
x ∈ A -> i ∈ B x -> f x i ∈ Arg.
Instance introduced by the constructors
The intended type operator:
Inductive Wd : Arg->Type := C (x:A) (_:∀ i:B x, Wd(f x i)) : Wd(g x).
is encoded as
[Inductive Wd' (a:Arg) : Type := C' (x:A) (_:g x=a) (_:∀ i:B x, Wd(f x i)).
Definition W_Fd (X:set->set) (a:set) :=
sigma (subset A (fun x => g x a)) (fun x => cc_prod (B x) (fun i => X (f x i))).
Instance W_Fd_morph :
Proper ((eq_set ==> eq_set) ==> eq_set ==> eq_set) W_Fd.
do 3 red; intros.
apply sigma_ext; intros.
apply subset_morph; auto with *.
red; intros.
rewrite H0; reflexivity.
apply subset_elim1 in H1.
apply cc_prod_ext; auto with *.
red; intros.
apply H.
apply fm; auto.
Qed.
Lemma W_Fd_mono : mono_fam Arg W_Fd.
do 2 red; intros.
apply sigma_mono.
do 2 red; intros.
apply subset_elim1 in H3.
apply cc_prod_ext; auto with *.
red; intros.
apply H; apply fm; auto.
do 2 red; intros.
apply subset_elim1 in H3.
apply cc_prod_ext; auto with *.
red; intros.
apply H0; apply fm; auto.
red; intros.
rewrite subset_ax in H3|-*; destruct H3 as (?,(z',?,?)).
split; trivial.
exists z'; trivial.
intros.
apply subset_elim1 in H3.
apply cc_prod_covariant; auto with *.
do 2 red; intros.
apply H0; apply fm; auto with *.
intros.
rewrite <- H4; apply H1; auto.
Qed.
Hint Resolve W_Fd_mono.
Lemma W_Fd_incl_W_F X Y :
ext_fun Arg X ->
(∀ a, a ∈ Arg -> X a ⊆ Y) ->
∀ a, a ∈ Arg -> W_Fd X a ⊆ W_F A B Y.
intros.
apply sigma_mono.
do 2 red; intros.
apply subset_elim1 in H2.
apply cc_prod_ext; auto with *.
red; intros.
apply H; auto.
apply fm; trivial.
do 2 red; intros; apply cc_arr_morph; auto with *.
red; intros.
apply subset_elim1 in H2; trivial.
intros.
apply subset_elim1 in H2.
unfold cc_arr; apply cc_prod_covariant; auto with *.
Qed.
sigma (subset A (fun x => g x a)) (fun x => cc_prod (B x) (fun i => X (f x i))).
Instance W_Fd_morph :
Proper ((eq_set ==> eq_set) ==> eq_set ==> eq_set) W_Fd.
do 3 red; intros.
apply sigma_ext; intros.
apply subset_morph; auto with *.
red; intros.
rewrite H0; reflexivity.
apply subset_elim1 in H1.
apply cc_prod_ext; auto with *.
red; intros.
apply H.
apply fm; auto.
Qed.
Lemma W_Fd_mono : mono_fam Arg W_Fd.
do 2 red; intros.
apply sigma_mono.
do 2 red; intros.
apply subset_elim1 in H3.
apply cc_prod_ext; auto with *.
red; intros.
apply H; apply fm; auto.
do 2 red; intros.
apply subset_elim1 in H3.
apply cc_prod_ext; auto with *.
red; intros.
apply H0; apply fm; auto.
red; intros.
rewrite subset_ax in H3|-*; destruct H3 as (?,(z',?,?)).
split; trivial.
exists z'; trivial.
intros.
apply subset_elim1 in H3.
apply cc_prod_covariant; auto with *.
do 2 red; intros.
apply H0; apply fm; auto with *.
intros.
rewrite <- H4; apply H1; auto.
Qed.
Hint Resolve W_Fd_mono.
Lemma W_Fd_incl_W_F X Y :
ext_fun Arg X ->
(∀ a, a ∈ Arg -> X a ⊆ Y) ->
∀ a, a ∈ Arg -> W_Fd X a ⊆ W_F A B Y.
intros.
apply sigma_mono.
do 2 red; intros.
apply subset_elim1 in H2.
apply cc_prod_ext; auto with *.
red; intros.
apply H; auto.
apply fm; trivial.
do 2 red; intros; apply cc_arr_morph; auto with *.
red; intros.
apply subset_elim1 in H2; trivial.
intros.
apply subset_elim1 in H2.
unfold cc_arr; apply cc_prod_covariant; auto with *.
Qed.
Predicate characterizing the elements of the W-type that respect the
index constraints
Inductive instance a w : Prop :=
| I_node :
fst w ∈ A ->
g (fst w) a ->
(∀ i, i ∈ B (fst w) -> instance (f (fst w) i) (cc_app (snd w) i)) ->
instance a w.
Instance inst_m : Proper (eq_set ==> eq_set ==> iff) instance.
apply morph_impl_iff2; auto with *.
do 4 red; intros.
revert y H y0 H0.
induction H1; constructor; intros.
rewrite <- H4; trivial.
rewrite <- H3; rewrite <- H4; trivial.
apply H2 with i.
rewrite (Bext _ _ H (fst_morph _ _ H4)); trivial.
rewrite H4; reflexivity.
rewrite H4; reflexivity.
Qed.
Lemma inst_inv o :
isOrd o ->
∀ a, a ∈ Arg ->
subset (TI (W_F A B) o) (instance a) == TIF Arg W_Fd o a.
induction 1 using isOrd_ind; intros.
rewrite TIF_eq; auto with *.
apply eq_set_ax; intros z.
rewrite subset_ax.
rewrite TI_eq; auto with *.
2:apply W_F_morph; trivial.
rewrite sup_ax.
rewrite sup_ax.
split; intros.
destruct H3 as ((o',?,?),(z',?,?)).
exists o'; trivial.
apply W_F_elim in H4; trivial.
destruct H4 as (?,(?,?)).
rewrite H8.
apply couple_intro_sigma.
do 2 red; intros.
apply subset_elim1 in H9.
apply cc_prod_ext; auto with *.
red; intros; apply TIF_morph; auto with *.
apply fm; trivial.
destruct H6 as (?,?,_).
rewrite <- H5 in H9.
apply subset_intro; trivial.
apply cc_prod_intro; intros.
do 2 red; intros; apply cc_app_morph; auto with *.
do 2 red; intros.
apply TIF_morph; auto with *.
apply fm; auto with *.
rewrite <- H1; auto.
apply subset_intro; auto.
rewrite <- H5 in H6.
destruct H6 as (_,_,?); auto.
destruct H3 as (o',?,?).
split.
exists o'; trivial.
revert H4; apply W_Fd_incl_W_F; trivial.
do 2 red; intros; apply TIF_morph; auto with *.
intros.
rewrite <- H1; auto.
red; intros.
apply subset_elim1 in H5; trivial.
exists z; auto with *.
assert (fst z ∈ A).
apply fst_typ_sigma in H4.
apply subset_elim1 in H4; trivial.
constructor; intros; trivial.
apply fst_typ_sigma in H4.
rewrite subset_ax in H4.
destruct H4 as (?,(x',?,?)).
rewrite H6; trivial.
apply snd_typ_sigma with (y:=fst z) in H4; auto with *.
apply cc_prod_elim with (2:=H6) in H4.
rewrite <- H1 in H4; auto.
rewrite subset_ax in H4; destruct H4 as (_,(w',?,?)).
rewrite H4; trivial.
do 2 red; intros.
apply subset_elim1 in H7.
apply cc_prod_ext; auto.
red; intros; apply TIF_morph; auto with *.
apply fm; auto.
do 2 red; intros.
apply W_Fd_morph; auto with *.
red; intros; apply TIF_morph; auto.
do 2 red; intros.
apply W_F_morph; auto with *.
apply TI_morph; auto.
Qed.
| I_node :
fst w ∈ A ->
g (fst w) a ->
(∀ i, i ∈ B (fst w) -> instance (f (fst w) i) (cc_app (snd w) i)) ->
instance a w.
Instance inst_m : Proper (eq_set ==> eq_set ==> iff) instance.
apply morph_impl_iff2; auto with *.
do 4 red; intros.
revert y H y0 H0.
induction H1; constructor; intros.
rewrite <- H4; trivial.
rewrite <- H3; rewrite <- H4; trivial.
apply H2 with i.
rewrite (Bext _ _ H (fst_morph _ _ H4)); trivial.
rewrite H4; reflexivity.
rewrite H4; reflexivity.
Qed.
Lemma inst_inv o :
isOrd o ->
∀ a, a ∈ Arg ->
subset (TI (W_F A B) o) (instance a) == TIF Arg W_Fd o a.
induction 1 using isOrd_ind; intros.
rewrite TIF_eq; auto with *.
apply eq_set_ax; intros z.
rewrite subset_ax.
rewrite TI_eq; auto with *.
2:apply W_F_morph; trivial.
rewrite sup_ax.
rewrite sup_ax.
split; intros.
destruct H3 as ((o',?,?),(z',?,?)).
exists o'; trivial.
apply W_F_elim in H4; trivial.
destruct H4 as (?,(?,?)).
rewrite H8.
apply couple_intro_sigma.
do 2 red; intros.
apply subset_elim1 in H9.
apply cc_prod_ext; auto with *.
red; intros; apply TIF_morph; auto with *.
apply fm; trivial.
destruct H6 as (?,?,_).
rewrite <- H5 in H9.
apply subset_intro; trivial.
apply cc_prod_intro; intros.
do 2 red; intros; apply cc_app_morph; auto with *.
do 2 red; intros.
apply TIF_morph; auto with *.
apply fm; auto with *.
rewrite <- H1; auto.
apply subset_intro; auto.
rewrite <- H5 in H6.
destruct H6 as (_,_,?); auto.
destruct H3 as (o',?,?).
split.
exists o'; trivial.
revert H4; apply W_Fd_incl_W_F; trivial.
do 2 red; intros; apply TIF_morph; auto with *.
intros.
rewrite <- H1; auto.
red; intros.
apply subset_elim1 in H5; trivial.
exists z; auto with *.
assert (fst z ∈ A).
apply fst_typ_sigma in H4.
apply subset_elim1 in H4; trivial.
constructor; intros; trivial.
apply fst_typ_sigma in H4.
rewrite subset_ax in H4.
destruct H4 as (?,(x',?,?)).
rewrite H6; trivial.
apply snd_typ_sigma with (y:=fst z) in H4; auto with *.
apply cc_prod_elim with (2:=H6) in H4.
rewrite <- H1 in H4; auto.
rewrite subset_ax in H4; destruct H4 as (_,(w',?,?)).
rewrite H4; trivial.
do 2 red; intros.
apply subset_elim1 in H7.
apply cc_prod_ext; auto.
red; intros; apply TIF_morph; auto with *.
apply fm; auto.
do 2 red; intros.
apply W_Fd_morph; auto with *.
red; intros; apply TIF_morph; auto.
do 2 red; intros.
apply W_F_morph; auto with *.
apply TI_morph; auto.
Qed.
Fixpoint of the W_Fd operator
Definition Wd := TIF Arg W_Fd (W_ord A B).
Lemma Wd_eqn : ∀ a, a ∈ Arg -> Wd a == W_Fd Wd a.
intros.
apply incl_eq.
unfold Wd; rewrite <- TIF_mono_succ; auto with *.
apply TIF_incl; auto with *.
apply isOrd_succ.
apply W_o_o; trivial.
apply lt_osucc; apply W_o_o; trivial.
apply W_o_o; trivial.
red; intros.
unfold Wd; rewrite <- inst_inv; trivial.
2:apply W_o_o; trivial.
apply subset_intro.
change (z ∈ W A B).
rewrite W_eqn; trivial.
revert H0; apply W_Fd_incl_W_F; intros; auto.
do 2 red; intros.
apply TIF_morph; auto with *.
red; intros.
unfold Wd in H1.
rewrite <- inst_inv in H1; auto.
2:apply W_o_o; trivial.
apply subset_elim1 in H1; trivial.
unfold Wd in H0; rewrite <- TIF_mono_succ in H0; auto.
rewrite <- inst_inv in H0; auto.
2:apply isOrd_succ; apply W_o_o; trivial.
rewrite subset_ax in H0; destruct H0 as (_,(?,?,?)).
rewrite H0; trivial.
apply W_Fd_morph.
apply W_o_o; trivial.
Qed.
End DependentW.
Lemma Wd_eqn : ∀ a, a ∈ Arg -> Wd a == W_Fd Wd a.
intros.
apply incl_eq.
unfold Wd; rewrite <- TIF_mono_succ; auto with *.
apply TIF_incl; auto with *.
apply isOrd_succ.
apply W_o_o; trivial.
apply lt_osucc; apply W_o_o; trivial.
apply W_o_o; trivial.
red; intros.
unfold Wd; rewrite <- inst_inv; trivial.
2:apply W_o_o; trivial.
apply subset_intro.
change (z ∈ W A B).
rewrite W_eqn; trivial.
revert H0; apply W_Fd_incl_W_F; intros; auto.
do 2 red; intros.
apply TIF_morph; auto with *.
red; intros.
unfold Wd in H1.
rewrite <- inst_inv in H1; auto.
2:apply W_o_o; trivial.
apply subset_elim1 in H1; trivial.
unfold Wd in H0; rewrite <- TIF_mono_succ in H0; auto.
rewrite <- inst_inv in H0; auto.
2:apply isOrd_succ; apply W_o_o; trivial.
rewrite subset_ax in H0; destruct H0 as (_,(?,?,?)).
rewrite H0; trivial.
apply W_Fd_morph.
apply W_o_o; trivial.
Qed.
End DependentW.