[BACK]Return to sets_of_unknowns.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Product

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Product/sets_of_unknowns.adb, Revision 1.1

1.1     ! maekawa     1: with unchecked_deallocation;
        !             2:
        !             3: package body Sets_of_Unknowns is
        !             4:
        !             5: -- REPRESENTATION OF A SET :
        !             6:
        !             7:   type Set_Rep is array (positive range <> ) of boolean;
        !             8:
        !             9:   procedure free is new unchecked_deallocation(Set_Rep,Set);
        !            10:
        !            11: -- CREATORS :
        !            12:
        !            13:   function Create ( n : natural ) return Set is
        !            14:
        !            15:     s : Set := new Set_Rep'(1..n => false);
        !            16:
        !            17:   begin
        !            18:     return s;
        !            19:   end Create;
        !            20:
        !            21:   function Create ( s : Set ) return Set is
        !            22:
        !            23:     s1 : Set;
        !            24:
        !            25:   begin
        !            26:     if s = null
        !            27:      then s1 := s;
        !            28:      else s1 := new Set_Rep'(s.all);
        !            29:     end if;
        !            30:     return s1;
        !            31:   end Create;
        !            32:
        !            33: -- CONSTRUCTORS :
        !            34:
        !            35:   procedure Add ( s : in out Set; i : in natural ) is
        !            36:   begin
        !            37:     s(i) := true;
        !            38:   end Add;
        !            39:
        !            40:   procedure Union ( s1 : in out Set; s2 : in Set ) is
        !            41:   begin
        !            42:     for i in 1..Dimension(s2) loop
        !            43:       if Is_In(s2,i)
        !            44:        then Add(s1,i);
        !            45:       end if;
        !            46:     end loop;
        !            47:   end Union;
        !            48:
        !            49:   function Union ( s1,s2 : Set ) return Set is
        !            50:
        !            51:     s : Set := Create(s1);
        !            52:
        !            53:   begin
        !            54:     Union(s,s2);
        !            55:     return s;
        !            56:   end Union;
        !            57:
        !            58:   procedure Remove ( s : in out Set; i : in natural ) is
        !            59:   begin
        !            60:     s(i) := false;
        !            61:   end Remove;
        !            62:
        !            63:   procedure Difference ( s1 : in out Set; s2 : in Set ) is
        !            64:   begin
        !            65:     for i in 1..Dimension(s2) loop
        !            66:       if Is_In(s2,i)
        !            67:        then Remove(s1,i);
        !            68:       end if;
        !            69:     end loop;
        !            70:   end Difference;
        !            71:
        !            72:   function Difference ( s1,s2 : Set ) return Set is
        !            73:
        !            74:     s : Set := Create(s1);
        !            75:
        !            76:   begin
        !            77:     Difference(s,s2);
        !            78:     return s;
        !            79:   end Difference;
        !            80:
        !            81:   procedure Intersection ( s1 : in out Set; s2 : in Set ) is
        !            82:   begin
        !            83:     for i in 1..Dimension(s1) loop
        !            84:       if Is_In(s1,i) and then not Is_In(s2,i)
        !            85:        then Remove(s1,i);
        !            86:       end if;
        !            87:     end loop;
        !            88:   end Intersection;
        !            89:
        !            90:   function Intersection ( s1,s2 : Set ) return Set is
        !            91:
        !            92:     s : Set := Create(s1);
        !            93:
        !            94:   begin
        !            95:     Intersection(s,s2);
        !            96:     return s;
        !            97:   end Intersection;
        !            98:
        !            99: -- SELECTORS :
        !           100:
        !           101:   function Dimension ( s : Set ) return natural is
        !           102:   begin
        !           103:     if s = null
        !           104:      then return 0;
        !           105:      else return s'last;
        !           106:     end if;
        !           107:   end Dimension;
        !           108:
        !           109:   function Extent_Of ( s : Set ) return natural is
        !           110:
        !           111:     cnt : natural := 0;
        !           112:
        !           113:   begin
        !           114:     for i in 1..Dimension(s) loop
        !           115:       if Is_In(s,i)
        !           116:        then cnt := cnt + 1;
        !           117:       end if;
        !           118:     end loop;
        !           119:     return cnt;
        !           120:   end Extent_Of;
        !           121:
        !           122:   function Is_In ( s : Set; i : natural ) return boolean is
        !           123:   begin
        !           124:     return s(i);
        !           125:   end Is_In;
        !           126:
        !           127:   function Is_Subset ( s1,s2 : Set ) return boolean is
        !           128:   begin
        !           129:     for i in 1..Dimension(s1) loop
        !           130:       if Is_In(s1,i) and then not Is_In(s2,i)
        !           131:        then return false;
        !           132:       end if;
        !           133:     end loop;
        !           134:     return true;
        !           135:   end Is_Subset;
        !           136:
        !           137:   function Is_Equal ( s1,s2 : Set ) return boolean is
        !           138:   begin
        !           139:     return (Is_Subset(s1,s2) and then Is_Subset(s2,s1));
        !           140:   end Is_Equal;
        !           141:
        !           142:   procedure Generate_Subsets ( s : in Set; k : in positive ) is
        !           143:
        !           144:     n : constant natural := Dimension(s);
        !           145:     sub : Set := Create(n);
        !           146:     cont : boolean;
        !           147:
        !           148:     procedure Generate ( level,start : in natural ) is
        !           149:     begin
        !           150:       if level = 0
        !           151:        then Process(sub,cont);
        !           152:        else for i in start..n-level+1 loop
        !           153:               if Is_In(s,i)
        !           154:                then Add(sub,i);
        !           155:                     Generate(level-1,i+1);
        !           156:                     Remove(sub,i);
        !           157:               end if;
        !           158:               exit when not cont;
        !           159:             end loop;
        !           160:       end if;
        !           161:     end Generate;
        !           162:
        !           163:   begin
        !           164:     Generate(k,1);
        !           165:     Clear(sub);
        !           166:   end Generate_Subsets;
        !           167:
        !           168:   procedure Generate_All_Subsets ( s : in Set ) is
        !           169:
        !           170:     n : constant natural := Dimension(s);
        !           171:     sub : Set := Create(n);
        !           172:     cont : boolean;
        !           173:
        !           174:     procedure Generate ( level,start : in natural ) is
        !           175:     begin
        !           176:       if level > 0
        !           177:        then for i in start..n loop
        !           178:               if Is_In(s,i)
        !           179:                then Add(sub,i);
        !           180:                     Process(sub,cont);
        !           181:                     if cont
        !           182:                      then Generate(level-1,i+1);
        !           183:                           Remove(sub,i);
        !           184:                     end if;
        !           185:               end if;
        !           186:               exit when not cont;
        !           187:             end loop;
        !           188:       end if;
        !           189:     end Generate;
        !           190:
        !           191:   begin
        !           192:     Generate(n,1);
        !           193:     Clear(sub);
        !           194:   end Generate_All_Subsets;
        !           195:
        !           196: -- DESTRUCTOR :
        !           197:
        !           198:   procedure Clear ( s : in out Set ) is
        !           199:   begin
        !           200:     free(s);
        !           201:   end Clear;
        !           202:
        !           203: end Sets_of_Unknowns;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>