FUNCTION simplify_maths_space
(spc : maths_space) : maths_space;
LOCAL stypes : SET OF STRING := stripped_typeof (spc); sset : SET OF maths_value; zset : SET OF maths_value := []; zval : maths_value; zspc : maths_space; zallint : BOOLEAN := TRUE; zint, zmin, zmax : INTEGER; factors : LIST OF maths_space; zfactors : LIST OF maths_space := []; rspc : maths_space; END_LOCAL; IF 'FINITE_SPACE' IN stypes THEN sset := spc\finite_space.members; REPEAT i := 1 TO SIZEOF (sset); zval := simplify_maths_value(sset[i]); zset := zset + [zval]; IF zallint AND ('INTEGER' IN TYPEOF (zval)) THEN zint := zval; IF i = 1 THEN zmin := zint; zmax := zint; ELSE IF zint < zmin THEN zmin := zint; END_IF; IF zint > zmax THEN zmax := zint; END_IF; END_IF; ELSE zallint := FALSE; END_IF; END_REPEAT; IF zallint AND (SIZEOF(zset) = zmax-zmin+1) THEN RETURN (make_finite_integer_interval(zmin,zmax)); END_IF; RETURN (make_finite_space(zset)); END_IF; IF 'UNIFORM_PRODUCT_SPACE' IN stypes THEN zspc := simplify_maths_space(spc\uniform_product_space.base); RETURN (make_uniform_product_space(zspc,spc\uniform_product_space.exponent)); END_IF; IF 'LISTED_PRODUCT_SPACE' IN stypes THEN factors := spc\listed_product_space.factors; REPEAT i := 1 TO SIZEOF (factors); INSERT (zfactors, simplify_maths_space(factors[i]), i-1); END_REPEAT; RETURN (make_listed_product_space(zfactors)); END_IF; IF 'EXTENDED_TUPLE_SPACE' IN stypes THEN zspc := simplify_maths_space(spc\extended_tuple_space.base); rspc := simplify_maths_space(spc\extended_tuple_space.extender); RETURN (make_extended_tuple_space(zspc,rspc)); END_IF; IF 'FUNCTION_SPACE' IN stypes THEN zspc := simplify_maths_space(spc\function_space.domain_argument); rspc := simplify_maths_space(spc\function_space.range_argument); RETURN (make_function_space(spc\function_space.domain_constraint,zspc, spc\function_space.range_constraint,rspc)); END_IF; RETURN (spc); END_FUNCTION; -- simplify_maths_space
|