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.