~/bend-docscommunity

LAWS.bend source

LAWS.bend on the hub · documented module

import Baseimport ./lib.bend as DQ# empty is D{Nil, Nil}.law empty_is_d_nil:  for -a: Quant  for -A: Kind(a)  { DQ.Deque.empty(a, A) == DQ.D{Nil{}, Nil{}} : DQ.Deque<a, A> }# Empty has no front element.law peek_front_empty:  for -a: Quant  for -A: Kind(a)  { DQ.Deque.peek_front(a, A, DQ.Deque.empty(a, A)) == None{} : Maybe<a, A> }# Empty has no back element.law peek_back_empty:  for -a: Quant  for -A: Kind(a)  { DQ.Deque.peek_back(a, A, DQ.Deque.empty(a, A)) == None{} : Maybe<a, A> }# Empty pops from either end to None.law pop_front_empty:  for -a: Quant  for -A: Kind(a)  { DQ.Deque.pop_front(a, A, DQ.Deque.empty(a, A)) == None{} : Maybe<a, DQ.Deque.Pop<a, A>> }law pop_back_empty:  for -a: Quant  for -A: Kind(a)  { DQ.Deque.pop_back(a, A, DQ.Deque.empty(a, A)) == None{} : Maybe<a, DQ.Deque.Pop<a, A>> }law to_list_empty:  for -a: Quant  for -A: Kind(a)  { DQ.Deque.to_list(a, A, DQ.Deque.empty(a, A)) == Nil{} : List<a, A> }law length_empty:  for -a: Quant  for -A: Kind(a)  { DQ.Deque.length(a, A, DQ.Deque.empty(a, A)) == 0n : Nat }law is_empty_empty:  for -a: Quant  for -A: Kind(a)  { DQ.Deque.is_empty(a, A, DQ.Deque.empty(a, A)) == True{} : Bool }# Definitional characterization of the two-list order.law to_list_d:  for -a: Quant  for -A: Kind(a)  for f: List<a, A>  for r: List<a, A>  { DQ.Deque.to_list(a, A, DQ.D{f, r}) == List.append(a, A, f, List.reverse(a, A, r)) : List<a, A> }law length_d:  for -a: Quant  for -A: Kind(a)  for f: List<a, A>  for r: List<a, A>  {    DQ.Deque.length(a, A, DQ.D{f, r})      == Nat.add(List.length(a, A, f), List.length(a, A, r))    : Nat  }law from_list_d:  for -a: Quant  for -A: Kind(a)  for xs: List<a, A>  { DQ.Deque.from_list(a, A, xs) == DQ.D{xs, Nil{}} : DQ.Deque<a, A> }law from_list_empty:  for -a: Quant  for -A: Kind(a)  { DQ.Deque.from_list(a, A, Nil{}) == DQ.Deque.empty(a, A) : DQ.Deque<a, A> }law from_list_singleton_roundtrip:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.to_list(a, A, DQ.Deque.from_list(a, A, x <> Nil{})) == x <> Nil{} : List<a, A> }law push_front_d:  for -a: Quant  for -A: Kind(a)  for f: List<a, A>  for r: List<a, A>  for x: A  { DQ.Deque.push_front(a, A, DQ.D{f, r}, x) == DQ.D{x <> f, r} : DQ.Deque<a, A> }law push_back_d:  for -a: Quant  for -A: Kind(a)  for f: List<a, A>  for r: List<a, A>  for x: A  { DQ.Deque.push_back(a, A, DQ.D{f, r}, x) == DQ.D{f, x <> r} : DQ.Deque<a, A> }# Pushing at either end produces the same singleton order.law push_front_singleton:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.to_list(a, A, DQ.Deque.push_front(a, A, DQ.Deque.empty(a, A), x)) == x <> Nil{} : List<a, A> }law push_back_singleton:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.to_list(a, A, DQ.Deque.push_back(a, A, DQ.Deque.empty(a, A), x)) == x <> Nil{} : List<a, A> }law length_push_front_empty:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.length(a, A, DQ.Deque.push_front(a, A, DQ.Deque.empty(a, A), x)) == 1n : Nat }law length_push_back_empty:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.length(a, A, DQ.Deque.push_back(a, A, DQ.Deque.empty(a, A), x)) == 1n : Nat }law is_empty_push_front:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.is_empty(a, A, DQ.Deque.push_front(a, A, DQ.Deque.empty(a, A), x)) == False{} : Bool }law is_empty_push_back:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.is_empty(a, A, DQ.Deque.push_back(a, A, DQ.Deque.empty(a, A), x)) == False{} : Bool }law peek_front_push_front:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.peek_front(a, A, DQ.Deque.push_front(a, A, DQ.Deque.empty(a, A), x)) == Some{x} : Maybe<a, A> }law peek_back_push_back:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.peek_back(a, A, DQ.Deque.push_back(a, A, DQ.Deque.empty(a, A), x)) == Some{x} : Maybe<a, A> }law peek_front_push_back:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.peek_front(a, A, DQ.Deque.push_back(a, A, DQ.Deque.empty(a, A), x)) == Some{x} : Maybe<a, A> }law peek_back_push_front:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.peek_back(a, A, DQ.Deque.push_front(a, A, DQ.Deque.empty(a, A), x)) == Some{x} : Maybe<a, A> }# Singleton pops recover the value and an empty deque.law pop_front_push_front_empty:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.pop_front(a, A, DQ.Deque.push_front(a, A, DQ.Deque.empty(a, A), x)) == Some{DQ.P{x, DQ.Deque.empty(a, A)}} : Maybe<a, DQ.Deque.Pop<a, A>> }law pop_front_push_back_empty:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.pop_front(a, A, DQ.Deque.push_back(a, A, DQ.Deque.empty(a, A), x)) == Some{DQ.P{x, DQ.Deque.empty(a, A)}} : Maybe<a, DQ.Deque.Pop<a, A>> }law pop_back_push_back_empty:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.pop_back(a, A, DQ.Deque.push_back(a, A, DQ.Deque.empty(a, A), x)) == Some{DQ.P{x, DQ.Deque.empty(a, A)}} : Maybe<a, DQ.Deque.Pop<a, A>> }law pop_back_push_front_empty:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.pop_back(a, A, DQ.Deque.push_front(a, A, DQ.Deque.empty(a, A), x)) == Some{DQ.P{x, DQ.Deque.empty(a, A)}} : Maybe<a, DQ.Deque.Pop<a, A>> }law pop_front_cons:  for -a: Quant  for -A: Kind(a)  for h: A  for t: List<a, A>  for r: List<a, A>  {    DQ.Deque.pop_front(a, A, DQ.D{h <> t, r})      == Some{DQ.P{h, DQ.D{t, r}}}    : Maybe<a, DQ.Deque.Pop<a, A>>  }law pop_back_cons:  for -a: Quant  for -A: Kind(a)  for f: List<a, A>  for h: A  for t: List<a, A>  {    DQ.Deque.pop_back(a, A, DQ.D{f, h <> t})      == Some{DQ.P{h, DQ.D{f, t}}}    : Maybe<a, DQ.Deque.Pop<a, A>>  }law norm_front_cons:  for -a: Quant  for -A: Kind(a)  for h: A  for t: List<a, A>  for r: List<a, A>  { DQ.Deque.norm_front(a, A, DQ.D{h <> t, r}) == DQ.D{h <> t, r} : DQ.Deque<a, A> }law norm_back_cons:  for -a: Quant  for -A: Kind(a)  for f: List<a, A>  for h: A  for t: List<a, A>  { DQ.Deque.norm_back(a, A, DQ.D{f, h <> t}) == DQ.D{f, h <> t} : DQ.Deque<a, A> }law norm_front_rear_one:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.norm_front(a, A, DQ.D{Nil{}, x <> Nil{}}) == DQ.D{x <> Nil{}, Nil{}} : DQ.Deque<a, A> }law norm_back_front_one:  for -a: Quant  for -A: Kind(a)  for x: A  { DQ.Deque.norm_back(a, A, DQ.D{x <> Nil{}, Nil{}}) == DQ.D{Nil{}, x <> Nil{}} : DQ.Deque<a, A> }# push_front then push_back order.law to_list_front_then_back:  for -a: Quant  for -A: Kind(a)  for x: A  for y: A  {    DQ.Deque.to_list(a, A,      DQ.Deque.push_back(a, A, DQ.Deque.push_front(a, A, DQ.Deque.empty(a, A), x), y))      == x <> (y <> Nil{})    : List<a, A>  }