pub struct Tree<T: TreeNodeValue<L>, const N: usize, const L: usize> {
pub root: Node<T, N, L>,
}Fields§
§root: Node<T, N, L>Implementations§
Source§impl<T: TreeNodeValue<L>, const N: usize, const L: usize> Tree<T, N, L>
impl<T: TreeNodeValue<L>, const N: usize, const L: usize> Tree<T, N, L>
Sourcepub proof fn axiom_depth_positive()
pub proof fn axiom_depth_positive()
ensures
L > 0,Sourcepub proof fn axiom_size_positive()
pub proof fn axiom_size_positive()
ensures
N > 0,Sourcepub broadcast proof fn new_preserves_inv()
pub broadcast proof fn new_preserves_inv()
requires
forall |i: int| 0 <= i < N ==> #[trigger] T::default(0).rel_children(i, None),ensures#[trigger] Self::new().inv(),Sourcepub open spec fn insert(self, path: TreePath<N>, node: Node<T, N, L>) -> Self
pub open spec fn insert(self, path: TreePath<N>, node: Node<T, N, L>) -> Self
recommends
self.inv(),path.inv(),node.inv(),path.len() < L,node.level == path.len() as nat,{
Tree {
root: self.root.recursive_insert(path, node),
..self
}
}Sourcepub open spec fn remove(self, path: TreePath<N>) -> Self
pub open spec fn remove(self, path: TreePath<N>) -> Self
recommends
self.inv(),path.inv(),path.len() < L,{
Tree {
root: self.root.recursive_remove(path),
..self
}
}Sourcepub open spec fn visit(self, path: TreePath<N>) -> Seq<Node<T, N, L>>
pub open spec fn visit(self, path: TreePath<N>) -> Seq<Node<T, N, L>>
recommends
self.inv(),path.inv(),path.len() < L,{ self.root.recursive_visit(path) }Sourcepub broadcast proof fn visit_is_recursive_visit(self, path: TreePath<N>)
pub broadcast proof fn visit_is_recursive_visit(self, path: TreePath<N>)
requires
self.inv(),path.inv(),path.len() < L,ensures#[trigger] self.visit(path) == self.root.recursive_visit(path),Sourcepub open spec fn trace(self, path: TreePath<N>) -> Seq<T>
pub open spec fn trace(self, path: TreePath<N>) -> Seq<T>
recommends
self.inv(),path.inv(),path.len() < L,{ self.root.recursive_trace(path) }Sourcepub broadcast proof fn trace_empty_is_head(self, path: TreePath<N>)
pub broadcast proof fn trace_empty_is_head(self, path: TreePath<N>)
requires
path.len() == 0,ensures#[trigger] self.trace(path) == seq![self.root.value],Sourcepub proof fn lemma_trace_up_to(self, path1: TreePath<N>, path2: TreePath<N>, n: int)
pub proof fn lemma_trace_up_to(self, path1: TreePath<N>, path2: TreePath<N>, n: int)
requires
self.inv(),path1.inv(),path2.inv(),n <= path1.len(),n <= path2.len(),forall |i: int| 0 <= i < n ==> path1.0[i] == path2.0[i],self.trace(path1).len() > n,ensuresself.trace(path2).len() > n,forall |i: int| 0 <= i <= n ==> self.trace(path1)[i] == self.trace(path2)[i],Sourcepub broadcast proof fn lemma_trace_length(self, path: TreePath<N>)
pub broadcast proof fn lemma_trace_length(self, path: TreePath<N>)
requires
self.inv(),path.inv(),ensures#[trigger] self.trace(path).len() <= path.len() + 1,Sourcepub open spec fn seek(self, path: TreePath<N>) -> Option<Node<T, N, L>>
pub open spec fn seek(self, path: TreePath<N>) -> Option<Node<T, N, L>>
{ self.root.recursive_seek(path) }Sourcepub proof fn lemma_seek_trace_length(self, path: TreePath<N>)
pub proof fn lemma_seek_trace_length(self, path: TreePath<N>)
requires
self.inv(),path.inv(),path.len() < L,self.seek(path) is Some,ensuresself.trace(path).len() == path.len() + 1,Sourcepub proof fn lemma_seek_trace_next(self, path: TreePath<N>, idx: usize)
pub proof fn lemma_seek_trace_next(self, path: TreePath<N>, idx: usize)
requires
self.seek(path) is Some,self.seek(path)->Some_0.children[idx as int] is Some,self.inv(),path.inv(),path.len() < L,0 <= idx < N,ensuresself.trace(path.push_tail(idx)).len() == path.len() + 2,self.seek(path)->Some_0.children[idx as int]->Some_0.value
== self.trace(path.push_tail(idx))[path.len() as int + 1],Sourcepub broadcast proof fn insert_preserves_inv(self, path: TreePath<N>, node: Node<T, N, L>)
pub broadcast proof fn insert_preserves_inv(self, path: TreePath<N>, node: Node<T, N, L>)
requires
self.inv(),path.inv(),node.inv(),path.len() < L,node.level == path.len() as nat,self.seek(path.pop_tail().1) is Some
==> self.seek(path.pop_tail().1)->Some_0
.value
.rel_children(path.index(path.len() - 1) as int, Some(node.value)),self.seek(path.pop_tail().1) is None
==> T::default((path.len() - 1) as nat)
.rel_children(path.index(path.len() - 1) as int, Some(node.value)),forall |lv: nat, i: int| {
lv < L ==> (0 <= i < N ==> #[trigger] T::default(lv).rel_children(i, None))
},ensures#[trigger] self.insert(path, node).inv(),Sourcepub broadcast proof fn remove_preserves_inv(self, path: TreePath<N>)
pub broadcast proof fn remove_preserves_inv(self, path: TreePath<N>)
requires
self.inv(),path.inv(),path.len() < L,path.len() > 0
==> (self.seek(path.pop_tail().1) is Some
==> self.seek(path.pop_tail().1)->Some_0
.children[path.pop_tail().0 as int] is None
|| self.seek(path.pop_tail().1)->Some_0
.value
.rel_children(path.index(path.len() - 1) as int, None)),ensures#[trigger] self.remove(path).inv(),Sourcepub broadcast proof fn visited_nodes_inv(self, path: TreePath<N>)
pub broadcast proof fn visited_nodes_inv(self, path: TreePath<N>)
requires
#[trigger] self.inv(),#[trigger] path.inv(),path.len() < L,ensuresforall |i: int| {
0 <= i < self.visit(path).len() ==> #[trigger] self.visit(path).index(i).inv()
},Sourcepub open spec fn on_tree(self, node: Node<T, N, L>) -> bool
pub open spec fn on_tree(self, node: Node<T, N, L>) -> bool
recommends
self.inv(),node.inv(),{ self.root.on_subtree(node) }Sourcepub broadcast proof fn on_tree_property(self, node: Node<T, N, L>)
pub broadcast proof fn on_tree_property(self, node: Node<T, N, L>)
requires
self.inv(),node.inv(),#[trigger] self.on_tree(node),ensuresnode.level == 0 ==> self.root == node,node.level > 0
==> exists |path: TreePath<N>| {
#[trigger] path.inv() && path.len() == node.level
&& self.visit(path).last() == node
},Sourcepub broadcast proof fn not_on_tree_property(self, node: Node<T, N, L>)
pub broadcast proof fn not_on_tree_property(self, node: Node<T, N, L>)
requires
self.inv(),node.inv(),!#[trigger] self.on_tree(node),ensuresnode != self.root,node.level > 0
==> forall |path: TreePath<N>| {
#[trigger] path.inv() && path.len() == node.level
==> self.visit(path).last() != node
},Sourcepub open spec fn get_path(self, node: Node<T, N, L>) -> TreePath<N>
pub open spec fn get_path(self, node: Node<T, N, L>) -> TreePath<N>
recommends
self.inv(),node.inv(),self.on_tree(node),{ path_between::<T, N, L>(self.root, node) }Sourcepub broadcast proof fn get_path_properties(self, node: Node<T, N, L>)
pub broadcast proof fn get_path_properties(self, node: Node<T, N, L>)
requires
self.inv(),node.inv(),self.on_tree(node),ensures#[trigger] self.get_path(node).inv(),#[trigger] self.get_path(node).len() == node.level,node.level == 0 ==> #[trigger] self.get_path(node).is_empty(),node.level > 0 ==> #[trigger] self.visit(self.get_path(node)).last() == node,Auto Trait Implementations§
impl<T, const N: usize, const L: usize> Freeze for Tree<T, N, L>where
T: Freeze,
impl<T, const N: usize, const L: usize> RefUnwindSafe for Tree<T, N, L>where
T: RefUnwindSafe,
impl<T, const N: usize, const L: usize> Send for Tree<T, N, L>where
T: Send,
impl<T, const N: usize, const L: usize> Sync for Tree<T, N, L>where
T: Sync,
impl<T, const N: usize, const L: usize> Unpin for Tree<T, N, L>where
T: Unpin,
impl<T, const N: usize, const L: usize> UnwindSafe for Tree<T, N, L>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more