home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mitsch75.zip / scheme-7_5_17-src.zip / scheme-7.5.17 / src / runtime / wttree.scm < prev    next >
Text File  |  1999-01-02  |  22KB  |  694 lines

  1. #| -*-Scheme-*-
  2.  
  3. $Id: wttree.scm,v 1.10 1999/01/02 06:19:10 cph Exp $
  4.  
  5. Copyright (c) 1993-1999 Massachusetts Institute of Technology
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at
  10. your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful, but
  13. WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.  
  22. Copyright (c) 1993-1994 Stephen Adams
  23.  
  24. This program was written by Stephen Adams, based on the following
  25. reference:
  26.  
  27.   Stephen Adams, Implemeting Sets Efficiently in a Functional
  28.      Language, CSTR 92-10, Department of Electronics and Computer
  29.      Science, University of Southampton, 1992
  30. |#
  31.  
  32. ;;;; Weight-balanced tree (wt-tree) Operations
  33. ;;; package: (runtime wt-tree)
  34.  
  35. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  36.  
  37. (declare (usual-integrations))
  38.  
  39.  
  40. ;;;  A tree type is a collection of those procedures that depend on the ordering
  41. ;;;  relation.
  42.  
  43. (define-structure
  44.   (tree-type
  45.    (conc-name tree-type/)
  46.    (constructor %make-tree-type))
  47.   (key<?       #F read-only true)
  48.   (alist->tree #F read-only true)
  49.   (add         #F read-only true)
  50.   (insert!     #F read-only true)
  51.   (delete      #F read-only true)
  52.   (delete!     #F read-only true)
  53.   (member?     #F read-only true)
  54.   (lookup      #F read-only true)
  55.   ;;;min        ; ?  also delmin, max, delmax, delmin!, delmax!
  56.   (split-lt    #F read-only true)
  57.   (split-gt    #F read-only true)
  58.   (union       #F read-only true)
  59.   (union-merge #F read-only true)
  60.   (intersection #F read-only true)
  61.   (difference  #F read-only true)
  62.   (subset?     #F read-only true)
  63.   (rank        #F read-only true)
  64. )  
  65.  
  66. ;;;  Tree representation
  67. ;;;
  68. ;;;  WT-TREE is a wrapper for trees of nodes
  69. ;;;
  70. (define-structure
  71.   (wt-tree
  72.    (conc-name tree/)
  73.    (constructor %make-wt-tree))
  74.   (type  #F read-only true)
  75.   (root  #F read-only false))
  76.  
  77. ;;;  Nodes are the thing from which the real trees are built.
  78.  
  79. (define-integrable (make-node k v l r w) (vector w l k r v))
  80. (define-integrable (node/k node) (vector-ref node 2))
  81. (define-integrable (node/v node) (vector-ref node 4))
  82. (define-integrable (node/l node) (vector-ref node 1))
  83. (define-integrable (node/r node) (vector-ref node 3))
  84. (define-integrable (node/w node) (vector-ref node 0))
  85.  
  86. (define-integrable empty  'empty)
  87. (define-integrable (empty? x) (eq? x 'empty))
  88.  
  89. (define-integrable (node/size node)
  90.   (if (empty? node) 0  (node/w node)))
  91.  
  92. (define-integrable (node/singleton k v) (make-node k v empty empty 1))
  93.  
  94. (define-integrable (with-n-node node receiver)
  95.   (receiver (node/k node) (node/v node) (node/l node) (node/r node)))
  96.  
  97.  
  98. ;;;
  99. ;;;  Constructors for building node trees of various complexity
  100. ;;;
  101.  
  102. (define (n-join k v l r)
  103.   (make-node k v l r (fix:+ 1 (fix:+ (node/size l) (node/size r)))))
  104. (declare (integrate-operator n-join))
  105.  
  106. (define (single-l a.k a.v x r)
  107.   (with-n-node r
  108.     (lambda (b.k b.v y z) (n-join b.k b.v (n-join a.k a.v x y) z))))
  109.  
  110. (define (double-l a.k a.v x r)
  111.   (with-n-node r
  112.     (lambda (c.k c.v r.l z)
  113.       (with-n-node r.l
  114.     (lambda (b.k b.v y1 y2)
  115.       (n-join b.k b.v
  116.           (n-join a.k a.v x y1)
  117.           (n-join c.k c.v y2 z)))))))
  118.  
  119. (define (single-r b.k b.v l z)
  120.   (with-n-node l
  121.     (lambda (a.k a.v x y) (n-join a.k a.v x (n-join b.k b.v y z)))))
  122.  
  123. (define (double-r c.k c.v l z)
  124.   (with-n-node l
  125.     (lambda (a.k a.v x l.r)
  126.       (with-n-node l.r
  127.     (lambda (b.k b.v y1 y2)
  128.       (n-join b.k b.v
  129.           (n-join a.k a.v x y1)
  130.           (n-join c.k c.v y2 z)))))))
  131.  
  132. (define-integrable wt-tree-ratio 5)
  133.  
  134. (define (t-join k v l r)
  135.   (define (simple-join) (n-join k v l r))
  136.   (let ((l.n  (node/size l))
  137.     (r.n  (node/size r)))
  138.     (cond ((fix:< (fix:+ l.n r.n) 2)   (simple-join))
  139.       ((fix:> r.n (fix:* wt-tree-ratio l.n))
  140.        ;; right is too big
  141.        (let ((r.l.n  (node/size (node/l r)))
  142.          (r.r.n  (node/size (node/r r))))
  143.          (if (fix:< r.l.n r.r.n)
  144.          (single-l k v l r)
  145.          (double-l k v l r))))
  146.       ((fix:> l.n (fix:* wt-tree-ratio r.n))
  147.        ;; left is too big
  148.        (let ((l.l.n  (node/size (node/l l)))
  149.          (l.r.n  (node/size (node/r l))))
  150.          (if (fix:< l.r.n l.l.n)
  151.          (single-r k v l r)
  152.          (double-r k v l r))))
  153.       (else
  154.        (simple-join)))))
  155.  
  156. ;;;
  157. ;;;  Node tree Procedures that are independent of key<?
  158. ;;;
  159.  
  160. (define (node/min node)
  161.   (cond  ((empty? node)           (error:empty 'min))
  162.      ((empty? (node/l node))  node)
  163.      (else                   (node/min (node/l node)))))
  164.  
  165. (define (node/delmin node)
  166.   (cond ((empty? node)           (error:empty 'delmin))
  167.     ((empty? (node/l node))  (node/r node))
  168.     (else   (t-join (node/k node) (node/v node)
  169.             (node/delmin (node/l node)) (node/r node)))))
  170.  
  171. (define (node/concat2 node1 node2)
  172.   (cond ((empty? node1)   node2)
  173.     ((empty? node2)   node1)
  174.     (else
  175.      (let ((min-node (node/min node2)))
  176.        (t-join (node/k min-node) (node/v min-node)
  177.            node1 (node/delmin node2))))))
  178.  
  179. (define (node/inorder-fold procedure base node)
  180.   (define (fold base node)
  181.     (if (empty? node)
  182.     base
  183.     (with-n-node node
  184.       (lambda (k v l r)
  185.         (fold (procedure k v (fold base r)) l)))))
  186.   (fold base node))
  187.  
  188. (define (node/for-each procedure node)
  189.   (if (not (empty? node))
  190.       (with-n-node node
  191.     (lambda (k v l r)
  192.       (node/for-each procedure l)
  193.       (procedure k v)
  194.       (node/for-each procedure r)))))
  195.  
  196. (define (node/height node)
  197.   (if (empty? node)
  198.       0
  199.       (1+ (max (node/height (node/l node)) (node/height (node/r node))))))
  200.  
  201. (define (node/index node index)
  202.   (define (loop node index)
  203.     (let ((size.l  (node/size (node/l node))))
  204.       (cond ((fix:< index size.l)  (loop (node/l node) index))
  205.         ((fix:> index size.l)  (loop (node/r node)
  206.                      (fix:- index (fix:+ 1 size.l))))
  207.         (else                  node))))
  208.   (let ((bound  (node/size node)))
  209.     (if (or (< index 0)
  210.         (>= index bound)
  211.         (not (fix:fixnum? index)))
  212.     (error:bad-range-argument index 'node/index)
  213.     (loop node index))))
  214.  
  215. (define (error:empty owner)
  216.   ((access error system-global-environment)
  217.    "Operation requires non-empty tree:" owner))
  218.  
  219.  
  220. (define (make-wt-tree-type key<?)
  221.  
  222.   (declare (integrate key<?))
  223.  
  224.   (define-integrable (key>? x y)  (key<? y x))
  225.  
  226.   (define (node/find k node)
  227.     ;; returns either the node or #f.
  228.     ;; Loop takes D comparisons (D is the depth of the tree) rather than the
  229.     ;; traditional compare-low, compare-high which takes on average
  230.     ;; 1.5(D-1) comparisons
  231.     (define (loop this best)
  232.       (cond ((empty? this)  best)
  233.         ((key<? k (node/k this))   (loop (node/l this) best))
  234.         (else (loop (node/r this) this))))
  235.     (let ((best (loop node #f)))
  236.       (cond ((not best)               #f)
  237.         ((key<? (node/k best) k)  #f)
  238.         (else                     best))))
  239.  
  240.   (define (node/rank k node rank)
  241.     (cond ((empty? node)             #f)
  242.       ((key<? k (node/k node))  (node/rank k (node/l node) rank))
  243.       ((key>? k (node/k node))  
  244.        (node/rank k (node/r node)
  245.                 (fix:+ 1 (fix:+ rank (node/size (node/l node))))))
  246.       (else                     (fix:+ rank (node/size (node/l node))))))
  247.  
  248.   (define (node/add node k v)
  249.     (if (empty? node)
  250.     (node/singleton k v)
  251.     (with-n-node node
  252.       (lambda (key val l r)
  253.         (cond ((key<? k key)   (t-join key val (node/add l k v) r))
  254.           ((key<? key k)   (t-join key val l (node/add r k v)))
  255.           (else            (n-join key v   l r)))))))
  256.  
  257.   (define (node/delete x node)
  258.     (if (empty? node)
  259.     empty
  260.     (with-n-node node
  261.       (lambda (key val l r)
  262.         (cond ((key<? x key)   (t-join key val (node/delete x l) r))
  263.           ((key<? key x)   (t-join key val l (node/delete x r)))
  264.           (else            (node/concat2 l r)))))))
  265.  
  266.   (define (node/concat tree1 tree2)
  267.     (cond ((empty? tree1)  tree2)
  268.       ((empty? tree2)  tree1)
  269.       (else
  270.        (let ((min-node (node/min tree2)))
  271.          (node/concat3 (node/k min-node) (node/v min-node) tree1
  272.                (node/delmin tree2))))))
  273.  
  274.   (define (node/concat3 k v l r)
  275.     (cond ((empty? l)   (node/add r k v))
  276.       ((empty? r)   (node/add l k v))
  277.       (else
  278.        (let ((n1  (node/size l))
  279.          (n2  (node/size r)))
  280.          (cond ((fix:< (fix:* wt-tree-ratio n1) n2)
  281.             (with-n-node r
  282.                  (lambda (k2 v2 l2 r2)
  283.                    (t-join k2 v2 (node/concat3 k v l l2) r2))))
  284.            ((fix:< (fix:* wt-tree-ratio n2) n1)
  285.             (with-n-node l
  286.                  (lambda (k1 v1 l1 r1)
  287.                    (t-join k1 v1 l1 (node/concat3 k v r1 r)))))
  288.            (else
  289.             (n-join k v l r)))))))
  290.  
  291.   (define (node/split-lt node x)
  292.     (cond ((empty? node)  empty)
  293.       ((key<? x (node/k node))
  294.        (node/split-lt (node/l node) x))
  295.       ((key<? (node/k node) x)
  296.        (node/concat3 (node/k node) (node/v node) (node/l node)
  297.              (node/split-lt (node/r node) x)))
  298.       (else (node/l node))))
  299.  
  300.   (define (node/split-gt node x)
  301.     (cond ((empty? node)  empty)
  302.       ((key<? (node/k node) x)
  303.        (node/split-gt (node/r node) x))
  304.       ((key<? x (node/k node))
  305.        (node/concat3 (node/k node) (node/v node) 
  306.              (node/split-gt (node/l node) x) (node/r node)))
  307.       (else (node/r node))))
  308.  
  309.   (define (node/union tree1 tree2)
  310.     (cond  ((empty? tree1)  tree2)
  311.        ((empty? tree2)  tree1)
  312.        (else
  313.         (with-n-node tree2
  314.           (lambda (ak av l r)
  315.         (let ((l1  (node/split-lt tree1 ak))
  316.               (r1  (node/split-gt tree1 ak)))
  317.           (node/concat3 ak av (node/union l1 l) (node/union r1 r))))))))
  318.  
  319.   (define (node/union-merge tree1 tree2 merge)
  320.     (cond ((empty? tree1)  tree2)
  321.       ((empty? tree2)  tree1)
  322.       (else
  323.        (with-n-node tree2
  324.          (lambda (ak av l r)
  325.            (let* ((node1  (node/find ak tree1))
  326.               (l1     (node/split-lt tree1 ak))
  327.               (r1     (node/split-gt tree1 ak))
  328.               (value  (if node1
  329.                   (merge ak av (node/v node1))
  330.                   av)))
  331.          (node/concat3 ak value
  332.                    (node/union-merge l1 l merge)
  333.                    (node/union-merge r1 r merge))))))))
  334.  
  335.   (define (node/difference tree1 tree2)
  336.     (cond ((empty? tree1)   empty)
  337.       ((empty? tree2)   tree1)
  338.       (else
  339.        (with-n-node tree2
  340.          (lambda (ak av l r)
  341.            (let ((l1  (node/split-lt tree1 ak))
  342.              (r1  (node/split-gt tree1 ak)))
  343.          av
  344.          (node/concat (node/difference l1 l)
  345.                   (node/difference r1 r))))))))
  346.  
  347.   (define (node/intersection tree1 tree2)
  348.     (cond ((empty? tree1)   empty)
  349.       ((empty? tree2)   empty)
  350.       (else
  351.        (with-n-node tree2
  352.          (lambda (ak av l r)
  353.            (let ((l1  (node/split-lt tree1 ak))
  354.              (r1  (node/split-gt tree1 ak)))
  355.          (if (node/find ak tree1)
  356.              (node/concat3 ak av (node/intersection l1 l)
  357.                    (node/intersection r1 r))
  358.              (node/concat (node/intersection l1 l)
  359.                   (node/intersection r1 r)))))))))
  360.  
  361.   (define (node/subset? tree1 tree2)
  362.     (or (empty? tree1)
  363.     (and (fix:<= (node/size tree1) (node/size tree2))
  364.          (with-n-node tree1
  365.                (lambda (k v l r)
  366.          v
  367.          (cond ((key<? k (node/k tree2))
  368.             (and (node/subset? l (node/l tree2))
  369.                  (node/find k tree2)
  370.                  (node/subset? r tree2)))
  371.                ((key>? k (node/k tree2))
  372.             (and (node/subset? r (node/r tree2))
  373.                  (node/find k tree2)
  374.                  (node/subset? l tree2)))
  375.                (else
  376.             (and (node/subset? l (node/l tree2))
  377.                  (node/subset? r (node/r tree2))))))))))
  378.  
  379.  
  380.   ;;; Tree interface: stripping off or injecting the tree types
  381.  
  382.   (define (tree/map-add tree k v)
  383.     (%make-wt-tree (tree/type tree)
  384.            (node/add (tree/root tree) k v)))
  385.  
  386.   ;(define (tree/set-add tree k)  (tree/map-add tree k #f))
  387.  
  388.   (define (tree/insert! tree k v)
  389.     (set-tree/root! tree (node/add (tree/root tree) k v)))
  390.  
  391.   (define (tree/delete tree k)
  392.     (%make-wt-tree (tree/type tree)
  393.            (node/delete k (tree/root tree))))
  394.  
  395.   (define (tree/delete! tree k)
  396.     (set-tree/root! tree (node/delete k (tree/root tree))))
  397.  
  398.   (define (tree/split-lt tree key)
  399.     (%make-wt-tree (tree/type tree)
  400.            (node/split-lt (tree/root tree) key)))
  401.  
  402.   (define (tree/split-gt tree key)
  403.     (%make-wt-tree (tree/type tree)
  404.            (node/split-gt (tree/root tree) key)))
  405.  
  406.   (define (tree/union tree1 tree2)
  407.     (%make-wt-tree (tree/type tree1)
  408.            (node/union (tree/root tree1) (tree/root tree2))))
  409.  
  410.   (define (tree/union-merge tree1 tree2 merge)
  411.     (%make-wt-tree (tree/type tree1)
  412.            (node/union-merge (tree/root tree1) (tree/root tree2)
  413.                      merge)))
  414.  
  415.   (define (tree/intersection tree1 tree2)
  416.     (%make-wt-tree (tree/type tree1)
  417.            (node/intersection (tree/root tree1) (tree/root tree2))))
  418.  
  419.   (define (tree/difference tree1 tree2)
  420.     (%make-wt-tree (tree/type tree1)
  421.           (node/difference (tree/root tree1) (tree/root tree2))))
  422.  
  423.   (define (tree/subset? tree1 tree2)
  424.     (node/subset? (tree/root tree1) (tree/root tree2)))
  425.  
  426.   (define (alist->tree alist)
  427.     (define (loop alist node)
  428.       (cond ((null? alist)  node)
  429.         ((pair? alist)  (loop (cdr alist)
  430.                   (node/add node (caar alist) (cdar alist))))
  431.         (else           
  432.          (error:wrong-type-argument alist "alist" 'alist->tree))))
  433.     (%make-wt-tree my-type (loop alist empty)))
  434.  
  435.   (define (tree/get tree key default)
  436.     (let ((node  (node/find key (tree/root tree))))
  437.       (if node
  438.       (node/v node)
  439.       default)))
  440.  
  441.   (define (tree/rank tree key)  (node/rank key (tree/root tree) 0))
  442.  
  443.   (define (tree/member? key tree)
  444.     (and (node/find key (tree/root tree))
  445.      #t))
  446.  
  447.   (define my-type
  448.     (%make-tree-type
  449.      key<?                ;  key<?
  450.      alist->tree          ;  alist->tree
  451.      tree/map-add         ;  add
  452.      tree/insert!         ;  insert!
  453.      tree/delete          ;  delete
  454.      tree/delete!         ;  delete!
  455.      tree/member?         ;  member?
  456.      tree/get             ;  lookup
  457.      tree/split-lt        ;  split-lt
  458.      tree/split-gt        ;  split-gt
  459.      tree/union           ;  union
  460.      tree/union-merge     ;  union-merge
  461.      tree/intersection    ;  intersection
  462.      tree/difference      ;  difference
  463.      tree/subset?         ;  subset?
  464.      tree/rank            ;  rank
  465.      ))
  466.  
  467.   my-type)
  468.     
  469.  
  470.  
  471. ;;;
  472. ;;;
  473. ;;;
  474.  
  475. (define (guarantee-tree/report tree procedure)
  476.   (error:wrong-type-argument tree "weight-balanced tree" procedure))
  477.  
  478. (define-integrable (guarantee-tree tree procedure)
  479.   (if (not (wt-tree? tree))
  480.       (guarantee-tree/report tree procedure)))
  481.  
  482. (define-integrable (guarantee-tree-type type procedure)
  483.   (if (not (tree-type? type))
  484.       (error:wrong-type-argument type "weight-balanced tree type" procedure)))
  485.  
  486. (define-integrable (guarantee-compatible-trees/report tree1 tree2 procedure)
  487.   (guarantee-tree tree1 procedure)
  488.   (guarantee-tree tree2 procedure)
  489.   (error "The trees" tree1 'and tree2 'have 'incompatible 'types
  490.      (tree/type tree1) 'and (tree/type tree2)))
  491.  
  492. (define-integrable (guarantee-compatible-trees tree1 tree2 procedure)
  493.   (if (or (not (wt-tree? tree1))
  494.       (not (wt-tree? tree2))
  495.       (not (eq? (tree/type tree1) (tree/type tree2))))
  496.       (guarantee-compatible-trees/report tree1 tree2 procedure)))
  497.  
  498. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  499. ;;;
  500. ;;;  Exported interface
  501. ;;;
  502. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  503.  
  504.  
  505. (define (make-wt-tree tree-type)
  506.   (%make-wt-tree tree-type empty))
  507.  
  508. (define (singleton-wt-tree type key value)
  509.   (guarantee-tree-type type 'singleton-wt-tree)
  510.   (%make-wt-tree type (node/singleton key value)))
  511.  
  512. (define (alist->wt-tree type alist)
  513.   (guarantee-tree-type type 'alist->wt-tree)
  514.   ((tree-type/alist->tree type) alist))
  515.  
  516. (define (wt-tree/empty? tree)
  517.   (guarantee-tree tree 'wt-tree/empty?)
  518.   (empty? (tree/root tree)))
  519.  
  520. (define (wt-tree/size tree)
  521.   (guarantee-tree tree 'wt-tree/size)
  522.   (node/size (tree/root tree)))
  523.  
  524. (define (wt-tree/add tree key datum)
  525.   (guarantee-tree tree 'wt-tree/add)
  526.   ((tree-type/add (tree/type tree)) tree key datum))
  527.  
  528. (define (wt-tree/delete tree key)
  529.   (guarantee-tree tree 'wt-tree/delete)
  530.   ((tree-type/delete (tree/type tree)) tree key))
  531.  
  532. (define (wt-tree/add! tree key datum)
  533.   (guarantee-tree tree 'wt-tree/add!)
  534.   ((tree-type/insert! (tree/type tree)) tree key datum))
  535.  
  536. (define (wt-tree/delete! tree key)
  537.   (guarantee-tree tree 'wt-tree/delete!)
  538.   ((tree-type/delete! (tree/type tree)) tree key))
  539.  
  540. (define (wt-tree/member? key tree)
  541.   (guarantee-tree tree 'wt-tree/member?)
  542.   ((tree-type/member? (tree/type tree)) key tree))
  543.  
  544. (define (wt-tree/lookup tree key default)
  545.   (guarantee-tree tree 'wt-tree/lookup)
  546.   ((tree-type/lookup (tree/type tree)) tree key default))
  547.  
  548. (define (wt-tree/split< tree key)
  549.   (guarantee-tree tree 'wt-tree/split<)
  550.   ((tree-type/split-lt (tree/type tree)) tree key))
  551.  
  552. (define (wt-tree/split> tree key)
  553.   (guarantee-tree tree 'wt-tree/split>)
  554.   ((tree-type/split-gt (tree/type tree)) tree key))
  555.  
  556. (define (wt-tree/union tree1 tree2)
  557.   (guarantee-compatible-trees tree1 tree2 'wt-tree/union)
  558.   ((tree-type/union (tree/type tree1)) tree1 tree2))
  559.  
  560. (define (wt-tree/union-merge tree1 tree2 merge)
  561.   (guarantee-compatible-trees tree1 tree2 'wt-tree/union-merge)
  562.   ((tree-type/union-merge (tree/type tree1)) tree1 tree2 merge))
  563.  
  564. (define (wt-tree/intersection tree1 tree2)
  565.   (guarantee-compatible-trees tree1 tree2 'wt-tree/intersection)
  566.   ((tree-type/intersection (tree/type tree1)) tree1 tree2))
  567.  
  568. (define (wt-tree/difference tree1 tree2)
  569.   (guarantee-compatible-trees tree1 tree2 'wt-tree/difference)
  570.   ((tree-type/difference (tree/type tree1)) tree1 tree2))
  571.  
  572. (define (wt-tree/subset? tree1 tree2)
  573.   (guarantee-compatible-trees tree1 tree2 'wt-tree/subset?)
  574.   ((tree-type/subset? (tree/type tree1)) tree1 tree2))
  575.  
  576. (define (wt-tree/set-equal? tree1 tree2)
  577.   (and (wt-tree/subset? tree1 tree2)
  578.        (wt-tree/subset? tree2 tree1)))
  579.  
  580. (define (wt-tree/fold combiner-key-datum-result init tree)
  581.   (guarantee-tree tree 'wt-tree/fold)
  582.   (node/inorder-fold combiner-key-datum-result init (tree/root tree)))
  583.  
  584. (define (wt-tree/for-each action-key-datum tree)
  585.   (guarantee-tree tree 'wt-tree/for-each)
  586.   (node/for-each action-key-datum (tree/root tree)))
  587.  
  588. (define (wt-tree/index tree index)
  589.   (guarantee-tree tree 'wt-tree/index)
  590.   (let ((node  (node/index (tree/root tree) index)))
  591.     (and node (node/k node))))
  592.  
  593. (define (wt-tree/index-datum tree index)
  594.   (guarantee-tree tree 'wt-tree/index-datum)
  595.   (let ((node  (node/index (tree/root tree) index)))
  596.     (and node (node/v node))))
  597.  
  598. (define (wt-tree/index-pair tree index)
  599.   (guarantee-tree tree 'wt-tree/index-pair)
  600.   (let ((node  (node/index (tree/root tree) index)))
  601.     (and node (cons (node/k node) (node/v node)))))
  602.  
  603. (define (wt-tree/rank tree key)
  604.   (guarantee-tree tree 'wt-tree/rank)
  605.   ((tree-type/rank (tree/type tree)) tree key))
  606.  
  607. (define (wt-tree/min tree)
  608.   (guarantee-tree tree 'wt-tree/min)
  609.   (node/k (node/min (tree/root tree))))
  610.  
  611. (define (wt-tree/min-datum tree)
  612.   (guarantee-tree tree 'wt-tree/min-datum)
  613.   (node/v (node/min (tree/root tree))))
  614.  
  615. (define (wt-tree/min-pair tree)
  616.   (guarantee-tree tree 'wt-tree/min-pair)
  617.   (let ((node  (node/min (tree/root tree))))
  618.     (cons (node/k node) (node/v node))))
  619.  
  620. (define (wt-tree/delete-min tree)
  621.   (guarantee-tree tree 'wt-tree/delete-min)
  622.   (%make-wt-tree (tree/type tree) (node/delmin (tree/root tree))))
  623.  
  624. (define (wt-tree/delete-min! tree)
  625.   (guarantee-tree tree 'wt-tree/delete-min!)
  626.   (set-tree/root! tree (node/delmin (tree/root tree))))
  627.  
  628. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  629. ;;;
  630. ;;;
  631.  
  632. (define ttype (make-wt-tree-type <))
  633.  
  634. (define number-wt-type
  635.   ((lambda()
  636.      (declare (integrate-operator make-wt-tree-type))
  637.      (make-wt-tree-type  (lambda (x y) (< x y))))))
  638.  
  639. (define string-wt-type
  640.   ((lambda()
  641.      (declare (integrate-operator make-wt-tree-type))
  642.      (make-wt-tree-type  string<?))))
  643.  
  644. ;;;
  645. ;;;
  646. ;;;
  647.  
  648. #|
  649.  
  650. Test code, using maps from digit strings to the numbers they represent.
  651.  
  652. (load-option 'wt-tree)
  653.  
  654. (define (make-map lo hi step)
  655.   (let loop ((i lo) (map (make-wt-tree string-wt-type)))
  656.     (if (> i hi)
  657.     map
  658.     (loop (+ i step) (wt-tree/add map (number->string i) i)))))
  659.  
  660. (define t1 (make-map 0 99 2))   ; 0,2,4,...,98
  661. (define t2 (make-map 1 100 2))  ; 1,3,5,...,99
  662. (define t3 (make-map 0 100 3))  ; 0,3,6,...,99
  663.  
  664. (define (wt-tree->alist t)
  665.   (wt-tree/fold (lambda (k d r) (cons (cons k d) r)) '() t))
  666.  
  667. (wt-tree->alist t3);
  668.   => (("0" . 0) ("12" . 12) ("15" . 15) ("18" . 18) ("21" . 21) ("24" . 24) ("27" . 27) ("3" . 3) ("30" . 30) ("33" . 33) ("36" . 36) ("39" . 39) ("42" . 42) ("45" . 45) ("48" . 48) ("51" . 51) ("54" . 54) ("57" . 57) ("6" . 6) ("60" . 60) ("63" . 63) ("66" . 66) ("69" . 69) ("72" . 72) ("75" . 75) ("78" . 78) ("81" . 81) ("84" . 84) ("87" . 87) ("9" . 9) ("90" . 90) ("93" . 93) ("96" . 96) ("99" . 99))
  669.  
  670. (define (try-all operation trees)
  671.   (map (lambda (t1)
  672.      (map (lambda (t2)
  673.         (operation t1 t2))
  674.           trees))
  675.        trees))
  676.  
  677. (try-all (lambda (t1 t2) (wt-tree/size (wt-tree/union t1 t2)))
  678.      (list t1 t2 t3))
  679.   => ((50 100 67) (100 50 67) (67 67 34))
  680.  
  681. (try-all (lambda (t1 t2) (wt-tree/size (wt-tree/difference t1 t2)))
  682.      (list t1 t2 t3))
  683.   => ((0 50 33) (50 0 33) (17 17 0))
  684.  
  685. (try-all (lambda (t1 t2) (wt-tree/size (wt-tree/intersection t1 t2)))
  686.      (list t1 t2 t3))
  687.   => ((50 0 17) (0 50 17) (17 17 34))
  688.  
  689. (try-all (lambda (t1 t2) (wt-tree/set-equal? (wt-tree/difference t1 t2)
  690.                          (wt-tree/difference t2 t1)))
  691.      (list t1 t2 t3))
  692.   => ((#t #f #f) (#f #t #f) (#f #f #t))
  693.  
  694. |#