Sets.mod 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. IMPLEMENTATION MODULE Sets;
  2. IMPORT FileIO;
  3. (* Clear Clear all elements in set s
  4. ---------------------------------------------------------------------------*)
  5. PROCEDURE Clear (VAR s: ARRAY OF BITSET);
  6. VAR
  7. i: CARDINAL;
  8. BEGIN
  9. i := 0; WHILE i <= HIGH(s) DO s[i] := BITSET{}; INC(i) END
  10. END Clear;
  11. (* Fill Set all elements in set s
  12. ---------------------------------------------------------------------------*)
  13. PROCEDURE Fill (VAR s: ARRAY OF BITSET);
  14. VAR
  15. i: CARDINAL;
  16. BEGIN
  17. i := 0; WHILE i <= HIGH(s) DO s[i] := BITSET{0 .. size - 1}; INC(i) END
  18. END Fill;
  19. (* Incl Include element x in set s
  20. ---------------------------------------------------------------------------*)
  21. PROCEDURE Incl (VAR s: ARRAY OF BITSET; x: CARDINAL);
  22. BEGIN
  23. INCL(s[x DIV size], x MOD size)
  24. END Incl;
  25. (* Excl
  26. ---------------------------------------------------------------------------*)
  27. PROCEDURE Excl (VAR s: ARRAY OF BITSET; x: CARDINAL);
  28. BEGIN
  29. EXCL(s[x DIV size], x MOD size)
  30. END Excl;
  31. (* In TRUE, if element x is contained in set s
  32. ---------------------------------------------------------------------------*)
  33. PROCEDURE In (VAR s: ARRAY OF BITSET; x: CARDINAL): BOOLEAN;
  34. BEGIN
  35. RETURN x MOD size IN s[x DIV size]
  36. END In;
  37. (* Includes TRUE, if s2 in s1
  38. ---------------------------------------------------------------------------*)
  39. PROCEDURE Includes (VAR s1, s2: ARRAY OF BITSET): BOOLEAN;
  40. VAR
  41. i: CARDINAL;
  42. BEGIN
  43. i := 0;
  44. WHILE i <= HIGH(s1) DO
  45. IF ~ (s2[i] <= s1[i]) THEN RETURN FALSE END;
  46. INC(i)
  47. END;
  48. RETURN TRUE;
  49. END Includes;
  50. (* Elements Return number of elements in set s
  51. ---------------------------------------------------------------------------*)
  52. PROCEDURE Elements (VAR s: ARRAY OF BITSET; VAR lastElem: INTEGER): INTEGER;
  53. VAR
  54. i, n, max: CARDINAL;
  55. BEGIN
  56. i := 0; n := 0; max := (HIGH(s) + 1) * size;
  57. WHILE i < max DO
  58. IF i MOD size IN s[i DIV size] THEN INC(n); lastElem := i END;
  59. INC(i)
  60. END;
  61. RETURN n
  62. END Elements;
  63. (* Empty TRUE, if set s i sempty
  64. ---------------------------------------------------------------------------*)
  65. PROCEDURE Empty (VAR s: ARRAY OF BITSET): BOOLEAN;
  66. VAR
  67. i: CARDINAL;
  68. BEGIN
  69. i := 0;
  70. WHILE i <= HIGH(s) DO
  71. IF s[i] # BITSET{} THEN RETURN FALSE END;
  72. INC(i)
  73. END;
  74. RETURN TRUE
  75. END Empty;
  76. (* Equal TRUE, if set s1 and s2 are equal
  77. ---------------------------------------------------------------------------*)
  78. PROCEDURE Equal (VAR s1, s2: ARRAY OF BITSET): BOOLEAN;
  79. VAR
  80. i: CARDINAL;
  81. BEGIN
  82. i := 0;
  83. WHILE i <= HIGH(s1) DO
  84. IF s1[i] # s2[i] THEN RETURN FALSE END;
  85. INC(i)
  86. END;
  87. RETURN TRUE
  88. END Equal;
  89. (* Different TRUE, if set s1 and s2 are totally different
  90. ---------------------------------------------------------------------------*)
  91. PROCEDURE Different (VAR s1, s2: ARRAY OF BITSET): BOOLEAN;
  92. VAR
  93. i: CARDINAL;
  94. BEGIN
  95. i := 0;
  96. WHILE i <= HIGH(s1) DO
  97. IF s1[i] * s2[i] # BITSET{} THEN RETURN FALSE END;
  98. INC(i)
  99. END;
  100. RETURN TRUE
  101. END Different;
  102. (* Unite s1 := s1 + s2
  103. ---------------------------------------------------------------------------*)
  104. PROCEDURE Unite (VAR s1, s2: ARRAY OF BITSET);
  105. VAR
  106. i: CARDINAL;
  107. BEGIN
  108. i := 0; WHILE i <= HIGH(s1) DO s1[i] := s1[i] + s2[i]; INC(i) END
  109. END Unite;
  110. (* Differ s1 := s1 - s2
  111. ---------------------------------------------------------------------------*)
  112. PROCEDURE Differ (VAR s1, s2: ARRAY OF BITSET);
  113. VAR
  114. i: CARDINAL;
  115. BEGIN
  116. i := 0; WHILE i <= HIGH(s1) DO s1[i] := s1[i] - s2[i]; INC(i) END
  117. END Differ;
  118. (* Intersect s3 := s1 * s2
  119. ---------------------------------------------------------------------------*)
  120. PROCEDURE Intersect (VAR s1, s2, s3: ARRAY OF BITSET);
  121. VAR
  122. i: CARDINAL;
  123. BEGIN
  124. i := 0; WHILE i <= HIGH(s1) DO s3[i] := s1[i] * s2[i]; INC(i) END
  125. END Intersect;
  126. (* Print Print set s
  127. ---------------------------------------------------------------------------*)
  128. PROCEDURE Print (f: FileIO.File; s: ARRAY OF BITSET; w, indent: INTEGER);
  129. VAR
  130. col, i, max: INTEGER;
  131. BEGIN
  132. i := 0; col := indent; max := (HIGH(s) + 1) * size;
  133. FileIO.Write(f, "{");
  134. WHILE i < max DO
  135. IF In(s, i) THEN
  136. IF col + 4 > w THEN
  137. FileIO.WriteLn(f); FileIO.WriteText(f, "", indent); col := indent
  138. END;
  139. FileIO.WriteInt(f, i, 3); FileIO.Write(f, ",");
  140. INC(col, 4)
  141. END;
  142. INC(i)
  143. END;
  144. FileIO.Write(f, "}")
  145. END Print;
  146. END Sets.