home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum8.lzh / PROGRAMME / MODULA / SET / bigset.mod < prev    next >
Text File  |  1989-01-19  |  7KB  |  285 lines

  1. (* Module Version V#011, Gdos /1.3l/, Begonnen: 19.01.86, Stand: 12.04.86 *)
  2. (*                                                              Alex Wyss *)
  3. (* Anpassung Miele-M2 / OS-9  19-12-88                        W. Stehling *)
  4.  
  5. IMPLEMENTATION MODULE BigSet ;
  6.  
  7. FROM Storage IMPORT
  8. (* proc *)      ALLOCATE , DEALLOCATE
  9. ;
  10.  
  11. CONST
  12.   fulls      = BITSET {  0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,
  13.                          8 ,  9 , 10 , 11 , 12 , 13 , 14 , 15 } ;
  14.   maxsetnr   = $FFFE ;              (* maxset * 16 {TSIZE(BITSET)} *)
  15.   maxset     = maxsetnr DIV 16 ;    (* maximal number of array elements *)
  16.  
  17. TYPE
  18.   maxsetsize = [ 0 .. maxset ] ;
  19.   bigsettype = RECORD
  20.                  bigsetsize ,
  21.                  nrofelem   : CARDINAL ;
  22.                  lastset    : BITSET ;
  23.                  elem       : ARRAY maxsetsize OF BITSET ;
  24.                END ;
  25.   bigset     = POINTER TO bigsettype ;
  26.  
  27. PROCEDURE define ( setsize : CARDINAL ) : bigset ;
  28. VAR
  29.   bs : bigset ;
  30.   sz : CARDINAL ;
  31. BEGIN
  32.   IF setsize > maxsetnr THEN
  33.     RETURN NIL ;
  34.   ELSE
  35.     sz := setsize DIV 16  ;         (* sz := setsize DIV TSIZE ( BITSET ) ; *)
  36.     ALLOCATE ( bs , ( sz + 4 ) * 2 ) ;
  37.     WITH bs^ DO
  38.       nrofelem   := setsize ;
  39.       bigsetsize := sz ;
  40.       sz := ( setsize + 1 ) MOD 16 ;
  41.       IF sz = 0 THEN
  42.         lastset := fulls ;
  43.       ELSE
  44.         lastset := {} ;
  45.         LOOP
  46.           INCL ( lastset , CARDINAL ( sz ) ) ;
  47.           IF sz = 0 THEN
  48.             EXIT ;
  49.           END ; (* if *)
  50.           DEC ( sz ) ;
  51.         END ; (* loop *)
  52.       END ; (* if *)
  53.     END ; (* with *)
  54.     nullset ( bs ) ;
  55.     RETURN bs ;
  56.   END ; (* if *)
  57. END define ;
  58.  
  59. PROCEDURE destroy ( forget : bigset ) ;
  60. BEGIN
  61.   DEALLOCATE ( forget , ( forget^.bigsetsize + 4 ) * 2 ) ;
  62. END destroy ;
  63.  
  64. PROCEDURE nullset ( VAR bs : bigset ) ;
  65. VAR
  66.   i : CARDINAL ;
  67. BEGIN
  68.   WITH bs^ DO
  69.     i := bigsetsize ;
  70.     LOOP
  71.       elem [ i ] := {} ;
  72.       IF i = 0 THEN
  73.         EXIT ;
  74.       ELSE
  75.         DEC ( i ) ;
  76.       END ; (* if *)
  77.     END ; (* loop *)
  78.   END ; (* with *)
  79. END nullset ;
  80.  
  81. PROCEDURE fullset ( VAR bs : bigset ) ;
  82. VAR
  83.   i : CARDINAL ;
  84. BEGIN
  85.   WITH bs^ DO
  86.     i := bigsetsize ;
  87.     elem [ i ] := lastset ;
  88.     LOOP
  89.       IF i = 0 THEN
  90.         EXIT ;
  91.       ELSE
  92.         DEC ( i ) ;
  93.       END ; (* if *)
  94.       elem [ i ] := fulls ;
  95.     END ; (* loop *)
  96.   END ; (* with *)
  97. END fullset ;
  98.  
  99. PROCEDURE assign ( fromset : bigset; VAR toset : bigset ) ;
  100. VAR
  101.   i : CARDINAL ;
  102. BEGIN
  103.   WITH toset^ DO
  104.     IF fromset^.nrofelem = nrofelem THEN
  105.       FOR i := 0 TO bigsetsize DO
  106.         elem [ i ] := fromset^.elem [ i ] ;
  107.       END ; (* for *)
  108.       (* MoveWords ( ADR ( fromset^.elem [ 0 ] ) , ADR ( elem [ 0 ] ) ,
  109.                      bigsetsize * 2L ) ; *)
  110.     END ; (* if *)
  111.   END ; (* with *)
  112. END assign ;
  113.  
  114. PROCEDURE include ( VAR bs : bigset ; nr : CARDINAL ) ;
  115. BEGIN
  116.   WITH  bs^  DO
  117.     IF  nr <= nrofelem  THEN
  118.       INCL ( elem [ nr DIV 16 ] , nr MOD 16 )
  119.     END
  120.   END
  121. END include ;
  122.  
  123. PROCEDURE exclude ( VAR bs : bigset ; nr : CARDINAL ) ;
  124. BEGIN
  125.   WITH  bs^  DO
  126.     IF  nr <= nrofelem  THEN
  127.       EXCL ( elem [ nr DIV 16 ] , nr MOD 16 )
  128.     END
  129.   END
  130. END exclude ;
  131.  
  132. PROCEDURE union ( aset , bset : bigset; VAR cset : bigset ) ;
  133. VAR
  134.   i : CARDINAL ;
  135. BEGIN
  136.   WITH cset^ DO
  137.     IF ( bset^.nrofelem = nrofelem ) AND
  138.        ( aset^.nrofelem = nrofelem) THEN
  139.       FOR i := 0 TO bigsetsize DO
  140.         elem [ i ] := aset^.elem [ i ] + bset^.elem [ i ] ;
  141.       END ; (* for *)
  142.     END ; (* if *)
  143.     elem [ bigsetsize ] := lastset * elem [ bigsetsize ] ;
  144.   END ; (* with *)
  145. END union ;
  146.  
  147. PROCEDURE intersection ( aset , bset : bigset; VAR cset : bigset ) ;
  148. VAR
  149.   i : CARDINAL ;
  150. BEGIN
  151.   WITH cset^ DO
  152.     IF ( bset^.nrofelem = nrofelem ) AND
  153.        ( aset^.nrofelem = nrofelem) THEN
  154.       FOR i := 0 TO bigsetsize DO
  155.         elem [ i ] := aset^.elem [ i ] * bset^.elem [ i ] ;
  156.       END ; (* for *)
  157.     END ; (* if *)
  158.     elem [ bigsetsize ] := lastset * elem [ bigsetsize ] ;
  159.   END ; (* with *)
  160. END intersection ;
  161.  
  162. PROCEDURE diff ( aset , bset : bigset; VAR cset : bigset ) ;
  163. VAR
  164.   i : CARDINAL ;
  165. BEGIN
  166.   WITH cset^ DO
  167.     IF ( bset^.nrofelem = nrofelem ) AND
  168.        ( aset^.nrofelem = nrofelem) THEN
  169.       FOR i := 0 TO bigsetsize DO
  170.         elem [ i ] := aset^.elem [ i ] - bset^.elem [ i ] ;
  171.       END ; (* for *)
  172.     END ; (* if *)
  173.     elem [ bigsetsize ] := lastset * elem [ bigsetsize ] ;
  174.   END ; (* with *)
  175. END diff ;
  176.  
  177. PROCEDURE symdiff ( aset , bset : bigset; VAR cset : bigset ) ;
  178. VAR
  179.   i : CARDINAL ;
  180. BEGIN
  181.   WITH cset^ DO
  182.     IF ( bset^.nrofelem = nrofelem ) AND
  183.        ( aset^.nrofelem = nrofelem) THEN
  184.       FOR i := 0 TO bigsetsize DO
  185.         elem [ i ] := aset^.elem [ i ] / bset^.elem [ i ] ;
  186.       END ; (* for *)
  187.     END ; (* if *)
  188.     elem [ bigsetsize ] := lastset * elem [ bigsetsize ] ;
  189.   END ; (* with *)
  190. END symdiff ;
  191.  
  192. PROCEDURE complement ( VAR bs : bigset ) ;
  193. VAR
  194.   ns : bigset ;
  195. BEGIN
  196.   WITH bs^ DO
  197.     ALLOCATE ( ns , ( bigsetsize + 4 ) * 2 ) ;
  198.     ns^.nrofelem   := nrofelem ;
  199.     ns^.bigsetsize := bigsetsize ;
  200.     ns^.lastset    := lastset ;
  201.     (* ns := bigset ( define ( nrofelem ) ) ; *)
  202.     fullset ( ns ) ;
  203.     diff ( ns , bs , bs ) ;
  204.     destroy ( ns ) ;
  205.   END ; (* with *)
  206. END complement ;
  207.  
  208.  
  209. PROCEDURE inset ( bs : bigset ; nr : CARDINAL ) : BOOLEAN ;
  210. BEGIN
  211.   RETURN CARDINAL ( nr MOD 16 ) IN bs^.elem [ nr DIV 16 ] ;
  212. END inset ;
  213.  
  214. PROCEDURE subset ( subs , bs : bigset ) : BOOLEAN ;
  215. VAR
  216.   i : CARDINAL ;
  217. BEGIN
  218.   WITH bs^ DO
  219.     IF subs^.nrofelem # nrofelem THEN
  220.       RETURN FALSE ;
  221.     ELSE
  222.       i := bigsetsize ;
  223.       LOOP
  224.         IF subs^.elem [ i ] <= elem [ i ] THEN
  225.           IF i > 0 THEN
  226.             DEC ( i ) ;
  227.           ELSE
  228.             RETURN TRUE ;
  229.           END ; (* if *)
  230.         ELSE
  231.           RETURN FALSE ;
  232.         END ; (* if *)
  233.       END ; (* loop *)
  234.     END ; (* if *)
  235.   END ; (* with *)
  236. END subset ;
  237.  
  238. PROCEDURE superset ( sups , bs : bigset ) : BOOLEAN ;
  239. VAR
  240.   i : CARDINAL ;
  241. BEGIN
  242.   WITH bs^ DO
  243.     IF sups^.nrofelem # nrofelem THEN
  244.       RETURN FALSE ;
  245.     ELSE
  246.       i := bigsetsize ;
  247.       LOOP
  248.         IF sups^.elem [ i ] >= elem [ i ] THEN
  249.           IF i > 0 THEN
  250.             DEC ( i ) ;
  251.           ELSE
  252.             RETURN TRUE ;
  253.           END ; (* if *)
  254.         ELSE
  255.           RETURN FALSE ;
  256.         END ; (* if *)
  257.       END ; (* loop *)
  258.     END ; (* if *)
  259.   END ; (* with *)
  260. END superset ;
  261.  
  262. PROCEDURE equalset ( equs , bs : bigset ) : BOOLEAN ;
  263. VAR
  264.   i : CARDINAL ;
  265. BEGIN
  266.   WITH bs^ DO
  267.     IF equs^.nrofelem # nrofelem THEN
  268.       RETURN FALSE ;
  269.     ELSE
  270.       i := bigsetsize ;
  271.       LOOP
  272.         IF equs^.elem [ i ] # elem [ i ] THEN
  273.           RETURN FALSE ;
  274.         ELSIF i > 0 THEN
  275.           DEC ( i ) ;
  276.         ELSE
  277.           RETURN TRUE ;
  278.         END ; (* if *)
  279.       END ; (* loop *)
  280.     END ; (* if *)
  281.   END ; (* with *)
  282. END equalset ;
  283.  
  284. END BigSet .
  285.