Skip to content

Commit b682e63

Browse files
namasikanamstrub
authored andcommitted
stdlib: new lemmas (lists, bytes, distr)
BitChunking: new lemmas: chunk_nil, chunk_exact List: new lemmas: mkseq2 DList: new lemmas: dmap_dlist_partial_perm
1 parent 7367ad0 commit b682e63

3 files changed

Lines changed: 54 additions & 0 deletions

File tree

theories/datatypes/BitEncoding.ec

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,16 @@ end BitReverse.
666666
theory BitChunking.
667667
op chunk r (bs : 'a list) =
668668
mkseq (fun i => take r (drop (r * i)%Int bs)) (size bs %/ r).
669+
670+
lemma chunk_nil ['a] (n : int) : chunk<:'a> n [] = [].
671+
proof. by rewrite /chunk /= mkseq0. qed.
672+
673+
lemma chunk_exact ['a] (xs : 'a list) : xs <> [] => chunk (size xs) xs = [xs].
674+
proof.
675+
rewrite /chunk divzz; case: (xs = []) => //.
676+
rewrite size_eq0 => -> _; rewrite b2i1 /= mkseq1; congr=> /=.
677+
by rewrite drop0 take_oversize.
678+
qed.
669679
670680
lemma chunk_le0 r (s : 'a list) : r <= 0 => chunk r s = [].
671681
proof.

theories/datatypes/List.ec

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2701,6 +2701,9 @@ move=> ge0_n ge0_m; rewrite /mkseq iota_add ?map_cat //=.
27012701
by rewrite -{2}(addz0 n) iota_addl -map_comp.
27022702
qed.
27032703

2704+
lemma mkseq2 ['a] (f : int -> 'a) : mkseq f 2 = [f 0; f 1].
2705+
proof. by rewrite (mkseq_add _ 1 1) // !mkseq1. qed.
2706+
27042707
lemma mkseqP f n (x:'a) :
27052708
mem (mkseq f n) x <=> exists i, 0 <= i < n /\ x = f i.
27062709
proof. by rewrite mapP &(exists_iff) /= => i; rewrite mem_iota. qed.

theories/distributions/DList.ec

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,47 @@ rewrite fcards0 RField.expr0 RField.mulr1 => <-.
289289
apply: mu_eq_support => xs; rewrite supp_dlist //= => -[? ?]; smt(in_fset0).
290290
qed.
291291
292+
lemma dmap_dlist_partial_perm ['a] (x0 : 'a) (d : 'a distr) (f : int -> int) (n k : int) :
293+
0 <= k
294+
=> 0 <= n
295+
=> is_lossless d
296+
=> (forall i j, 0 <= i < k => 0 <= j < k => f i = f j => i = j)
297+
=> (forall i, 0 <= i < k => 0 <= f i < n)
298+
=> dmap (dlist d n) (fun xs => mkseq (fun i => nth x0 xs (f i)) k)
299+
= dlist d k.
300+
proof.
301+
move=> ge0_k ge0_n lld injf inrgf.
302+
elim: k ge0_k n ge0_n f injf inrgf.
303+
- move=> n ge0_n f injf inrgf; rewrite [dlist d 0]dlist0 //.
304+
rewrite -(eq_dmap _ (fun _ => [])) //=.
305+
- by move=> ? /=; rewrite mkseq0.
306+
by rewrite dmap_cst //; apply/dlist_ll/lld.
307+
move=> k ge0_k ih n ge0_n f injf inrgf.
308+
pose k1 := f k; pose k2 := n - (k1 + 1).
309+
have ->: n = (k1 + 1) + k2 by rewrite /k1 /k2 #ring.
310+
rewrite dlist_djoin 1:/# -cat_nseq ~-1:/# nseqSr 1:/#.
311+
rewrite -cats1 -catA /= djoin_perm_s1s /= dmap_dlet /=.
312+
rewrite -!dlist_djoin ~-1:/# /=.
313+
pose c (i : int) := f i - b2i (k1 <= f i).
314+
pose h (a : 'a list) := mkseq (fun i => nth x0 a (c i)) k.
315+
pose C (a : 'a list * 'a list) := a.`1 ++ a.`2.
316+
pose F (a : 'a list) (x : 'a) := rcons (h a) x.
317+
rewrite -(in_eq_dlet (fun (ds : 'a list * 'a list) => dmap d (F (C ds)))).
318+
- move=> ds /supp_dprod => /= []; rewrite !supp_dlist ~-1:/#.
319+
move=> [#] hsz1 _ hsz2 _; rewrite dmap_comp &(eq_dmap) /=.
320+
move=> x @/(\o) /=; rewrite mkseqS 1:/# /F /=; congr; last first.
321+
- by rewrite nth_cat ifF 1:/# /= ifT 1:/#.
322+
apply: eq_in_mkseq => i rgi /=; rewrite !nth_cat.
323+
rewrite /c hsz1 lezNgt; case: (f i < k1) => /= [->//|?].
324+
by rewrite !ifF ~-1:/# addrAC.
325+
rewrite -(dlet_dmap _ C (fun ds => dmap d (F ds))) -dlist_add ~-1:/#.
326+
rewrite -(dmap_dprodE _ _ (fun (xy : _ * _) => F xy.`1 xy.`2)) /F /=.
327+
rewrite dlistSr ~-1:/# /= !dmap_dprodE_swap /= &(in_eq_dlet) /=.
328+
move=> x _; rewrite -(dmap_comp h (fun xs => rcons xs x)); congr.
329+
apply: ih => @/k2; 2,3: by smt().
330+
have ->: k1 + (n - (k1 + 1)) = n - 1 by ring.
331+
by have := inrgf 0 _; smt().
332+
qed.
292333
293334
abstract theory Program.
294335
type t.

0 commit comments

Comments
 (0)