diff --git a/lib/ModuRes/RAConstr.v b/lib/ModuRes/RAConstr.v index 244730df8c00f3672ba1955a7e2d26cb55bff55d..445b444207672209bcb4c68871f55ad5c2691cb2 100644 --- a/lib/ModuRes/RAConstr.v +++ b/lib/ModuRes/RAConstr.v @@ -1,5 +1,6 @@ Require Import Ssreflect.ssreflect Omega. Require Import CSetoid Predom RA DecEnsemble ModuRes.Relations. +Require Import Coq.Logic.Eqdep_dec. Local Open Scope ra_scope. Local Open Scope predom_scope. @@ -746,7 +747,7 @@ End STS. Section IndexedProduct. (* I is the index type (domain), S the type of the components (codomain) *) - Context {I : Type} {S : forall (i : I), Type} + Context {I : Type} {eq_dec : DecEq I} {S : forall (i : I), Type} {tyS : forall i, Setoid (S i)} {uS : forall i, RA_unit (S i)} {opS : forall i, RA_op (S i)} @@ -781,6 +782,41 @@ Section IndexedProduct. - compute; intros; split; intros; by move/(_ i): H0; rewrite (H i). - eapply (ra_op_valid (RA := raS i)); now eauto. Qed. + + Definition ra_infprod_upd (f : ra_res_infprod) (i : I) (si : S i) : ra_res_infprod := + fun i' => if eq_dec i i' is left Heq then eq_rect _ _ si _ Heq else f i'. + + Lemma ra_infprod_upd_eq f i si : ra_infprod_upd f i si i = si. + Proof. + rewrite/ra_infprod_upd. case: (eq_dec i i); last done. + move=> Heq. symmetry. apply: eq_rect_eq_dec. exact: eq_dec. + Qed. + + Lemma ra_infprod_upd_neq {i i'} (Hneq : i <> i') f si : ra_infprod_upd f i si i' = f i'. + Proof. rewrite/ra_infprod_upd. by case: (eq_dec i i'). Qed. + + Lemma ra_infprod_upd_valid {f i si g} (Hv : ↓f · g) (Hvi : ↓si · g i) : ↓ra_infprod_upd f i si · g. + Proof. + move=> i'; rewrite/ra_op/ra_op_infprod; case: (eq_dec i i') => [Heq | Hneq]. + - rewrite -Heq ra_infprod_upd_eq. exact: Hvi. + - rewrite (ra_infprod_upd_neq Hneq). exact: Hv. + Qed. + + Lemma ra_fpu_infprod {f i P} (Hi : f i â‡âˆˆ P) : + f â‡âˆˆ (fun f' => exists si, P si /\ f' = ra_infprod_upd f i si). + Proof. + move=> g Hv; move/(_ (g i) (Hv i)): Hi => [si [Pi Hvi]]. + exists (ra_infprod_upd f i si). split; first by exists si. exact: ra_infprod_upd_valid. + Qed. + + Lemma ra_fps_infprod {f i si} (Hi : f i ⇠si) : f ⇠ra_infprod_upd f i si. + Proof. + move=> g Hv i'; move/(_ i'): Hv. rewrite/ra_op/ra_op_infprod/=. + case: (eq_dec i i') => [Heq | Hneq]. + - rewrite -Heq ra_infprod_upd_eq. exact: Hi. + - by rewrite (ra_infprod_upd_neq Hneq). + Qed. + End IndexedProduct. Arguments ra_res_infprod : default implicits.