mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 06:22:25 +00:00
209 lines
6 KiB
Modula-2
209 lines
6 KiB
Modula-2
(* Ulm's Oberon Library
|
|
Copyright (C) 1989-1994 by University of Ulm, SAI, D-89069 Ulm, Germany
|
|
----------------------------------------------------------------------------
|
|
Ulm's Oberon Library is free software; you can redistribute it
|
|
and/or modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either version
|
|
2 of the License, or (at your option) any later version.
|
|
|
|
Ulm's Oberon Library is distributed in the hope that it will be
|
|
useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
----------------------------------------------------------------------------
|
|
E-mail contact: oberon@mathematik.uni-ulm.de
|
|
----------------------------------------------------------------------------
|
|
$Id: Sets.om,v 1.3 1999/06/06 06:44:56 borchert Exp $
|
|
----------------------------------------------------------------------------
|
|
$Log: Sets.om,v $
|
|
Revision 1.3 1999/06/06 06:44:56 borchert
|
|
bug fix: CharSet was too small
|
|
|
|
Revision 1.2 1995/03/16 16:25:33 borchert
|
|
assertions of Assertions replaced by real assertions
|
|
|
|
Revision 1.1 1994/02/22 20:10:14 borchert
|
|
Initial revision
|
|
|
|
----------------------------------------------------------------------------
|
|
AFB 9/89
|
|
----------------------------------------------------------------------------
|
|
*)
|
|
|
|
MODULE ulmSets;
|
|
IMPORT Types := ulmTypes;
|
|
|
|
CONST
|
|
setsize* = MAX(Types.Set) + 1;
|
|
|
|
TYPE
|
|
CharSet* = ARRAY (ORD(MAX(CHAR)) + 1) DIV setsize OF Types.Set;
|
|
|
|
PROCEDURE InitSet*(VAR set: ARRAY OF Types.Set);
|
|
VAR i: Types.Int32;
|
|
BEGIN
|
|
i := 0;
|
|
WHILE i < LEN(set) DO
|
|
set[i] := {}; INC(i);
|
|
END;
|
|
END InitSet;
|
|
|
|
PROCEDURE Complement*(VAR set: ARRAY OF Types.Set);
|
|
VAR i: Types.Int32;
|
|
BEGIN
|
|
i := 0;
|
|
WHILE i < LEN(set) DO
|
|
set[i] := - set[i]; INC(i);
|
|
END;
|
|
END Complement;
|
|
|
|
PROCEDURE In*(VAR set: ARRAY OF Types.Set; i: Types.Int32) : BOOLEAN;
|
|
BEGIN
|
|
RETURN (i MOD setsize) IN set[i DIV setsize]
|
|
END In;
|
|
|
|
PROCEDURE Incl*(VAR set: ARRAY OF Types.Set; i: Types.Int32);
|
|
BEGIN
|
|
INCL(set[i DIV setsize], i MOD setsize);
|
|
END Incl;
|
|
|
|
PROCEDURE Excl*(VAR set: ARRAY OF Types.Set; i: Types.Int32);
|
|
BEGIN
|
|
EXCL(set[i DIV setsize], i MOD setsize);
|
|
END Excl;
|
|
|
|
PROCEDURE CharIn*(VAR charset: CharSet; ch: CHAR) : BOOLEAN;
|
|
BEGIN
|
|
RETURN (ORD(ch) MOD setsize) IN charset[ORD(ch) DIV setsize]
|
|
END CharIn;
|
|
|
|
PROCEDURE InclChar*(VAR charset: CharSet; ch: CHAR);
|
|
BEGIN
|
|
INCL(charset[ORD(ch) DIV setsize], ORD(ch) MOD setsize);
|
|
END InclChar;
|
|
|
|
PROCEDURE ExclChar*(VAR charset: CharSet; ch: CHAR);
|
|
BEGIN
|
|
EXCL(charset[ORD(ch) DIV setsize], ORD(ch) MOD setsize);
|
|
END ExclChar;
|
|
|
|
PROCEDURE Intersection*(set1, set2: ARRAY OF Types.Set; VAR result: ARRAY OF Types.Set);
|
|
VAR
|
|
index: Types.Int32;
|
|
BEGIN
|
|
ASSERT((LEN(result) = LEN(set1)) & (LEN(result) = LEN(set2)));
|
|
index := 0;
|
|
WHILE index < LEN(result) DO
|
|
result[index] := set1[index] * set2[index];
|
|
INC(index);
|
|
END;
|
|
END Intersection;
|
|
|
|
PROCEDURE SymDifference*(set1, set2: ARRAY OF Types.Set; VAR result: ARRAY OF Types.Set);
|
|
VAR
|
|
index: Types.Int32;
|
|
BEGIN
|
|
ASSERT((LEN(result) = LEN(set1)) & (LEN(result) = LEN(set2)));
|
|
index := 0;
|
|
WHILE index < LEN(result) DO
|
|
result[index] := set1[index] / set2[index];
|
|
INC(index);
|
|
END;
|
|
END SymDifference;
|
|
|
|
PROCEDURE Union*(set1, set2: ARRAY OF Types.Set; VAR result: ARRAY OF Types.Set);
|
|
VAR
|
|
index: Types.Int32;
|
|
BEGIN
|
|
ASSERT((LEN(result) = LEN(set1)) & (LEN(result) = LEN(set2)));
|
|
index := 0;
|
|
WHILE index < LEN(result) DO
|
|
result[index] := set1[index] + set2[index];
|
|
INC(index);
|
|
END;
|
|
END Union;
|
|
|
|
PROCEDURE Difference*(set1, set2: ARRAY OF Types.Set; VAR result: ARRAY OF Types.Set);
|
|
VAR
|
|
index: Types.Int32;
|
|
BEGIN
|
|
ASSERT((LEN(result) = LEN(set1)) & (LEN(result) = LEN(set2)));
|
|
index := 0;
|
|
WHILE index < LEN(result) DO
|
|
result[index] := set1[index] - set2[index];
|
|
INC(index);
|
|
END;
|
|
END Difference;
|
|
|
|
PROCEDURE Equal*(set1, set2: ARRAY OF Types.Set) : BOOLEAN;
|
|
VAR
|
|
index: Types.Int32;
|
|
BEGIN
|
|
index := 0;
|
|
WHILE (index < LEN(set1)) & (index < LEN(set2)) DO
|
|
IF set1[index] # set2[index] THEN
|
|
RETURN FALSE
|
|
END;
|
|
INC(index);
|
|
END;
|
|
WHILE index < LEN(set1) DO
|
|
IF set1[index] # {} THEN
|
|
RETURN FALSE
|
|
END;
|
|
INC(index);
|
|
END;
|
|
WHILE index < LEN(set2) DO
|
|
IF set2[index] # {} THEN
|
|
RETURN FALSE
|
|
END;
|
|
INC(index);
|
|
END;
|
|
RETURN TRUE
|
|
END Equal;
|
|
|
|
PROCEDURE Subset*(set1, set2: ARRAY OF Types.Set) : BOOLEAN;
|
|
VAR
|
|
index: Types.Int32;
|
|
BEGIN
|
|
index := 0;
|
|
WHILE (index < LEN(set1)) & (index < LEN(set2)) DO
|
|
IF set1[index] - set2[index] # {} THEN
|
|
RETURN FALSE
|
|
END;
|
|
INC(index);
|
|
END;
|
|
WHILE index < LEN(set1) DO
|
|
IF set1[index] # {} THEN
|
|
RETURN FALSE
|
|
END;
|
|
INC(index);
|
|
END;
|
|
RETURN TRUE
|
|
END Subset;
|
|
|
|
PROCEDURE Card*(set: ARRAY OF Types.Set) : Types.Int32;
|
|
VAR
|
|
index: Types.Int32;
|
|
i: Types.Int32;
|
|
card: Types.Int32;
|
|
BEGIN
|
|
card := 0;
|
|
index := 0;
|
|
WHILE index < LEN(set) DO
|
|
i := 0;
|
|
WHILE i <= MAX(Types.Set) DO
|
|
IF i IN set[index] THEN
|
|
INC(card);
|
|
END;
|
|
INC(i);
|
|
END;
|
|
INC(index);
|
|
END;
|
|
RETURN card
|
|
END Card;
|
|
|
|
END ulmSets.
|