@@ -361,10 +361,52 @@ Context {R : realType}.
361361
362362Inductive flag := D | P.
363363
364+ Section binop.
365+
366+ Inductive binop :=
367+ | binop_and | binop_or
368+ | binop_add | binop_minus | binop_mult.
369+
370+ Definition type_of_binop (b : binop) : typ :=
371+ match b with
372+ | binop_and => Bool
373+ | binop_or => Bool
374+ | binop_add => Real
375+ | binop_minus => Real
376+ | binop_mult => Real
377+ end .
378+
379+ (* Import Notations. *)
380+
381+ Definition fun_of_binop g (b : binop) : (mctx g -> mtyp (type_of_binop b)) ->
382+ (mctx g -> mtyp (type_of_binop b)) -> @mctx R g -> @mtyp R (type_of_binop b) :=
383+ match b with
384+ | binop_and => (fun f1 f2 x => f1 x && f2 x : mtyp Bool)
385+ | binop_or => (fun f1 f2 x => f1 x || f2 x : mtyp Bool)
386+ | binop_add => (fun f1 f2 => (f1 \+ f2)%R)
387+ | binop_minus => (fun f1 f2 => (f1 \- f2)%R)
388+ | binop_mult => (fun f1 f2 => (f1 \* f2)%R)
389+ end .
390+
391+ Definition mfun_of_binop g b
392+ (f1 : @mctx R g -> @mtyp R (type_of_binop b)) (mf1 : measurable_fun setT f1)
393+ (f2 : @mctx R g -> @mtyp R (type_of_binop b)) (mf2 : measurable_fun setT f2) :
394+ measurable_fun [set: @mctx R g] (fun_of_binop f1 f2).
395+ destruct b.
396+ exact: measurable_and mf1 mf2.
397+ exact: measurable_or mf1 mf2.
398+ exact: measurable_funD.
399+ exact: measurable_funB.
400+ exact: measurable_funM.
401+ Defined .
402+
403+ End binop.
404+
364405Inductive exp : flag -> ctx -> typ -> Type :=
365406| exp_unit g : exp D g Unit
366407| exp_bool g : bool -> exp D g Bool
367408| exp_real g : R -> exp D g Real
409+ | exp_bin g (b : binop) : exp D g (type_of_binop b) -> exp D g (type_of_binop b) -> exp D g (type_of_binop b)
368410| exp_pair g t1 t2 : exp D g t1 -> exp D g t2 -> exp D g (Pair t1 t2)
369411| exp_proj1 g t1 t2 : exp D g (Pair t1 t2) -> exp D g t1
370412| exp_proj2 g t1 t2 : exp D g (Pair t1 t2) -> exp D g t2
@@ -396,6 +438,7 @@ Arguments exp {R}.
396438Arguments exp_unit {R g}.
397439Arguments exp_bool {R g}.
398440Arguments exp_real {R g}.
441+ Arguments exp_bin {R g} &.
399442Arguments exp_pair {R g} & {t1 t2}.
400443Arguments exp_var {R g} _ {t} H.
401444Arguments exp_bernoulli {R g}.
@@ -416,6 +459,16 @@ Notation "b ':B'" := (@exp_bool _ _ b%bool)
416459 (in custom expr at level 1) : lang_scope.
417460Notation "r ':R'" := (@exp_real _ _ r%R)
418461 (in custom expr at level 1, format "r :R") : lang_scope.
462+ Notation "e1 && e2" := (exp_bin binop_and e1 e2)
463+ (in custom expr at level 1) : lang_scope.
464+ Notation "e1 || e2" := (exp_bin binop_or e1 e2)
465+ (in custom expr at level 1) : lang_scope.
466+ Notation "e1 + e2" := (exp_bin binop_add e1 e2)
467+ (in custom expr at level 1) : lang_scope.
468+ Notation "e1 - e2" := (exp_bin binop_minus e1 e2)
469+ (in custom expr at level 1) : lang_scope.
470+ Notation "e1 * e2" := (exp_bin binop_mult e1 e2)
471+ (in custom expr at level 1) : lang_scope.
419472Notation "'return ' e" := (@exp_return _ _ _ e)
420473 (in custom expr at level 2) : lang_scope.
421474(*Notation "% str" := (@exp_var _ _ str%string _ erefl)
@@ -457,6 +510,7 @@ Fixpoint free_vars k g t (e : @exp R k g t) : seq string :=
457510 | exp_unit _ => [::]
458511 | exp_bool _ _ => [::]
459512 | exp_real _ _ => [::]
513+ | exp_bin _ _ e1 e2 => free_vars e1 ++ free_vars e2
460514 | exp_pair _ _ _ e1 e2 => free_vars e1 ++ free_vars e2
461515 | exp_proj1 _ _ _ e => free_vars e
462516 | exp_proj2 _ _ _ e => free_vars e
@@ -574,6 +628,10 @@ Inductive evalD : forall g t, exp D g t ->
574628
575629| eval_real g r : ([r:R] : exp D g _) -D> cst r ; kr r
576630
631+ | eval_bin g bop (e1 : exp D g _) f1 mf1 e2 f2 mf2 :
632+ e1 -D> f1 ; mf1 -> e2 -D> f2 ; mf2 ->
633+ exp_bin bop e1 e2 -D> fun_of_binop f1 f2 ; mfun_of_binop mf1 mf2
634+
577635| eval_pair g t1 (e1 : exp D g t1) f1 mf1 t2 (e2 : exp D g t2) f2 mf2 :
578636 e1 -D> f1 ; mf1 -> e2 -D> f2 ; mf2 ->
579637 [(e1, e2)] -D> fun x => (f1 x, f2 x) ; measurable_fun_prod mf1 mf2
@@ -676,6 +734,12 @@ all: (rewrite {g t e u v mu mv hu}).
676734- move=> g r {}v {}mv.
677735 inversion 1; subst g0 r0.
678736 by inj_ex H3.
737+ - move=> g bop e1 f1 mf1 e2 f2 mf2 ev1 IH1 ev2 IH2 {}v {}mv.
738+ inversion 1; subst g0 bop0.
739+ inj_ex H10; subst v.
740+ inj_ex H5; subst e1.
741+ inj_ex H6; subst e5.
742+ by move: H4 H11 => /IH1 <- /IH2 <-.
679743- move=> g t1 e1 f1 mf1 t2 e2 f2 mf2 ev1 IH1 ev2 IH2 {}v {}mv.
680744 simple inversion 1 => //; subst g0.
681745 case: H3 => ? ?; subst t0 t3.
@@ -798,6 +862,12 @@ all: rewrite {g t e u v eu}.
798862- move=> g r {}v {}mv.
799863 inversion 1; subst g0 r0.
800864 by inj_ex H3.
865+ - move=> g bop e1 f1 mf1 e2 f2 mf2 ev1 IH1 ev2 IH2 {}v {}mv.
866+ inversion 1; subst g0 bop0.
867+ inj_ex H10; subst v.
868+ inj_ex H5; subst e1.
869+ inj_ex H6; subst e5.
870+ by move: H4 H11 => /IH1 <- /IH2 <-.
801871- move=> g t1 e1 f1 mf1 t2 e2 f2 mf2 ev1 IH1 ev2 IH2 {}v {}mv.
802872 simple inversion 1 => //; subst g0.
803873 case: H3 => ? ?; subst t0 t3.
@@ -914,6 +984,8 @@ all: rewrite {z g t}.
914984- by do 2 eexists; exact: eval_unit.
915985- by do 2 eexists; exact: eval_bool.
916986- by do 2 eexists; exact: eval_real.
987+ - move=> g b e1 [f1 [mf1 H1]] e2 [f2 [mf2 H2]].
988+ by exists (fun_of_binop f1 f2); eexists; exact: eval_bin.
917989- move=> g t1 t2 e1 [f1 [mf1 H1]] e2 [f2 [mf2 H2]].
918990 by exists (fun x => (f1 x, f2 x)); eexists; exact: eval_pair.
919991- move=> g t1 t2 e [f [mf H]].
@@ -1022,6 +1094,15 @@ Proof. exact/execD_evalD/eval_bool. Qed.
10221094Lemma execD_real g r : @execD g _ [r:R] = existT _ (cst r) (kr r).
10231095Proof . exact/execD_evalD/eval_real. Qed .
10241096
1097+ Lemma execD_bin g bop (e1 : exp D g _) (e2 : exp D g _) :
1098+ let f1 := projT1 (execD e1) in let f2 := projT1 (execD e2) in
1099+ let mf1 := projT2 (execD e1) in let mf2 := projT2 (execD e2) in
1100+ execD (exp_bin bop e1 e2) =
1101+ @existT _ _ (fun_of_binop f1 f2) (mfun_of_binop mf1 mf2).
1102+ Proof .
1103+ by move=> f1 f2 mf1 mf2; apply/execD_evalD/eval_bin; exact: evalD_execD.
1104+ Qed .
1105+
10251106Lemma execD_pair g t1 t2 (e1 : exp D g t1) (e2 : exp D g t2) :
10261107 let f1 := projT1 (execD e1) in let f2 := projT1 (execD e2) in
10271108 let mf1 := projT2 (execD e1) in let mf2 := projT2 (execD e2) in
0 commit comments