void run_scp_program(sc_memory_context *context, scp_operand *scp_program) { scp_operand arc1, arc2, quest, params; MAKE_DEFAULT_ARC_ASSIGN(arc1); MAKE_DEFAULT_ARC_ASSIGN(arc2); MAKE_DEFAULT_NODE_ASSIGN(quest); scp_program->param_type = SCP_FIXED; genElStr5(context, &quest, &arc1, scp_program, &arc2, ordinal_rrels + 1); quest.param_type = SCP_FIXED; MAKE_DEFAULT_NODE_ASSIGN(params); genElStr5(context, &quest, &arc1, ¶ms, &arc2, ordinal_rrels + 2); set_author(context, &quest, &abstract_scp_machine); genElStr3(context, &question_scp_interpretation_request, &arc1, &quest); genElStr3(context, &question_initiated, &arc1, &quest); }
scp_result resolve_operator_type(sc_memory_context *context, scp_operand *oper, scp_operand *type) { scp_operand arc; MAKE_DEFAULT_ARC_ASSIGN(arc); MAKE_DEFAULT_NODE_ASSIGN((*type)); oper->param_type = SCP_FIXED; scp_iterator3 *it = scp_iterator3_new(context, type, &arc, oper); while (SCP_RESULT_TRUE == scp_iterator3_next(context, it, type, &arc, oper)) { //! TODO Remove temporary check if (SCP_RESULT_TRUE != ifVarAssign(context, type)) continue; type->param_type = SCP_FIXED; if (SCP_RESULT_TRUE == searchElStr3(context, &scp_operator_atomic_type, &arc, type)) { scp_iterator3_free(it); return SCP_RESULT_TRUE; } type->param_type = SCP_ASSIGN; } scp_iterator3_free(it); return SCP_RESULT_FALSE; }
void set_author(sc_memory_context *context, scp_operand *quest, scp_operand *author) { scp_operand authors, arc1, arc3; MAKE_DEFAULT_ARC_ASSIGN(arc1); MAKE_COMMON_ARC_ASSIGN(arc3); MAKE_DEFAULT_NODE_ASSIGN(authors); genElStr5(context, &authors, &arc3, quest, &arc1, &nrel_authors); authors.param_type = SCP_FIXED; genElStr3(context, &authors, &arc1, author); }
scp_result resolve_ordinal_set_rrel(sc_memory_context *context, scp_operand *arc_param, scp_operand *result) { scp_operand arc; scp_iterator3 *it; MAKE_DEFAULT_ARC_ASSIGN(arc); MAKE_DEFAULT_NODE_ASSIGN((*result)); arc_param->param_type = SCP_FIXED; it = scp_iterator3_new(context, result, &arc, arc_param); while (SCP_RESULT_TRUE == scp_iterator3_next(context, it, result, &arc, arc_param)) { result->param_type = SCP_FIXED; if (SCP_RESULT_TRUE == searchElStr3(context, &ordinal_set_rrel, &arc, result)) { scp_iterator3_free(it); return SCP_RESULT_TRUE; } result->param_type = SCP_ASSIGN; } scp_iterator3_free(it); return SCP_RESULT_FALSE; }
sc_result preprocess_scp_procedure(const sc_event *event, sc_addr arg) { scp_operand arc1, arc2, arc3, scp_procedure_node, node1, scp_procedure_params, scp_procedure_consts, scp_procedure_copying_consts, scp_procedure_vars, scp_procedure_operators, scp_procedure_operators_copying_pattern; MAKE_DEFAULT_OPERAND_FIXED(arc1); MAKE_DEFAULT_ARC_ASSIGN(arc2); arc1.addr = arg; arc1.element_type = scp_type_arc_pos_const_perm; MAKE_DEFAULT_NODE_ASSIGN(node1); MAKE_DEFAULT_OPERAND_ASSIGN(scp_procedure_node); if (SCP_RESULT_TRUE != ifVarAssign(s_default_ctx, &arc1)) { return SC_RESULT_ERROR; } if (SCP_RESULT_TRUE != ifType(s_default_ctx, &arc1)) { return SC_RESULT_OK; } if (SCP_RESULT_TRUE != searchElStr3(s_default_ctx, &node1, &arc1, &scp_procedure_node)) { return SCP_RESULT_ERROR; } scp_procedure_node.param_type = SCP_FIXED; if (SCP_RESULT_TRUE != ifVarAssign(s_default_ctx, &scp_procedure_node)) { return SC_RESULT_ERROR; } arc1.erase = SCP_TRUE; eraseEl(s_default_ctx, &arc1); MAKE_DEFAULT_ARC_ASSIGN(arc1); MAKE_COMMON_ARC_ASSIGN(arc3); if (SCP_RESULT_TRUE == searchElStr3(s_default_ctx, &prepared_scp_program, &arc1, &scp_procedure_node)) { return SC_RESULT_OK; } //Debug info printf("PREPROCESSING: "); MAKE_DEFAULT_OPERAND_ASSIGN(node1); searchElStr5(s_default_ctx, &scp_procedure_node, &arc3, &node1, &arc2, &nrel_system_identifier); printNl(s_default_ctx, &node1); MAKE_DEFAULT_OPERAND_ASSIGN(scp_procedure_operators); searchElStr5(s_default_ctx, &scp_procedure_node, &arc1, &scp_procedure_operators, &arc2, &rrel_operators); scp_procedure_operators.param_type = SCP_FIXED; MAKE_DEFAULT_OPERAND_ASSIGN(scp_procedure_params); searchElStr5(s_default_ctx, &scp_procedure_node, &arc1, &scp_procedure_params, &arc2, &rrel_params); scp_procedure_params.param_type = SCP_FIXED; MAKE_DEFAULT_NODE_ASSIGN(scp_procedure_consts); genElStr5(s_default_ctx, &scp_procedure_node, &arc3, &scp_procedure_consts, &arc2, &nrel_scp_program_const); scp_procedure_consts.param_type = SCP_FIXED; MAKE_DEFAULT_NODE_ASSIGN(scp_procedure_copying_consts); genElStr5(s_default_ctx, &scp_procedure_node, &arc3, &scp_procedure_copying_consts, &arc2, &nrel_scp_program_copied_const); scp_procedure_copying_consts.param_type = SCP_FIXED; MAKE_DEFAULT_NODE_ASSIGN(scp_procedure_vars); genElStr5(s_default_ctx, &scp_procedure_node, &arc3, &scp_procedure_vars, &arc2, &nrel_scp_program_var); scp_procedure_vars.param_type = SCP_FIXED; MAKE_DEFAULT_NODE_ASSIGN(scp_procedure_operators_copying_pattern); genElStr5(s_default_ctx, &scp_procedure_node, &arc3, &scp_procedure_operators_copying_pattern, &arc2, &nrel_template_of_scp_process_creation); scp_procedure_operators_copying_pattern.param_type = SCP_FIXED; if (SCP_RESULT_TRUE == gen_system_structures(s_default_ctx, &scp_procedure_operators, &scp_procedure_params, &scp_procedure_vars, &scp_procedure_consts, &scp_procedure_copying_consts, &scp_procedure_operators_copying_pattern)) { genElStr3(s_default_ctx, &prepared_scp_program, &arc1, &scp_procedure_node); //printf("PREPROCESSING FINISHED\n"); return SC_RESULT_OK; } else { return SC_RESULT_ERROR; } }
sc_result destroy_scp_process(const sc_event *event, sc_addr arg) { scp_operand arc1, arc2, node1, curr_operator, node3, scp_process_node, operator_type, question_node, call_parameters; scp_iterator3 *it; GHashTable *params = nullptr; scp_result params_found; MAKE_DEFAULT_OPERAND_FIXED(arc1); MAKE_DEFAULT_NODE_ASSIGN(scp_process_node); arc1.addr = arg; arc1.element_type = scp_type_arc_pos_const_perm; if (SCP_RESULT_TRUE != ifType(s_default_ctx, &arc1)) { return SC_RESULT_OK; } MAKE_DEFAULT_OPERAND_ASSIGN(node1); if (SCP_RESULT_TRUE != searchElStr3(s_default_ctx, &node1, &arc1, &scp_process_node)) { return SC_RESULT_ERROR; } MAKE_DEFAULT_ARC_ASSIGN(arc1); scp_process_node.param_type = SCP_FIXED; MAKE_DEFAULT_ARC_ASSIGN(arc2); MAKE_DEFAULT_OPERAND_ASSIGN(curr_operator); MAKE_DEFAULT_OPERAND_ASSIGN(question_node); MAKE_DEFAULT_OPERAND_ASSIGN(call_parameters); MAKE_DEFAULT_OPERAND_ASSIGN(node3); node1.erase = SCP_TRUE; curr_operator.erase = SCP_TRUE; node3.erase = SCP_TRUE; MAKE_DEFAULT_OPERAND_ASSIGN(question_node); MAKE_COMMON_ARC_ASSIGN(arc1); params_found = searchElStr5(s_default_ctx, &question_node, &arc1, &scp_process_node, &arc2, &nrel_scp_process); question_node.param_type = SCP_FIXED; MAKE_DEFAULT_ARC_ASSIGN(arc1); if (params_found == SCP_RESULT_TRUE) { MAKE_DEFAULT_OPERAND_ASSIGN(call_parameters); params_found = searchElStr5(s_default_ctx, &question_node, &arc1, &call_parameters, &arc2, &ordinal_rrels[2]); call_parameters.param_type = SCP_FIXED; if (params_found == SCP_RESULT_TRUE) { params = g_hash_table_new(NULL, NULL); load_set_to_hash(s_default_ctx, &call_parameters, params); } } MAKE_DEFAULT_NODE_ASSIGN(operator_type); it = scp_iterator3_new(s_default_ctx, &scp_process_node, &arc1, &curr_operator); while (SCP_RESULT_TRUE == scp_iterator3_next(s_default_ctx, it, &scp_process_node, &arc1, &curr_operator)) { curr_operator.param_type = SCP_FIXED; if (SCP_RESULT_TRUE != resolve_operator_type(s_default_ctx, &curr_operator, &operator_type)) { curr_operator.param_type = SCP_ASSIGN; delete_vars_from_set(s_default_ctx, &curr_operator, params); eraseEl(s_default_ctx, &curr_operator); continue; } operator_type.param_type = SCP_FIXED; if (SCP_RESULT_TRUE == ifCoin(s_default_ctx, &operator_type, &op_call)) { //printf("OPERATOR CALL\n"); if (SCP_RESULT_TRUE == searchElStr5(s_default_ctx, &curr_operator, &arc1, &node3, &arc2, &(ordinal_rrels[2]))) { node3.param_type = SCP_FIXED; delete_vars_from_set(s_default_ctx, &node3, params); eraseEl(s_default_ctx, &node3); node3.param_type = SCP_ASSIGN; } delete_vars_from_set(s_default_ctx, &curr_operator, params); eraseEl(s_default_ctx, &curr_operator); operator_type.param_type = SCP_ASSIGN; curr_operator.param_type = SCP_ASSIGN; continue; } if (SCP_RESULT_TRUE == ifCoin(s_default_ctx, &operator_type, &op_sys_gen) || SCP_RESULT_TRUE == ifCoin(s_default_ctx, &operator_type, &op_sys_search)) { if (SCP_RESULT_TRUE == searchElStr5(s_default_ctx, &curr_operator, &arc1, &node3, &arc2, &(ordinal_rrels[2]))) { node3.param_type = SCP_FIXED; delete_vars_from_relation(s_default_ctx, &node3, params); eraseEl(s_default_ctx, &node3); node3.param_type = SCP_ASSIGN; } if (SCP_RESULT_TRUE == searchElStr5(s_default_ctx, &curr_operator, &arc1, &node3, &arc2, &(ordinal_rrels[3]))) { node3.param_type = SCP_FIXED; delete_vars_from_relation(s_default_ctx, &node3, params); eraseEl(s_default_ctx, &node3); node3.param_type = SCP_ASSIGN; } delete_vars_from_set(s_default_ctx, &curr_operator, params); eraseEl(s_default_ctx, &curr_operator); operator_type.param_type = SCP_ASSIGN; curr_operator.param_type = SCP_ASSIGN; continue; } delete_vars_from_set(s_default_ctx, &curr_operator, params); eraseEl(s_default_ctx, &curr_operator); operator_type.param_type = SCP_ASSIGN; curr_operator.param_type = SCP_ASSIGN; } scp_iterator3_free(it); scp_process_node.erase = SCP_TRUE; eraseEl(s_default_ctx, &scp_process_node); if (SCP_RESULT_TRUE == params_found) { g_hash_table_destroy(params); } //printf("PROCESS DESTROYED SUCCESSFULLY\n"); return SC_RESULT_OK; }