Module fc_weak (wf : fc_wf_sig) <: fc_weak_sig.
Set Bullet Behavior "Strict Subproofs".
Set Implicit Arguments.
(* Weakening *)
(* ------------------------------------------------------------------- *)
Definition AnnIso_respects_atoms_eq   := third  ann_respects_atoms_eq_mutual.
Definition AnnDefEq_respects_atoms_eq := fourth ann_respects_atoms_eq_mutual.
Instance AnnIso_atoms_eq_mor : Morphisms.Proper
(eq ==> AtomSetImpl.Equal ==> eq ==> eq ==> eq ==> iff)
AnnIso.
Instance AnnDefEq_atoms_eq_mor : Morphisms.Proper
(eq ==> AtomSetImpl.Equal ==> eq ==> eq ==> eq ==> iff)
AnnDefEq.
Instance AnnIso_atoms_sub_mor : Morphisms.Proper
(eq ==> AtomSetImpl.Subset ==> eq ==> eq ==> eq ==> impl)
AnnIso.
Instance AnnDefEq_atoms_sub_mor : Morphisms.Proper
(eq ==> AtomSetImpl.Subset ==> eq ==> eq ==> eq ==> impl)
AnnDefEq.
(* FIXME: temporary hack *)
Ltac ann_weak_speedup :=
first [eapply An_AppCong | eapply An_PiSnd].
(* ------------------------------------------------------------------- *)

Lemma ann_typing_weakening_mutual:
(forall G0 a A,       AnnTyping  G0 a A       ->
forall E F G, (G0 = F ++ G) -> AnnCtx (F ++ E ++ G) -> AnnTyping (F ++ E ++ G) a A) /\
(forall G0 phi,       AnnPropWff G0 phi       ->
forall E F G, (G0 = F ++ G) ->
AnnCtx (F ++ E ++ G) -> AnnPropWff (F ++ E ++ G) phi) /\
(forall G0 D g p1 p2, AnnIso     G0 D g p1 p2 ->
forall E F G, (G0 = F ++ G) ->
AnnCtx (F ++ E ++ G) -> AnnIso (F ++ E ++ G) D g p1 p2) /\
(forall G0 D g A B,   AnnDefEq   G0 D g A B   ->
forall E F G, (G0 = F ++ G) ->
AnnCtx (F ++ E ++ G) -> AnnDefEq (F ++ E ++ G) D g A B) /\
(forall G0,           AnnCtx     G0           ->
forall E F G, (G0 = F ++ G) ->
AnnCtx (F ++ E ++ G) -> AnnCtx (F ++ E ++ G)).