Пример #1
0
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);
}
Пример #2
0
int 
Semantic::skolemize()
{
    Symbol::StackType uvars_scope;
    SkolemMapType skolem_fns;
    return skolemize(uvars_scope, skolem_fns);
}
Пример #3
0
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
}