[Oberon] OBNC Sets incorrect output
Joe Turner
medianjoe at mailfence.com
Sun Mar 20 19:02:21 CET 2022
Diego,
Many thanks! That's saved me some work. :-).
Joe
March 20, 2022 5:58:11 PM CET Diego Sardina <dsar at eml.cc> wrote:On Sun, Mar 20, 2022, at 4:44 PM, Joe Turner wrote:
>
> [...] Anyway, I'll look around for a library, or I guess it wouldn't be too
hard to write one myself using an array of boolean.
>
Or an array of SET ;-)
MODULE Sets;
IMPORT SYSTEM;
CONST size = SYSTEM.SIZE(SET) * 8;
PROCEDURE Clear* (VAR s: ARRAY OF SET);
VAR i: INTEGER;
BEGIN
FOR i := 0 TO LEN(s)-1 DO s[i] := {} END
END Clear;
PROCEDURE Fill* (VAR s: ARRAY OF SET);
VAR i: INTEGER;
BEGIN
FOR i := 0 TO LEN(s)-1 DO s[i] := {0 .. size-1} END
END Fill;
PROCEDURE Include* (VAR s: ARRAY OF SET; x: INTEGER);
BEGIN
(* ASSERT(x DIV size < LEN(s)); *)
INCL(s[x DIV size], x MOD size)
END Include;
PROCEDURE Exclude* (VAR s: ARRAY OF SET; x: INTEGER);
BEGIN
(* ASSERT(x DIV size < LEN(s)); *)
EXCL(s[x DIV size], x MOD size)
END Exclude;
PROCEDURE In* (s: ARRAY OF SET; x: INTEGER): BOOLEAN;
BEGIN
(* ASSERT(x DIV size < LEN(s)); *)
RETURN x MOD size IN s[x DIV size]
END In;
PROCEDURE Subset* (s1, s2: ARRAY OF SET): BOOLEAN;
VAR i: INTEGER;
BEGIN
(* ASSERT(LEN(s1) <= LEN(s2)); *)
i := 0;
WHILE (i < LEN(s1)) & (s1[i] + s2[i] = s1[i]) DO INC(i) END;
RETURN i = LEN(s1)
END Subset;
PROCEDURE Count* (s: ARRAY OF SET): INTEGER;
VAR i, n: INTEGER;
BEGIN
n := 0;
FOR i := 0 TO (LEN(s)*size)-1 DO
IF (i MOD size) IN s[i DIV size] THEN INC(n) END
END;
RETURN n
END Count;
PROCEDURE Empty* (s: ARRAY OF SET): BOOLEAN;
VAR i: INTEGER;
BEGIN
i := 0;
WHILE (i < LEN(s)) & (s[i] = {}) DO INC(i) END;
RETURN i = LEN(s)
END Empty;
PROCEDURE Same* (s1, s2: ARRAY OF SET): BOOLEAN;
VAR i: INTEGER;
BEGIN
(* ASSERT(LEN(s1) = LEN(s2)); *)
i := 0;
WHILE (i < LEN(s1)) & (s1[i] = s2[i]) DO INC(i) END;
RETURN i = LEN(s1)
END Same;
PROCEDURE Distinct* (s1, s2: ARRAY OF SET): BOOLEAN;
VAR i: INTEGER;
BEGIN
(* ASSERT(LEN(s1) = LEN(s2)); *)
i := 0;
WHILE (i < LEN(s1)) & (s1[i] * s2[i] = {}) DO INC(i) END;
RETURN i = LEN(s1)
END Distinct;
PROCEDURE Union* (VAR s1, s2: ARRAY OF SET);
VAR i: INTEGER;
BEGIN
FOR i := 0 TO LEN(s1)-1 DO s1[i] := s1[i] + s2[i] END
END Union;
PROCEDURE Difference* (VAR s1, s2: ARRAY OF SET);
VAR i: INTEGER;
BEGIN
FOR i := 0 TO LEN(s1) DO s1[i] := s1[i] - s2[i] END
END Difference;
PROCEDURE Intersection* (VAR s1, s2, s3: ARRAY OF SET);
VAR i: INTEGER;
BEGIN
FOR i := 0 TO LEN(s1) DO s3[i] := s1[i] * s2[i] END
END Intersection;
END Sets.
--
Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
https://lists.inf.ethz.ch/mailman/listinfo/oberon
-- Sent with https://mailfence.com Secure and private email
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.inf.ethz.ch/pipermail/oberon/attachments/20220320/968da20a/attachment.html>
More information about the Oberon
mailing list