Skip to content

Commit e57a806

Browse files
AyumuSaitoaffeldt-aist
authored andcommitted
add binary operations
1 parent ea7f106 commit e57a806

File tree

4 files changed

+187
-18
lines changed

4 files changed

+187
-18
lines changed

theories/lang_syntax.v

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,10 +361,52 @@ Context {R : realType}.
361361

362362
Inductive 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+
364405
Inductive 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}.
396438
Arguments exp_unit {R g}.
397439
Arguments exp_bool {R g}.
398440
Arguments exp_real {R g}.
441+
Arguments exp_bin {R g} &.
399442
Arguments exp_pair {R g} & {t1 t2}.
400443
Arguments exp_var {R g} _ {t} H.
401444
Arguments exp_bernoulli {R g}.
@@ -416,6 +459,16 @@ Notation "b ':B'" := (@exp_bool _ _ b%bool)
416459
(in custom expr at level 1) : lang_scope.
417460
Notation "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.
419472
Notation "'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.
10221094
Lemma execD_real g r : @execD g _ [r:R] = existT _ (cst r) (kr r).
10231095
Proof. 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+
10251106
Lemma 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

theories/lang_syntax_examples.v

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,78 @@ rewrite exec_sample_pair0; do 3 rewrite mem_set//; rewrite memNset//=.
254254
by rewrite !mule1; congr (_%:E); field.
255255
Qed.
256256

257+
Definition sample_and_syntax0 : @exp R _ [::] _ :=
258+
[let "x" := Sample {exp_bernoulli (1 / 2)%:nng (p1S 1)} in
259+
let "y" := Sample {exp_bernoulli (1 / 3%:R)%:nng (p1S 2)} in
260+
return #{"x"} && #{"y"}].
261+
262+
Lemma exec_sample_and0 (A : set bool) :
263+
@execP R [::] _ sample_and_syntax0 tt A =
264+
((1 / 6)%:E * (true \in A)%:R%:E +
265+
(1 - 1 / 6)%:E * (false \in A)%:R%:E)%E.
266+
Proof.
267+
rewrite !execP_letin !execP_sample !execD_bernoulli execP_return /=.
268+
rewrite (@execD_bin _ _ binop_and) !exp_var'E (execD_var_erefl "x") (execD_var_erefl "y") /=.
269+
rewrite letin'E integral_measure_add//= !ge0_integral_mscale//= /onem.
270+
rewrite !integral_dirac//= !indicE !in_setT/= !mul1e.
271+
rewrite !letin'E !integral_measure_add//= !ge0_integral_mscale//= /onem.
272+
rewrite !integral_dirac//= !indicE !in_setT/= !mul1e !diracE.
273+
rewrite muleDr// -addeA; congr (_ + _)%E.
274+
by rewrite !muleA; congr (_%:E); congr (_ * _); field.
275+
rewrite -muleDl// !muleA -muleDl//.
276+
by congr (_%:E); congr (_ * _); field.
277+
Qed.
278+
279+
Definition sample_bernoulli_and3 : @exp R _ [::] _ :=
280+
[let "x" := Sample {exp_bernoulli (1 / 2)%:nng (p1S 1)} in
281+
let "y" := Sample {exp_bernoulli (1 / 2)%:nng (p1S 1)} in
282+
let "z" := Sample {exp_bernoulli (1 / 2)%:nng (p1S 1)} in
283+
return #{"x"} && #{"y"} && #{"z"}].
284+
285+
Lemma exec_sample_bernoulli_and3 t U :
286+
execP sample_bernoulli_and3 t U =
287+
((1 / 8)%:E * (true \in U)%:R%:E +
288+
(1 - 1 / 8)%:E * (false \in U)%:R%:E)%E.
289+
Proof.
290+
rewrite !execP_letin !execP_sample !execD_bernoulli execP_return /=.
291+
rewrite !(@execD_bin _ _ binop_and) !exp_var'E.
292+
rewrite (execD_var_erefl "x") (execD_var_erefl "y") (execD_var_erefl "z") /=.
293+
rewrite letin'E integral_measure_add//= !ge0_integral_mscale//= /onem.
294+
rewrite !integral_dirac//= !indicE !in_setT/= !mul1e.
295+
rewrite !letin'E !integral_measure_add//= !ge0_integral_mscale//= /onem.
296+
rewrite !integral_dirac//= !indicE !in_setT/= !mul1e.
297+
rewrite !letin'E !integral_measure_add//= !ge0_integral_mscale//= /onem.
298+
rewrite !integral_dirac//= !indicE !in_setT/= !mul1e !diracE.
299+
rewrite !muleDr// -!addeA.
300+
by congr (_ + _)%E; rewrite ?addeA !muleA -?muleDl//;
301+
congr (_ * _)%E; congr (_%:E); field.
302+
Qed.
303+
304+
Definition sample_add_syntax0 : @exp R _ [::] _ :=
305+
[let "x" := Sample {exp_bernoulli (1 / 2)%:nng (p1S 1)} in
306+
let "y" := Sample {exp_bernoulli (1 / 2)%:nng (p1S 1)} in
307+
let "z" := Sample {exp_bernoulli (1 / 2)%:nng (p1S 1)} in
308+
return #{"x"} && #{"y"} && #{"z"}].
309+
310+
Lemma exec_sample_bernoulli_and3 t U :
311+
execP sample_bernoulli_and3 t U =
312+
((1 / 8)%:E * (true \in U)%:R%:E +
313+
(1 - 1 / 8)%:E * (false \in U)%:R%:E)%E.
314+
Proof.
315+
rewrite !execP_letin !execP_sample !execD_bernoulli execP_return /=.
316+
rewrite !(@execD_bin _ _ binop_and) !exp_var'E.
317+
rewrite (execD_var_erefl "x") (execD_var_erefl "y") (execD_var_erefl "z") /=.
318+
rewrite letin'E integral_measure_add//= !ge0_integral_mscale//= /onem.
319+
rewrite !integral_dirac//= !indicE !in_setT/= !mul1e.
320+
rewrite !letin'E !integral_measure_add//= !ge0_integral_mscale//= /onem.
321+
rewrite !integral_dirac//= !indicE !in_setT/= !mul1e.
322+
rewrite !letin'E !integral_measure_add//= !ge0_integral_mscale//= /onem.
323+
rewrite !integral_dirac//= !indicE !in_setT/= !mul1e !diracE.
324+
rewrite !muleDr// -!addeA.
325+
by congr (_ + _)%E; rewrite ?addeA !muleA -?muleDl//;
326+
congr (_ * _)%E; congr (_%:E); field.
327+
Qed.
328+
257329
End sample_pair.
258330

259331
Section bernoulli_examples.

theories/measure.v

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,6 +1177,38 @@ have [-> _|-> _|-> _ |-> _] := subset_set2 YT.
11771177
- by rewrite -setT_bool preimage_setT setIT.
11781178
Qed.
11791179

1180+
Lemma measurable_and (f : T1 -> bool) (g : T1 -> bool) :
1181+
measurable_fun setT f -> measurable_fun setT g ->
1182+
measurable_fun setT (fun x => f x && g x).
1183+
Proof.
1184+
move=> mf mg.
1185+
apply: (@measurable_fun_bool _ _ true).
1186+
rewrite [X in measurable X](_ : _ = f @^-1` [set true] `&` g @^-1` [set true]).
1187+
apply: measurableI.
1188+
rewrite -[X in measurable X]setTI.
1189+
exact: mf.
1190+
rewrite -[X in measurable X]setTI.
1191+
exact: mg.
1192+
apply/seteqP.
1193+
by split; move=> x/andP.
1194+
Qed.
1195+
1196+
Lemma measurable_or (f : T1 -> bool) (g : T1 -> bool) :
1197+
measurable_fun setT f -> measurable_fun setT g ->
1198+
measurable_fun setT (fun x => f x || g x).
1199+
Proof.
1200+
move=> mf mg.
1201+
apply: (@measurable_fun_bool _ _ true).
1202+
rewrite [X in measurable X](_ : _ = f @^-1` [set true] `|` g @^-1` [set true]).
1203+
apply: measurableU.
1204+
rewrite -[X in measurable X]setTI.
1205+
exact: mf.
1206+
rewrite -[X in measurable X]setTI.
1207+
exact: mg.
1208+
apply/seteqP.
1209+
split; move=> x => /orP//.
1210+
Qed.
1211+
11801212
End measurable_fun.
11811213
#[global] Hint Extern 0 (measurable_fun _ (fun=> _)) =>
11821214
solve [apply: measurable_cst] : core.

theories/prob_lang.v

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,32 +1192,16 @@ Section bernoulli_and.
11921192
Context d (T : measurableType d) (R : realType).
11931193
Import Notations.
11941194

1195-
Definition mand (x y : T * mbool * mbool -> mbool)
1196-
(t : T * mbool * mbool) : mbool := x t && y t.
1197-
1198-
Lemma measurable_fun_mand (x y : T * mbool * mbool -> mbool) :
1199-
measurable_fun setT x -> measurable_fun setT y ->
1200-
measurable_fun setT (mand x y).
1201-
Proof.
1202-
move=> /= mx my; apply: (measurable_fun_bool true).
1203-
rewrite [X in measurable X](_ : _ =
1204-
(x @^-1` [set true]) `&` (y @^-1` [set true])); last first.
1205-
by rewrite /mand; apply/seteqP; split => z/= /andP.
1206-
apply: measurableI.
1207-
- by rewrite -[X in measurable X]setTI; exact: mx.
1208-
- by rewrite -[X in measurable X]setTI; exact: my.
1209-
Qed.
1210-
12111195
Definition bernoulli_and : R.-sfker T ~> mbool :=
12121196
(letin (sample_cst [the probability _ _ of bernoulli p12])
12131197
(letin (sample_cst [the probability _ _ of bernoulli p12])
1214-
(ret (measurable_fun_mand macc1of3 macc2of3)))).
1198+
(ret (measurable_and macc1of3 macc2of3)))).
12151199

12161200
Lemma bernoulli_andE t U :
12171201
bernoulli_and t U =
12181202
sample_cst (bernoulli p14) t U.
12191203
Proof.
1220-
rewrite /bernoulli_and 3!letin_sample_bernoulli/= /mand/= muleDr//= -muleDl//.
1204+
rewrite /bernoulli_and 3!letin_sample_bernoulli/= muleDr//= -muleDl//.
12211205
rewrite !muleA -addeA -muleDl// -!EFinM !onem1S/= -splitr mulr1.
12221206
have -> : (1 / 2 * (1 / 2) = 1 / 4%:R :> R)%R by rewrite mulf_div mulr1// -natrM.
12231207
rewrite /bernoulli/= measure_addE/= /mscale/= -!EFinM; congr( _ + (_ * _)%:E).

0 commit comments

Comments
 (0)