~/bend-docscommunity

spec/containers/simple_queue.bend source

spec/containers/simple_queue.bend on the hub · documented module

import Baseimport ./queue.bend as QS# ---- contract (SPARK formal containers) ----# Each `<Subprogram>.<clause>` definition below states one Post clause of# that SPARK subprogram, as a proposition on this model; the table names the# clauses. proofs/containers/simple_queue/ proves every clause under its clause name,# and its `impl` lemma carries them to the implementation.## The simple queue is the FIFO queue behind another interface; every one of# its operations is the queue's (for every element type), so it has the# queue's SPARK formal-vector contracts, spec/containers/queue.bend (restated below):##   SPARK subprogram      simple_queue   queue     contract lemmas (QC.)#   Empty_Vector          new            new       new_empty, new_impl#   Length                qsize          length    length_result, length_frame#   Append                put            enqueue   enqueue_length, enqueue_prefix, enqueue_element#   Delete_First          get            dequeue   dequeue_length, dequeue_shifted,#                                                  dequeue_result, dequeue_empty#   First_Element         peek           peek      peek_first, peek_frame, peek_empty#   iteration             to_list        to_list   to_list_model, to_list_frame#   implementation                                 QC.impl# The model is the queue's (QS.step) and so is every clause:def Length.length_result(-T: Data, +xs: List<&2, T>) -> Type:  QS.Length.length_result(T, xs)def Length.length_frame(-T: Data, +xs: List<&2, T>) -> Type:  QS.Length.length_frame(T, xs)def Iteration.to_list_model(-T: Data, +xs: List<&2, T>) -> Type:  QS.Iteration.to_list_model(T, xs)def Iteration.to_list_frame(-T: Data, +xs: List<&2, T>) -> Type:  QS.Iteration.to_list_frame(T, xs)def Append.enqueue_length(-T: Data, +xs: List<&2, T>, +v: T) -> Type:  QS.Append.enqueue_length(T, xs, v)def Append.enqueue_prefix(-T: Data, +xs: List<&2, T>, +v: T) -> Type:  QS.Append.enqueue_prefix(T, xs, v)def Append.enqueue_element(-T: Data, +xs: List<&2, T>, +v: T) -> Type:  QS.Append.enqueue_element(T, xs, v)def Delete_First.dequeue_length(-T: Data, +h: T, +t: List<&2, T>) -> Type:  QS.Delete_First.dequeue_length(T, h, t)def Delete_First.dequeue_shifted(-T: Data, +h: T, +t: List<&2, T>) -> Type:  QS.Delete_First.dequeue_shifted(T, h, t)def Delete_First.dequeue_result(-T: Data, +h: T, +t: List<&2, T>) -> Type:  QS.Delete_First.dequeue_result(T, h, t)def Delete_First.dequeue_empty(-T: Data) -> Type:  QS.Delete_First.dequeue_empty(T)def First_Element.peek_first(-T: Data, +h: T, +t: List<&2, T>) -> Type:  QS.First_Element.peek_first(T, h, t)def First_Element.peek_frame(-T: Data, +xs: List<&2, T>) -> Type:  QS.First_Element.peek_frame(T, xs)def First_Element.peek_empty(-T: Data) -> Type:  QS.First_Element.peek_empty(T)