set=cluster [t:type] is create, insert, delete, is_in, size, elements, equal, similar where t has equal:proctype (t,t) returns (bool) rep=array[t] create=proc() returns (cvt) return (rep$new()) end create insert=proc(s:cvt,i:t) if ~is_in(up(s),i) then rep$addh(s,i) end end insert delete=proc(s:cvt,i:t) for j:int in rep$indexes(s) do if i=s[j] then s[j]:=rep$top(s) rep$remh(s) return end end end delete is_in=proc(s:cvt,i:t) returns (bool) for j:t in rep$elements(s) do if i=j then return (true) end end end is_in size=proc(s:cvt) returns (int) return (rep$size(s)) end size elements=iter(s:cvt) yields (t) for i:t in rep$elements(s) do yield(i) end end elements equal=proc(s1,s2:cvt) returns (bool) return (s1=s2) end equal similar=proc(s1,s2:set[t]) returns (bool) if size(s1)~=size(s2) then return(false) end for i:t in elements(s1) do if ~is_in(s2,i) then return (false) end end return (true) end similar end set