Require Import String List Coq.FSets.FMapList Coq.Structures.OrderedTypeEx. Module Import F := FMapList.Make(Nat_as_OT). Inductive named_node_data : Set := | Named_Node : nat (* reference *) -> named_node_data with named_node : Set := | NN_Library : library -> named_node | NN_Class : class -> named_node | NN_Member : member -> named_node with reference : Set := | Reference : named_node (* node *) -> reference with library : Set := | Library : named_node_data -> string (* name *) -> library_dependency_list (* dependencies *) -> reference_list (* additionalExports *) -> class_list (* classes *) -> procedure_list (* procedures *) -> field_list (* fields *) -> library with library_dependency : Set := | Library_Dependency : nat (* importedLibraryReference *) -> string (* name *) -> combinator_list (* combinators *) -> library_dependency with combinator : Set := | Combinator : bool (* isShow *) -> list string (* names *) -> combinator with class : Set := | Class : named_node_data -> string (* name *) -> bool (* isAbstract *) -> type_parameter_list (* typeParameters *) -> supertype_option (* supertype *) -> supertype_option (* mixedInType *) -> supertype_list (* implementedTypes *) -> field_list (* fields *) -> constructor_list (* constructors *) -> procedure_list (* procedures *) -> interface_type (* _rawType *) -> interface_type (* _thisType *) -> interface_type (* _bottomType *) -> class with member_data : Set := | Member : named_node_data -> name (* name *) -> member_data with member : Set := | M_Field : field -> member | M_Constructor : constructor -> member | M_Procedure : procedure -> member with field : Set := | Field : member_data -> named_node_data -> dart_type (* type *) -> expression_option (* initializer *) -> field with constructor : Set := | Constructor : member_data -> named_node_data -> function_node (* function *) -> initializer_list (* initializers *) -> constructor with procedure : Set := | Procedure : member_data -> named_node_data -> procedure_kind (* kind *) -> function_node (* function *) -> procedure with procedure_kind : Set := Method | Getter | Setter | Operator | Factory with initializer : Set := | I_Field_Initializer : field_initializer -> initializer | I_Super_Initializer : super_initializer -> initializer | I_Redirecting_Initializer : redirecting_initializer -> initializer | I_Local_Initializer : local_initializer -> initializer with field_initializer : Set := | Field_Initializer : nat (* fieldReference *) -> expression (* value *) -> field_initializer with super_initializer : Set := | Super_Initializer : nat (* targetReference *) -> arguments (* arguments *) -> super_initializer with redirecting_initializer : Set := | Redirecting_Initializer : nat (* targetReference *) -> arguments (* arguments *) -> redirecting_initializer with local_initializer : Set := | Local_Initializer : nat (* variable *) -> local_initializer with function_node : Set := | Function_Node : async_marker (* asyncMarker *) -> type_parameter_list (* typeParameters *) -> nat (* requiredParameterCount *) -> variable_declaration_list (* positionalParameters *) -> variable_declaration_list (* namedParameters *) -> dart_type (* returnType *) -> statement (* body *) -> function_node with async_marker : Set := Sync | Sync_Star | Async | Async_Star | Sync_Yielding with expression : Set := | E_Variable_Get : variable_get -> expression | E_Variable_Set : variable_set -> expression | E_Property_Get : property_get -> expression | E_Property_Set : property_set -> expression | E_Direct_Property_Get : direct_property_get -> expression | E_Direct_Property_Set : direct_property_set -> expression | E_Super_Property_Get : super_property_get -> expression | E_Super_Property_Set : super_property_set -> expression | E_Static_Get : static_get -> expression | E_Static_Set : static_set -> expression | E_Invocation_Expression : invocation_expression -> expression | E_Not : not -> expression | E_Logical_Expression : logical_expression -> expression | E_Conditional_Expression : conditional_expression -> expression | E_Is_Expression : is_expression -> expression | E_As_Expression : as_expression -> expression | E_Basic_Literal : basic_literal -> expression | E_Type_Literal : type_literal -> expression | E_This_Expression : this_expression -> expression | E_Rethrow : rethrow -> expression | E_Throw : throw -> expression | E_Function_Expression : function_expression -> expression | E_Let : dart_let -> expression | E_Vector_Creation : vector_creation -> expression | E_Vector_Get : vector_get -> expression | E_Vector_Set : vector_set -> expression | E_Vector_Copy : vector_copy -> expression | E_Closure_Creation : closure_creation -> expression with variable_get : Set := | Variable_Get : nat (* variable *) -> dart_type_option (* promotedType *) -> variable_get with variable_set : Set := | Variable_Set : nat (* variable *) -> expression (* value *) -> variable_set with property_get : Set := | Property_Get : expression (* receiver *) -> name (* name *) -> property_get with property_set : Set := | Property_Set : expression (* receiver *) -> name (* name *) -> expression (* value *) -> property_set with direct_property_get : Set := | Direct_Property_Get : expression (* receiver *) -> nat (* targetReference *) -> direct_property_get with direct_property_set : Set := | Direct_Property_Set : expression (* receiver *) -> nat (* targetReference *) -> expression (* value *) -> direct_property_set with direct_method_invocation : Set := | Direct_Method_Invocation : expression (* receiver *) -> nat (* targetReference *) -> arguments (* arguments *) -> direct_method_invocation with super_property_get : Set := | Super_Property_Get : name (* name *) -> super_property_get with super_property_set : Set := | Super_Property_Set : name (* name *) -> expression (* value *) -> super_property_set with static_get : Set := | Static_Get : nat (* targetReference *) -> static_get with static_set : Set := | Static_Set : nat (* targetReference *) -> expression (* value *) -> static_set with arguments : Set := | Arguments : dart_type_list (* types *) -> expression_list (* positional *) -> named_expression_list (* named *) -> arguments with named_expression : Set := | Named_Expression : string (* name *) -> expression (* value *) -> named_expression with invocation_expression : Set := | IE_Direct_Method_Invocation : direct_method_invocation -> invocation_expression | IE_Method_Invocation : method_invocation -> invocation_expression | IE_Super_Method_Invocation : super_method_invocation -> invocation_expression | IE_Static_Invocation : static_invocation -> invocation_expression | IE_Constructor_Invocation : constructor_invocation -> invocation_expression with method_invocation : Set := | Method_Invocation : expression (* receiver *) -> name (* name *) -> arguments (* arguments *) -> method_invocation with super_method_invocation : Set := | Super_Method_Invocation : name (* name *) -> arguments (* arguments *) -> super_method_invocation with static_invocation : Set := | Static_Invocation : nat (* targetReference *) -> arguments (* arguments *) -> bool (* isConst *) -> static_invocation with constructor_invocation : Set := | Constructor_Invocation : nat (* targetReference *) -> arguments (* arguments *) -> bool (* isConst *) -> constructor_invocation with not : Set := | Not : expression (* operand *) -> not with logical_expression : Set := | Logical_Expression : expression (* left *) -> string (* operator *) -> expression (* right *) -> logical_expression with conditional_expression : Set := | Conditional_Expression : expression (* condition *) -> expression (* then *) -> expression (* otherwise *) -> dart_type (* staticType *) -> conditional_expression with is_expression : Set := | Is_Expression : expression (* operand *) -> dart_type (* type *) -> is_expression with as_expression : Set := | As_Expression : expression (* operand *) -> dart_type (* type *) -> as_expression with basic_literal : Set := | BL_Bool_Literal : bool_literal -> basic_literal | BL_Null_Literal : null_literal -> basic_literal with bool_literal : Set := | Bool_Literal : bool (* value *) -> bool_literal with null_literal : Set := | Null_Literal : null_literal with type_literal : Set := | Type_Literal : dart_type (* type *) -> type_literal with this_expression : Set := | This_Expression : this_expression with rethrow : Set := | Rethrow : rethrow with throw : Set := | Throw : expression (* expression *) -> throw with function_expression : Set := | Function_Expression : function_node (* function *) -> function_expression with dart_let : Set := | Let : nat (* variable *) -> expression (* body *) -> dart_let with vector_creation : Set := | Vector_Creation : nat (* length *) -> vector_creation with vector_get : Set := | Vector_Get : expression (* vectorExpression *) -> nat (* index *) -> vector_get with vector_set : Set := | Vector_Set : expression (* vectorExpression *) -> nat (* index *) -> expression (* value *) -> vector_set with vector_copy : Set := | Vector_Copy : expression (* vectorExpression *) -> vector_copy with closure_creation : Set := | Closure_Creation : nat (* topLevelFunctionReference *) -> expression (* contextVector *) -> function_type (* functionType *) -> dart_type_list (* typeArguments *) -> closure_creation with statement : Set := | S_Expression_Statement : expression_statement -> statement | S_Block : block -> statement | S_Empty_Statement : empty_statement -> statement | S_Labeled_Statement : labeled_statement -> statement | S_Break_Statement : break_statement -> statement | S_While_Statement : while_statement -> statement | S_Do_Statement : do_statement -> statement | S_For_Statement : for_statement -> statement | S_If_Statement : if_statement -> statement | S_Return_Statement : return_statement -> statement | S_Try_Catch : try_catch -> statement | S_Try_Finally : try_finally -> statement | S_Variable_Declaration : variable_declaration -> statement | S_Function_Declaration : function_declaration -> statement with expression_statement : Set := | Expression_Statement : expression (* expression *) -> expression_statement with block : Set := | Block : statement_list (* statements *) -> block with empty_statement : Set := | Empty_Statement : empty_statement with labeled_statement : Set := | Labeled_Statement : statement (* body *) -> labeled_statement with break_statement : Set := | Break_Statement : nat (* target *) -> break_statement with while_statement : Set := | While_Statement : expression (* condition *) -> statement (* body *) -> while_statement with do_statement : Set := | Do_Statement : statement (* body *) -> expression (* condition *) -> do_statement with for_statement : Set := | For_Statement : variable_declaration_list (* variables *) -> expression (* condition *) -> expression_list (* updates *) -> statement (* body *) -> for_statement with if_statement : Set := | If_Statement : expression (* condition *) -> statement (* then *) -> statement (* otherwise *) -> if_statement with return_statement : Set := | Return_Statement : expression (* expression *) -> return_statement with try_catch : Set := | Try_Catch : statement (* body *) -> catch_list (* catches *) -> try_catch with catch : Set := | Catch : dart_type (* guard *) -> nat (* exception *) -> statement (* body *) -> catch with try_finally : Set := | Try_Finally : statement (* body *) -> statement (* finalizer *) -> try_finally with variable_declaration : Set := | Variable_Declaration : string (* name *) -> dart_type (* type *) -> expression_option (* initializer *) -> variable_declaration with function_declaration : Set := | Function_Declaration : nat (* variable *) -> function_node (* function *) -> function_declaration with name_data : Set := | Name : string (* name *) -> name_data with name : Set := | N__Private_Name : _private_name -> name | N__Public_Name : _public_name -> name with _private_name : Set := | _Private_Name : name_data -> nat (* libraryName *) -> _private_name with _public_name : Set := | _Public_Name : name_data -> _public_name with dart_type : Set := | DT_Dynamic_Type : dynamic_type -> dart_type | DT_Void_Type : void_type -> dart_type | DT_Bottom_Type : bottom_type -> dart_type | DT_Interface_Type : interface_type -> dart_type | DT_Vector_Type : vector_type -> dart_type | DT_Function_Type : function_type -> dart_type | DT_Type_Parameter_Type : type_parameter_type -> dart_type with dynamic_type : Set := | Dynamic_Type : dynamic_type with void_type : Set := | Void_Type : void_type with bottom_type : Set := | Bottom_Type : bottom_type with interface_type : Set := | Interface_Type : nat (* className *) -> dart_type_list (* typeArguments *) -> interface_type with vector_type : Set := | Vector_Type : vector_type with function_type : Set := | Function_Type : type_parameter_list (* typeParameters *) -> dart_type_list (* positionalParameters *) -> named_type_list (* namedParameters *) -> dart_type (* returnType *) -> function_type with named_type : Set := | Named_Type : string (* name *) -> dart_type (* type *) -> named_type with type_parameter_type : Set := | Type_Parameter_Type : nat (* parameter *) -> dart_type_option (* promotedBound *) -> type_parameter_type with type_parameter : Set := | Type_Parameter : string (* name *) -> dart_type (* bound *) -> type_parameter with supertype : Set := | Supertype : nat (* className *) -> dart_type_list (* typeArguments *) -> supertype with program : Set := | Program : library_list (* libraries *) -> nat (* mainMethodName *) -> program with reference_list : Set := | reference_nil : reference_list | reference_cons : nat -> reference_list -> reference_list with library_list : Set := | library_nil : library_list | library_cons : library -> library_list -> library_list with library_dependency_list : Set := | library_dependency_nil : library_dependency_list | library_dependency_cons : library_dependency -> library_dependency_list -> library_dependency_list with combinator_list : Set := | combinator_nil : combinator_list | combinator_cons : combinator -> combinator_list -> combinator_list with class_list : Set := | class_nil : class_list | class_cons : class -> class_list -> class_list with field_list : Set := | field_nil : field_list | field_cons : field -> field_list -> field_list with constructor_list : Set := | constructor_nil : constructor_list | constructor_cons : constructor -> constructor_list -> constructor_list with procedure_list : Set := | procedure_nil : procedure_list | procedure_cons : procedure -> procedure_list -> procedure_list with procedure_kind_list : Set := | procedure_kind_nil : procedure_kind_list | procedure_kind_cons : procedure_kind -> procedure_kind_list -> procedure_kind_list with initializer_list : Set := | initializer_nil : initializer_list | initializer_cons : initializer -> initializer_list -> initializer_list with async_marker_list : Set := | async_marker_nil : async_marker_list | async_marker_cons : async_marker -> async_marker_list -> async_marker_list with expression_list : Set := | expression_nil : expression_list | expression_cons : expression -> expression_list -> expression_list with expression_option : Set := | expression_none : expression_option | expression_some : expression -> expression_option with named_expression_list : Set := | named_expression_nil : named_expression_list | named_expression_cons : named_expression -> named_expression_list -> named_expression_list with statement_list : Set := | statement_nil : statement_list | statement_cons : statement -> statement_list -> statement_list with catch_list : Set := | catch_nil : catch_list | catch_cons : catch -> catch_list -> catch_list with variable_declaration_list : Set := | variable_declaration_nil : variable_declaration_list | variable_declaration_cons : nat -> variable_declaration_list -> variable_declaration_list with dart_type_list : Set := | dart_type_nil : dart_type_list | dart_type_cons : dart_type -> dart_type_list -> dart_type_list with dart_type_option : Set := | dart_type_none : dart_type_option | dart_type_some : dart_type -> dart_type_option with named_type_list : Set := | named_type_nil : named_type_list | named_type_cons : named_type -> named_type_list -> named_type_list with type_parameter_list : Set := | type_parameter_nil : type_parameter_list | type_parameter_cons : nat -> type_parameter_list -> type_parameter_list with supertype_list : Set := | supertype_nil : supertype_list | supertype_cons : supertype -> supertype_list -> supertype_list with supertype_option : Set := | supertype_none : supertype_option | supertype_some : supertype -> supertype_option . Record ast_store : Type := Ast_Store { r_refs : F.t reference; ls_refs : F.t labeled_statement; vd_refs : F.t variable_declaration; tp_refs : F.t type_parameter; }. Fixpoint named_node_validity (ast : ast_store) (T : named_node) {struct T} : Prop := match T with | NN_Library ST => library_validity ast ST | NN_Class ST => class_validity ast ST | NN_Member ST => member_validity ast ST end with named_node_data_validity (ast : ast_store) (T : named_node_data) {struct T}: Prop := match T with | Named_Node f0 => F.In f0 (r_refs ast) end with reference_validity (ast : ast_store) (T : reference) {struct T} : Prop := match T with | Reference f0 => named_node_validity ast f0 end with library_validity (ast : ast_store) (T : library) {struct T} : Prop := match T with | Library f0 _ f1 f2 f3 f4 f5 => named_node_data_validity ast f0 /\ library_dependency_list_validity ast f1 /\ reference_list_validity ast f2 /\ class_list_validity ast f3 /\ procedure_list_validity ast f4 /\ field_list_validity ast f5 end with library_dependency_validity (ast : ast_store) (T : library_dependency) {struct T} : Prop := match T with | Library_Dependency f0 _ f1 => F.In f0 (r_refs ast) /\ combinator_list_validity ast f1 end with combinator_validity (ast : ast_store) (T : combinator) {struct T} : Prop := match T with | Combinator _ _ => True end with class_validity (ast : ast_store) (T : class) {struct T} : Prop := match T with | Class f0 _ _ f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 => named_node_data_validity ast f0 /\ type_parameter_list_validity ast f1 /\ supertype_option_validity ast f2 /\ supertype_option_validity ast f3 /\ supertype_list_validity ast f4 /\ field_list_validity ast f5 /\ constructor_list_validity ast f6 /\ procedure_list_validity ast f7 /\ interface_type_validity ast f8 /\ interface_type_validity ast f9 /\ interface_type_validity ast f10 end with member_validity (ast : ast_store) (T : member) {struct T} : Prop := match T with | M_Field ST => field_validity ast ST | M_Constructor ST => constructor_validity ast ST | M_Procedure ST => procedure_validity ast ST end with member_data_validity (ast : ast_store) (T : member_data) {struct T}: Prop := match T with | Member f0 f1 => named_node_data_validity ast f0 /\ name_validity ast f1 end with field_validity (ast : ast_store) (T : field) {struct T} : Prop := match T with | Field f0 f1 f2 f3 => member_data_validity ast f0 /\ named_node_data_validity ast f1 /\ dart_type_validity ast f2 /\ expression_option_validity ast f3 end with constructor_validity (ast : ast_store) (T : constructor) {struct T} : Prop := match T with | Constructor f0 f1 f2 f3 => member_data_validity ast f0 /\ named_node_data_validity ast f1 /\ function_node_validity ast f2 /\ initializer_list_validity ast f3 end with procedure_validity (ast : ast_store) (T : procedure) {struct T} : Prop := match T with | Procedure f0 f1 f2 f3 => member_data_validity ast f0 /\ named_node_data_validity ast f1 /\ procedure_kind_validity ast f2 /\ function_node_validity ast f3 end with procedure_kind_validity (ast : ast_store) (T : procedure_kind) {struct T} : Prop := True with initializer_validity (ast : ast_store) (T : initializer) {struct T} : Prop := match T with | I_Field_Initializer ST => field_initializer_validity ast ST | I_Super_Initializer ST => super_initializer_validity ast ST | I_Redirecting_Initializer ST => redirecting_initializer_validity ast ST | I_Local_Initializer ST => local_initializer_validity ast ST end with field_initializer_validity (ast : ast_store) (T : field_initializer) {struct T} : Prop := match T with | Field_Initializer f0 f1 => F.In f0 (r_refs ast) /\ expression_validity ast f1 end with super_initializer_validity (ast : ast_store) (T : super_initializer) {struct T} : Prop := match T with | Super_Initializer f0 f1 => F.In f0 (r_refs ast) /\ arguments_validity ast f1 end with redirecting_initializer_validity (ast : ast_store) (T : redirecting_initializer) {struct T} : Prop := match T with | Redirecting_Initializer f0 f1 => F.In f0 (r_refs ast) /\ arguments_validity ast f1 end with local_initializer_validity (ast : ast_store) (T : local_initializer) {struct T} : Prop := match T with | Local_Initializer f0 => F.In f0 (vd_refs ast) end with function_node_validity (ast : ast_store) (T : function_node) {struct T} : Prop := match T with | Function_Node f0 f1 _ f2 f3 f4 f5 => async_marker_validity ast f0 /\ type_parameter_list_validity ast f1 /\ variable_declaration_list_validity ast f2 /\ variable_declaration_list_validity ast f3 /\ dart_type_validity ast f4 /\ statement_validity ast f5 end with async_marker_validity (ast : ast_store) (T : async_marker) {struct T} : Prop := True with expression_validity (ast : ast_store) (T : expression) {struct T} : Prop := match T with | E_Variable_Get ST => variable_get_validity ast ST | E_Variable_Set ST => variable_set_validity ast ST | E_Property_Get ST => property_get_validity ast ST | E_Property_Set ST => property_set_validity ast ST | E_Direct_Property_Get ST => direct_property_get_validity ast ST | E_Direct_Property_Set ST => direct_property_set_validity ast ST | E_Super_Property_Get ST => super_property_get_validity ast ST | E_Super_Property_Set ST => super_property_set_validity ast ST | E_Static_Get ST => static_get_validity ast ST | E_Static_Set ST => static_set_validity ast ST | E_Invocation_Expression ST => invocation_expression_validity ast ST | E_Not ST => not_validity ast ST | E_Logical_Expression ST => logical_expression_validity ast ST | E_Conditional_Expression ST => conditional_expression_validity ast ST | E_Is_Expression ST => is_expression_validity ast ST | E_As_Expression ST => as_expression_validity ast ST | E_Basic_Literal ST => basic_literal_validity ast ST | E_Type_Literal ST => type_literal_validity ast ST | E_This_Expression ST => this_expression_validity ast ST | E_Rethrow ST => rethrow_validity ast ST | E_Throw ST => throw_validity ast ST | E_Function_Expression ST => function_expression_validity ast ST | E_Let ST => dart_let_validity ast ST | E_Vector_Creation ST => vector_creation_validity ast ST | E_Vector_Get ST => vector_get_validity ast ST | E_Vector_Set ST => vector_set_validity ast ST | E_Vector_Copy ST => vector_copy_validity ast ST | E_Closure_Creation ST => closure_creation_validity ast ST end with variable_get_validity (ast : ast_store) (T : variable_get) {struct T} : Prop := match T with | Variable_Get f0 f1 => F.In f0 (vd_refs ast) /\ dart_type_option_validity ast f1 end with variable_set_validity (ast : ast_store) (T : variable_set) {struct T} : Prop := match T with | Variable_Set f0 f1 => F.In f0 (vd_refs ast) /\ expression_validity ast f1 end with property_get_validity (ast : ast_store) (T : property_get) {struct T} : Prop := match T with | Property_Get f0 f1 => expression_validity ast f0 /\ name_validity ast f1 end with property_set_validity (ast : ast_store) (T : property_set) {struct T} : Prop := match T with | Property_Set f0 f1 f2 => expression_validity ast f0 /\ name_validity ast f1 /\ expression_validity ast f2 end with direct_property_get_validity (ast : ast_store) (T : direct_property_get) {struct T} : Prop := match T with | Direct_Property_Get f0 f1 => expression_validity ast f0 /\ F.In f1 (r_refs ast) end with direct_property_set_validity (ast : ast_store) (T : direct_property_set) {struct T} : Prop := match T with | Direct_Property_Set f0 f1 f2 => expression_validity ast f0 /\ F.In f1 (r_refs ast) /\ expression_validity ast f2 end with direct_method_invocation_validity (ast : ast_store) (T : direct_method_invocation) {struct T} : Prop := match T with | Direct_Method_Invocation f0 f1 f2 => expression_validity ast f0 /\ F.In f1 (r_refs ast) /\ arguments_validity ast f2 end with super_property_get_validity (ast : ast_store) (T : super_property_get) {struct T} : Prop := match T with | Super_Property_Get f0 => name_validity ast f0 end with super_property_set_validity (ast : ast_store) (T : super_property_set) {struct T} : Prop := match T with | Super_Property_Set f0 f1 => name_validity ast f0 /\ expression_validity ast f1 end with static_get_validity (ast : ast_store) (T : static_get) {struct T} : Prop := match T with | Static_Get f0 => F.In f0 (r_refs ast) end with static_set_validity (ast : ast_store) (T : static_set) {struct T} : Prop := match T with | Static_Set f0 f1 => F.In f0 (r_refs ast) /\ expression_validity ast f1 end with arguments_validity (ast : ast_store) (T : arguments) {struct T} : Prop := match T with | Arguments f0 f1 f2 => dart_type_list_validity ast f0 /\ expression_list_validity ast f1 /\ named_expression_list_validity ast f2 end with named_expression_validity (ast : ast_store) (T : named_expression) {struct T} : Prop := match T with | Named_Expression _ f0 => expression_validity ast f0 end with invocation_expression_validity (ast : ast_store) (T : invocation_expression) {struct T} : Prop := match T with | IE_Direct_Method_Invocation ST => direct_method_invocation_validity ast ST | IE_Method_Invocation ST => method_invocation_validity ast ST | IE_Super_Method_Invocation ST => super_method_invocation_validity ast ST | IE_Static_Invocation ST => static_invocation_validity ast ST | IE_Constructor_Invocation ST => constructor_invocation_validity ast ST end with method_invocation_validity (ast : ast_store) (T : method_invocation) {struct T} : Prop := match T with | Method_Invocation f0 f1 f2 => expression_validity ast f0 /\ name_validity ast f1 /\ arguments_validity ast f2 end with super_method_invocation_validity (ast : ast_store) (T : super_method_invocation) {struct T} : Prop := match T with | Super_Method_Invocation f0 f1 => name_validity ast f0 /\ arguments_validity ast f1 end with static_invocation_validity (ast : ast_store) (T : static_invocation) {struct T} : Prop := match T with | Static_Invocation f0 f1 _ => F.In f0 (r_refs ast) /\ arguments_validity ast f1 end with constructor_invocation_validity (ast : ast_store) (T : constructor_invocation) {struct T} : Prop := match T with | Constructor_Invocation f0 f1 _ => F.In f0 (r_refs ast) /\ arguments_validity ast f1 end with not_validity (ast : ast_store) (T : not) {struct T} : Prop := match T with | Not f0 => expression_validity ast f0 end with logical_expression_validity (ast : ast_store) (T : logical_expression) {struct T} : Prop := match T with | Logical_Expression f0 _ f1 => expression_validity ast f0 /\ expression_validity ast f1 end with conditional_expression_validity (ast : ast_store) (T : conditional_expression) {struct T} : Prop := match T with | Conditional_Expression f0 f1 f2 f3 => expression_validity ast f0 /\ expression_validity ast f1 /\ expression_validity ast f2 /\ dart_type_validity ast f3 end with is_expression_validity (ast : ast_store) (T : is_expression) {struct T} : Prop := match T with | Is_Expression f0 f1 => expression_validity ast f0 /\ dart_type_validity ast f1 end with as_expression_validity (ast : ast_store) (T : as_expression) {struct T} : Prop := match T with | As_Expression f0 f1 => expression_validity ast f0 /\ dart_type_validity ast f1 end with basic_literal_validity (ast : ast_store) (T : basic_literal) {struct T} : Prop := match T with | BL_Bool_Literal ST => bool_literal_validity ast ST | BL_Null_Literal ST => null_literal_validity ast ST end with bool_literal_validity (ast : ast_store) (T : bool_literal) {struct T} : Prop := match T with | Bool_Literal _ => True end with null_literal_validity (ast : ast_store) (T : null_literal) {struct T} : Prop := match T with | Null_Literal => True end with type_literal_validity (ast : ast_store) (T : type_literal) {struct T} : Prop := match T with | Type_Literal f0 => dart_type_validity ast f0 end with this_expression_validity (ast : ast_store) (T : this_expression) {struct T} : Prop := match T with | This_Expression => True end with rethrow_validity (ast : ast_store) (T : rethrow) {struct T} : Prop := match T with | Rethrow => True end with throw_validity (ast : ast_store) (T : throw) {struct T} : Prop := match T with | Throw f0 => expression_validity ast f0 end with function_expression_validity (ast : ast_store) (T : function_expression) {struct T} : Prop := match T with | Function_Expression f0 => function_node_validity ast f0 end with dart_let_validity (ast : ast_store) (T : dart_let) {struct T} : Prop := match T with | Let f0 f1 => F.In f0 (vd_refs ast) /\ expression_validity ast f1 end with vector_creation_validity (ast : ast_store) (T : vector_creation) {struct T} : Prop := match T with | Vector_Creation _ => True end with vector_get_validity (ast : ast_store) (T : vector_get) {struct T} : Prop := match T with | Vector_Get f0 _ => expression_validity ast f0 end with vector_set_validity (ast : ast_store) (T : vector_set) {struct T} : Prop := match T with | Vector_Set f0 _ f1 => expression_validity ast f0 /\ expression_validity ast f1 end with vector_copy_validity (ast : ast_store) (T : vector_copy) {struct T} : Prop := match T with | Vector_Copy f0 => expression_validity ast f0 end with closure_creation_validity (ast : ast_store) (T : closure_creation) {struct T} : Prop := match T with | Closure_Creation f0 f1 f2 f3 => F.In f0 (r_refs ast) /\ expression_validity ast f1 /\ function_type_validity ast f2 /\ dart_type_list_validity ast f3 end with statement_validity (ast : ast_store) (T : statement) {struct T} : Prop := match T with | S_Expression_Statement ST => expression_statement_validity ast ST | S_Block ST => block_validity ast ST | S_Empty_Statement ST => empty_statement_validity ast ST | S_Labeled_Statement ST => labeled_statement_validity ast ST | S_Break_Statement ST => break_statement_validity ast ST | S_While_Statement ST => while_statement_validity ast ST | S_Do_Statement ST => do_statement_validity ast ST | S_For_Statement ST => for_statement_validity ast ST | S_If_Statement ST => if_statement_validity ast ST | S_Return_Statement ST => return_statement_validity ast ST | S_Try_Catch ST => try_catch_validity ast ST | S_Try_Finally ST => try_finally_validity ast ST | S_Variable_Declaration ST => variable_declaration_validity ast ST | S_Function_Declaration ST => function_declaration_validity ast ST end with expression_statement_validity (ast : ast_store) (T : expression_statement) {struct T} : Prop := match T with | Expression_Statement f0 => expression_validity ast f0 end with block_validity (ast : ast_store) (T : block) {struct T} : Prop := match T with | Block f0 => statement_list_validity ast f0 end with empty_statement_validity (ast : ast_store) (T : empty_statement) {struct T} : Prop := match T with | Empty_Statement => True end with labeled_statement_validity (ast : ast_store) (T : labeled_statement) {struct T} : Prop := match T with | Labeled_Statement f0 => statement_validity ast f0 end with break_statement_validity (ast : ast_store) (T : break_statement) {struct T} : Prop := match T with | Break_Statement f0 => F.In f0 (ls_refs ast) end with while_statement_validity (ast : ast_store) (T : while_statement) {struct T} : Prop := match T with | While_Statement f0 f1 => expression_validity ast f0 /\ statement_validity ast f1 end with do_statement_validity (ast : ast_store) (T : do_statement) {struct T} : Prop := match T with | Do_Statement f0 f1 => statement_validity ast f0 /\ expression_validity ast f1 end with for_statement_validity (ast : ast_store) (T : for_statement) {struct T} : Prop := match T with | For_Statement f0 f1 f2 f3 => variable_declaration_list_validity ast f0 /\ expression_validity ast f1 /\ expression_list_validity ast f2 /\ statement_validity ast f3 end with if_statement_validity (ast : ast_store) (T : if_statement) {struct T} : Prop := match T with | If_Statement f0 f1 f2 => expression_validity ast f0 /\ statement_validity ast f1 /\ statement_validity ast f2 end with return_statement_validity (ast : ast_store) (T : return_statement) {struct T} : Prop := match T with | Return_Statement f0 => expression_validity ast f0 end with try_catch_validity (ast : ast_store) (T : try_catch) {struct T} : Prop := match T with | Try_Catch f0 f1 => statement_validity ast f0 /\ catch_list_validity ast f1 end with catch_validity (ast : ast_store) (T : catch) {struct T} : Prop := match T with | Catch f0 f1 f2 => dart_type_validity ast f0 /\ F.In f1 (vd_refs ast) /\ statement_validity ast f2 end with try_finally_validity (ast : ast_store) (T : try_finally) {struct T} : Prop := match T with | Try_Finally f0 f1 => statement_validity ast f0 /\ statement_validity ast f1 end with variable_declaration_validity (ast : ast_store) (T : variable_declaration) {struct T} : Prop := match T with | Variable_Declaration _ f0 f1 => dart_type_validity ast f0 /\ expression_option_validity ast f1 end with function_declaration_validity (ast : ast_store) (T : function_declaration) {struct T} : Prop := match T with | Function_Declaration f0 f1 => F.In f0 (vd_refs ast) /\ function_node_validity ast f1 end with name_validity (ast : ast_store) (T : name) {struct T} : Prop := match T with | N__Private_Name ST => _private_name_validity ast ST | N__Public_Name ST => _public_name_validity ast ST end with name_data_validity (ast : ast_store) (T : name_data) {struct T}: Prop := match T with | Name _ => True end with _private_name_validity (ast : ast_store) (T : _private_name) {struct T} : Prop := match T with | _Private_Name f0 f1 => name_data_validity ast f0 /\ F.In f1 (r_refs ast) end with _public_name_validity (ast : ast_store) (T : _public_name) {struct T} : Prop := match T with | _Public_Name f0 => name_data_validity ast f0 end with dart_type_validity (ast : ast_store) (T : dart_type) {struct T} : Prop := match T with | DT_Dynamic_Type ST => dynamic_type_validity ast ST | DT_Void_Type ST => void_type_validity ast ST | DT_Bottom_Type ST => bottom_type_validity ast ST | DT_Interface_Type ST => interface_type_validity ast ST | DT_Vector_Type ST => vector_type_validity ast ST | DT_Function_Type ST => function_type_validity ast ST | DT_Type_Parameter_Type ST => type_parameter_type_validity ast ST end with dynamic_type_validity (ast : ast_store) (T : dynamic_type) {struct T} : Prop := match T with | Dynamic_Type => True end with void_type_validity (ast : ast_store) (T : void_type) {struct T} : Prop := match T with | Void_Type => True end with bottom_type_validity (ast : ast_store) (T : bottom_type) {struct T} : Prop := match T with | Bottom_Type => True end with interface_type_validity (ast : ast_store) (T : interface_type) {struct T} : Prop := match T with | Interface_Type f0 f1 => F.In f0 (r_refs ast) /\ dart_type_list_validity ast f1 end with vector_type_validity (ast : ast_store) (T : vector_type) {struct T} : Prop := match T with | Vector_Type => True end with function_type_validity (ast : ast_store) (T : function_type) {struct T} : Prop := match T with | Function_Type f0 f1 f2 f3 => type_parameter_list_validity ast f0 /\ dart_type_list_validity ast f1 /\ named_type_list_validity ast f2 /\ dart_type_validity ast f3 end with named_type_validity (ast : ast_store) (T : named_type) {struct T} : Prop := match T with | Named_Type _ f0 => dart_type_validity ast f0 end with type_parameter_type_validity (ast : ast_store) (T : type_parameter_type) {struct T} : Prop := match T with | Type_Parameter_Type f0 f1 => F.In f0 (tp_refs ast) /\ dart_type_option_validity ast f1 end with type_parameter_validity (ast : ast_store) (T : type_parameter) {struct T} : Prop := match T with | Type_Parameter _ f0 => dart_type_validity ast f0 end with supertype_validity (ast : ast_store) (T : supertype) {struct T} : Prop := match T with | Supertype f0 f1 => F.In f0 (r_refs ast) /\ dart_type_list_validity ast f1 end with program_validity (ast : ast_store) (T : program) {struct T} : Prop := match T with | Program f0 f1 => library_list_validity ast f0 /\ F.In f1 (r_refs ast) end with reference_list_validity (ast : ast_store) (L : reference_list) {struct L} : Prop := match L with | reference_nil => True | reference_cons X XS => F.In X (r_refs ast) /\ reference_list_validity ast XS end with library_list_validity (ast : ast_store) (L : library_list) {struct L} : Prop := match L with | library_nil => True | library_cons X XS => library_validity ast X /\ library_list_validity ast XS end with library_dependency_list_validity (ast : ast_store) (L : library_dependency_list) {struct L} : Prop := match L with | library_dependency_nil => True | library_dependency_cons X XS => library_dependency_validity ast X /\ library_dependency_list_validity ast XS end with combinator_list_validity (ast : ast_store) (L : combinator_list) {struct L} : Prop := match L with | combinator_nil => True | combinator_cons X XS => combinator_validity ast X /\ combinator_list_validity ast XS end with class_list_validity (ast : ast_store) (L : class_list) {struct L} : Prop := match L with | class_nil => True | class_cons X XS => class_validity ast X /\ class_list_validity ast XS end with field_list_validity (ast : ast_store) (L : field_list) {struct L} : Prop := match L with | field_nil => True | field_cons X XS => field_validity ast X /\ field_list_validity ast XS end with constructor_list_validity (ast : ast_store) (L : constructor_list) {struct L} : Prop := match L with | constructor_nil => True | constructor_cons X XS => constructor_validity ast X /\ constructor_list_validity ast XS end with procedure_list_validity (ast : ast_store) (L : procedure_list) {struct L} : Prop := match L with | procedure_nil => True | procedure_cons X XS => procedure_validity ast X /\ procedure_list_validity ast XS end with procedure_kind_list_validity (ast : ast_store) (L : procedure_kind_list) {struct L} : Prop := match L with | procedure_kind_nil => True | procedure_kind_cons X XS => procedure_kind_validity ast X /\ procedure_kind_list_validity ast XS end with initializer_list_validity (ast : ast_store) (L : initializer_list) {struct L} : Prop := match L with | initializer_nil => True | initializer_cons X XS => initializer_validity ast X /\ initializer_list_validity ast XS end with async_marker_list_validity (ast : ast_store) (L : async_marker_list) {struct L} : Prop := match L with | async_marker_nil => True | async_marker_cons X XS => async_marker_validity ast X /\ async_marker_list_validity ast XS end with expression_list_validity (ast : ast_store) (L : expression_list) {struct L} : Prop := match L with | expression_nil => True | expression_cons X XS => expression_validity ast X /\ expression_list_validity ast XS end with expression_option_validity (ast : ast_store) (O : expression_option) {struct O} : Prop := match O with | expression_none => True | expression_some X => expression_validity ast X end with named_expression_list_validity (ast : ast_store) (L : named_expression_list) {struct L} : Prop := match L with | named_expression_nil => True | named_expression_cons X XS => named_expression_validity ast X /\ named_expression_list_validity ast XS end with statement_list_validity (ast : ast_store) (L : statement_list) {struct L} : Prop := match L with | statement_nil => True | statement_cons X XS => statement_validity ast X /\ statement_list_validity ast XS end with catch_list_validity (ast : ast_store) (L : catch_list) {struct L} : Prop := match L with | catch_nil => True | catch_cons X XS => catch_validity ast X /\ catch_list_validity ast XS end with variable_declaration_list_validity (ast : ast_store) (L : variable_declaration_list) {struct L} : Prop := match L with | variable_declaration_nil => True | variable_declaration_cons X XS => F.In X (vd_refs ast) /\ variable_declaration_list_validity ast XS end with dart_type_list_validity (ast : ast_store) (L : dart_type_list) {struct L} : Prop := match L with | dart_type_nil => True | dart_type_cons X XS => dart_type_validity ast X /\ dart_type_list_validity ast XS end with dart_type_option_validity (ast : ast_store) (O : dart_type_option) {struct O} : Prop := match O with | dart_type_none => True | dart_type_some X => dart_type_validity ast X end with named_type_list_validity (ast : ast_store) (L : named_type_list) {struct L} : Prop := match L with | named_type_nil => True | named_type_cons X XS => named_type_validity ast X /\ named_type_list_validity ast XS end with type_parameter_list_validity (ast : ast_store) (L : type_parameter_list) {struct L} : Prop := match L with | type_parameter_nil => True | type_parameter_cons X XS => F.In X (tp_refs ast) /\ type_parameter_list_validity ast XS end with supertype_list_validity (ast : ast_store) (L : supertype_list) {struct L} : Prop := match L with | supertype_nil => True | supertype_cons X XS => supertype_validity ast X /\ supertype_list_validity ast XS end with supertype_option_validity (ast : ast_store) (O : supertype_option) {struct O} : Prop := match O with | supertype_none => True | supertype_some X => supertype_validity ast X end . Definition ast_store_validity (ast : ast_store) : Prop := forall (n : nat), forall (X : reference), F.MapsTo n X (r_refs ast) -> reference_validity ast X /\ forall (n : nat), forall (X : labeled_statement), F.MapsTo n X (ls_refs ast) -> labeled_statement_validity ast X /\ forall (n : nat), forall (X : variable_declaration), F.MapsTo n X (vd_refs ast) -> variable_declaration_validity ast X /\ forall (n : nat), forall (X : type_parameter), F.MapsTo n X (tp_refs ast) -> type_parameter_validity ast X .