|
FUNCTION substitute (expr : generic_expression, vars : LIST [1:?] OF generic_variable, vals : LIST [1:?] OF maths_value) : generic_expression; LOCAL types : SET OF STRING := stripped_typeof ( expr ) ; opnds : LIST OF generic_expression ; op1 , op2 : generic_expression ; qvars : LIST OF generic_variable ; srcdom : maths_space_or_function ; prpfun : LIST [ 1 : ? ] OF maths_function ; finfun : maths_function_select ; END_LOCAL ; IF SIZEOF ( vars ) <> SIZEOF ( vals ) THEN RETURN ( ? ) ; END_IF ; IF 'generic_literal' IN types THEN RETURN ( expr ) ; END_IF ; IF 'generic_variable' IN types THEN REPEAT i := 1 TO SIZEOF ( vars ) ; IF expr :=: vars [ i ] THEN RETURN ( vals [ i ] ) ; END_IF ; END_REPEAT ; RETURN ( expr ) ; END_IF ; IF 'quantifier_expression' IN types THEN qvars := expr \ quantifier_expression . variables ; REPEAT i := SIZEOF ( vars ) TO 1 BY - 1 ; IF vars [ i ] IN qvars THEN REMOVE ( vars , i ) ; REMOVE ( vals , i ) ; END_IF ; END_REPEAT ; opnds := expr \ multiple_arity_generic_expression . operands ; REPEAT i := 1 TO SIZEOF ( opnds ) ; IF NOT ( opnds [ i ] IN qvars ) THEN expr \ multiple_arity_generic_expression . operands [ i ] := substitute ( opnds [ i ] , vars , vals ) ; END_IF ; END_REPEAT ; RETURN ( expr ) ; END_IF ; IF 'unary_generic_expression' IN types THEN op1 := expr \ unary_generic_expression . operand ; expr \ unary_generic_expression . operand := substitute ( op1 , vars , vals ) ; END_IF ; IF 'binary_generic_expression' IN types THEN op1 := expr \ binary_generic_expression . operands [ 1 ] ; expr \ binary_generic_expression . operands [ 1 ] := substitute ( op1 , vars , vals ) ; op2 := expr \ binary_generic_expression . operands [ 2 ] ; expr \ binary_generic_expression . operands [ 2 ] := substitute ( op2 , vars , vals ) ; END_IF ; IF 'parallel_composed_function' IN types THEN srcdom := expr \ parallel_composed_function . source_of_domain ; prpfun := expr \ parallel_composed_function . prep_functions ; finfun := expr \ parallel_composed_function . final_function ; srcdom := substitute ( srcdom , vars , vals ) ; REPEAT i := 1 TO SIZEOF ( prpfun ) ; prpfun [ i ] := substitute ( prpfun [ i ] , vars , vals ) ; END_REPEAT ; IF 'maths_function' IN stripped_typeof ( finfun ) THEN finfun := substitute ( finfun , vars , vals ) ; END_IF ; RETURN ( make_parallel_composed_function ( srcdom , prpfun , finfun ) ) ; END_IF ; IF 'multiple_arity_generic_expression' IN types THEN opnds := expr \ multiple_arity_generic_expression . operands ; REPEAT i := 1 TO SIZEOF ( opnds ) ; expr \ multiple_arity_generic_expression . operands [ i ] := substitute ( opnds [ i ] , vars , vals ) ; END_REPEAT ; END_IF ; RETURN ( expr ) ; END_FUNCTION; -- substitute |
|
public class FSubstitute public static Value run(SdaiContext _context, Value expr, Value vars, Value vals) |