Unit Software;

INTERFACE

type
  strings = array of string;

function Natural(hereditarily : string) : integer;
function Elements(G : integer) : string;
function T(N : integer) : integer;

IMPLEMENTATION

function parsing(hereditarily : string) : strings;
{
  The Parser
}
var
  S : string;
  L,k,nest,d : integer;
  deel : strings;
begin
  L := Length(hereditarily)-2;
  S := Copy(hereditarily,2,L);
  if Length(S) = 0 then Exit;
  nest := 0;
  SetLength(deel,L);
  d := 0; deel[d] := '';
  for k := 1 to L do
  begin
    if S[k] = '{' then nest := nest+1;
    if S[k] = '}' then nest := nest-1;
    if S[k] = ',' then Continue;
    if S[k] = ' ' then Continue;
    deel[d] := deel[d] + S[k];
  { Separate elements }
    if nest = 0 then
    begin
    { Writeln(deel[d]); }
      d := d+1; deel[d] := '';
    end;
  end;
  Setlength(deel,d);
  parsing := deel;
end;

function Natural(hereditarily : string) : integer;
{
  Recursive calculation
  of set -> natural map
}
var
  L,k,G,vlag : integer;
  deel : strings;
  alarm : boolean;
begin
  natural := 0;
  alarm := false;
  L := Length(hereditarily);
  if L = 2 then Exit; { Empty Set }
  Setlength(deel,0);
  deel := parsing(hereditarily);
{ Recursion }
  G := 0;
  L := Length(deel);
  for k := 0 to L-1 do
  begin
    vlag := natural(deel[k]);
    if vlag > 30 then alarm := true;
    G := G or (1 shl vlag);
  end;
  if alarm then G := -1;
  Natural := G;
end;

function Elements(G : integer) : string;
{
  Make Elements of the Set
  corresponding to Natural
}
var
  H,k : integer;
  S : string;
begin
  Elements := '{}';
  if G = 0 then Exit;
  for k := 0 to 30 do
  begin
    H := G shr k;
    if (H and 1) = 1 then
      S := S + Elements(k);
  end;
  Elements := '{'+ S + '}';
end;

function T(N : integer) : integer;
begin
  T := 1 shl N;
end;

END.

program demo; Uses software; begin Write(Elements(666),' = '); Writeln(Natural('{{{{{}}{}}{}}{{{{}}}{{}}{}}{{{{}}}}{{{}}{}}{{}}}')); Writeln((T(T(T(T(0))+T(0))+T(0)) + T(T(T(T(0)))+T(T(0))+T(0)) + T(T(T(T(0)))) + T(T(T(0))+T(0)) + T(T(0)))); end.