Split a tree into two disjoint subtrees.
(tree-split x tree) → (mv in left right)
When
The implementation is comparable to
Function:
(defun tree-split (x tree) (declare (xargs :guard (binary-tree-p tree))) (let ((__function__ 'tree-split)) (declare (ignorable __function__)) (b* (((when (tree-emptyp tree)) (mv nil nil nil)) ((when (equal x (tree-head tree))) (mv t (tree-left tree) (tree-right tree)))) (if (bst< x (tree-head tree)) (b* (((mv in left$ right$) (tree-split x (tree-left tree)))) (mbe :logic (let ((tree$ (rotate-right (tree-node (tree-head tree) (tree-node x left$ right$) (tree-right tree))))) (mv in (tree-left tree$) (tree-right tree$))) :exec (mv in left$ (tree-node (tree-head tree) right$ (tree-right tree))))) (b* (((mv in left$ right$) (tree-split x (tree-right tree)))) (mbe :logic (let ((tree$ (rotate-left (tree-node (tree-head tree) (tree-left tree) (tree-node x left$ right$))))) (mv in (tree-left tree$) (tree-right tree$))) :exec (mv in (tree-node (tree-head tree) (tree-left tree) left$) right$)))))))
Theorem:
(defthm booleanp-of-tree-split.in (b* (((mv ?in ?left ?right) (tree-split x tree))) (booleanp in)) :rule-classes :type-prescription)
Theorem:
(defthm binary-tree-p-of-tree-split.left (b* (((mv ?in ?left ?right) (tree-split x tree))) (binary-tree-p left)) :rule-classes :rewrite)
Theorem:
(defthm binary-tree-p-of-tree-split.right (b* (((mv ?in ?left ?right) (tree-split x tree))) (binary-tree-p right)) :rule-classes :rewrite)