Filtering...

take-bytes

books/std/io/take-bytes

Included Books

other
(in-package "ACL2")
include-book
(include-book "read-file-bytes")
include-book
(include-book "nthcdr-bytes")
local
(local (include-book "base"))
local
(local (include-book "arithmetic/top" :dir :system))
local
(local (include-book "tools/mv-nth" :dir :system))
local
(local (include-book "std/lists/take" :dir :system))
other
(set-state-ok t)
other
(defsection take-bytes
  :parents (std/io)
  :short "Read the first @('n') bytes from an open file."
  :long "<p>@(call take-bytes) is like @(see take) for an @(':byte') input
channel.  That is, it just reads @('n') bytes and returns them as a list,
and also returns the updated state.</p>"
  (defund take-bytes
    (n channel state)
    (declare (xargs :guard (and (natp n)
          (state-p state)
          (symbolp channel)
          (open-input-channel-p channel :byte state))))
    (b* (((when (zp n)) (mv nil state)) ((mv a state) (read-byte$ channel state))
        ((mv x state) (take-bytes (1- n) channel state)))
      (mv (cons a x) state)))
  (local (in-theory (enable take-bytes nthcdr-bytes)))
  (defthm state-p1-of-take-bytes
    (implies (and (force (state-p1 state))
        (force (symbolp channel))
        (force (open-input-channel-p1 channel :byte state)))
      (state-p1 (mv-nth 1 (take-bytes n channel state)))))
  (defthm open-input-channel-p1-of-take-bytes
    (implies (and (force (state-p1 state))
        (force (symbolp channel))
        (force (open-input-channel-p1 channel :byte state)))
      (open-input-channel-p1 channel
        :byte (mv-nth 1 (take-bytes n channel state)))))
  (defthm mv-nth0-of-take-bytes
    (implies (and (force (state-p1 state))
        (force (symbolp channel))
        (force (open-input-channel-p1 channel :byte state)))
      (equal (mv-nth 0 (take-bytes n channel state))
        (take n (mv-nth 0 (read-byte$-all channel state)))))
    :hints (("Goal" :in-theory (enable take read-byte$-all repeat)
       :induct (take-bytes n channel state))))
  (defthm mv-nth1-of-take-bytes$
    (implies (and (force (state-p1 state))
        (force (symbolp channel))
        (force (open-input-channel-p1 channel :byte state)))
      (equal (mv-nth 1 (take-bytes n channel state))
        (nthcdr-bytes n channel state)))))