void skolemize(Tree_node* node, vector<int> vars, ID_table& id_table){ switch(node->get_type()){ case Tree_node::QUANT: if(node->get_id()==Tree_node::FOR_ALL){ for(int i=0; i<(node->children.size()-1); ++i) vars.push_back(node->children[i]->get_id()); } else{ //EXISTS for(int i=0; i<(node->children.size()-1); ++i) id_table.skolemize(node->children[i]->get_id(), vars.size()); } skolemize(node->children.back(), vars, id_table); return; case Tree_node::VAR: vector<int> type_args = id_table.check_skolem(node->get_id()); //type_args is array len 2 if(type_args[0]!=Tree_node::VAR){ node->reset(type_args[0], node->get_id()); for(int i=0; i<type_args[1]; ++i) //get the first arg_count vars node->children.push_back(new Tree_node(Tree_node::VAR, vars[i])); } return; } for(int i=0; i<node->children.size(); ++i) skolemize(node->children[i], vars, id_table); }
int Semantic::skolemize() { Symbol::StackType uvars_scope; SkolemMapType skolem_fns; return skolemize(uvars_scope, skolem_fns); }
void process(Tree_node*& root, ID_table& id_table){ elim_paren(root, root); //2nd root passed byref elim_imp(root); demorgan(root, false); skolemize(root, vector<int>(), id_table); elim_quant(root, root); //2nd root passed byref flatten(root, root); //2nd root passed byref }