val view_indexing (#b: _) (vb:buffer b) (i:nat{i < length vb})
  : Lemma (let open FStar.Mul in
           let n = View?.n (get_view vb) in
           n <= length vb * n - i * n)
let view_indexing #b vb i
  = let n = View?.n (get_view vb) in
    length_eq vb;
    FStar.Math.Lemmas.distributivity_add_left (length vb) (-i) n;
    let open FStar.Mul in
    assert ((length vb + (-i)) * n = length vb * n + (-i) * n);
    assert (length vb > i);
    assert (length vb + (-i) > 0);
    assert (n <= (length vb + (-i)) * n)
val view_indexing (#b: _) (vb:buffer b) (i:nat{i < length vb})
  : Lemma (let open FStar.Mul in
           let n = View?.n (get_view vb) in
           n <= length vb * n - i * n)
let view_indexing #b vb i =
let n = View?.n (get_view vb) in
length_eq vb;
FStar.Math.Lemmas.distributivity_add_left (length vb) (- i) n;
let open FStar.Mul in
assert ((length vb + (- i)) * n = length vb * n + (- i) * n);
assert (length vb > i);
assert (length vb + (- i) > 0);
assert (n <= (length vb + (- i)) * n)
LowStar.BufferView.fst.checked
prims.fst.checked FStar.Seq.fst.checked FStar.Pervasives.Native.fst.checked FStar.Pervasives.fsti.checked FStar.Mul.fst.checked FStar.Math.Lemmas.fst.checked
LowStar.BufferView.fst
LowStar.BufferView.buffer Prims.nat Prims.b2t Prims.op_LessThan LowStar.BufferView.length Prims._assert Prims.op_LessThanOrEqual FStar.Mul.op_Star Prims.op_Addition Prims.op_Minus Prims.unit Prims.op_GreaterThan Prims.op_Equality Prims.int FStar.Math.Lemmas.distributivity_add_left LowStar.BufferView.length_eq Prims.pos LowStar.BufferView.__proj__View__item__n FStar.Pervasives.__proj__Mkdtuple4__item___1 LowStar.Monotonic.Buffer.srel LowStar.BufferView.buffer_view LowStar.BufferView.get_view
(*
   Copyright 2008-2018 Microsoft Research

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*)
module LowStar.BufferView

noeq
type buffer_view (a:Type0) (rrel rel:B.srel a) (b:Type u#b) : Type u#b =
  | BufferView: buf:B.mbuffer a rrel rel
              -> v:view a b{B.length buf % View?.n v == 0}
              -> buffer_view a rrel rel b

let mk_buffer_view #src #rrel #rel #dest b v  = (| src, rrel, rel, BufferView b v |)

let as_buffer #b v = BufferView?.buf (Mkdtuple4?._4 v)

let as_buffer_mk_buffer_view #_ #_ #_ #_ _ _ = ()

let get_view #b v = BufferView?.v (Mkdtuple4?._4 v)

let get_view_mk_buffer_view #_ #_ #_ #_ _ _ = ()

let length #b vb = B.length (as_buffer vb) / View?.n (get_view vb)

let length_eq #_ _ = ()

#reset-options "--max_fuel 0 --max_ifuel 1"
val view_indexing (#b: _) (vb:buffer b) (i:nat{i < length vb})
  : Lemma (let open FStar.Mul in
           let n = View?.n (get_view vb) in
           n <= length vb * n - i * n)
vb: LowStar.BufferView.buffer b -> i: Prims.nat{i < LowStar.BufferView.length vb}
  -> FStar.Pervasives.Lemma
    (ensures
      (let n = View?.n (LowStar.BufferView.get_view vb) in
        n <= LowStar.BufferView.length vb * n - i * n))