⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cnf_clause.cc

📁 由matlab开发的hybrid系统的描述语言
💻 CC
字号:
/*	HYSDEL	Copyright (C) 1999-2002  Fabio D. Torrisi	This file is part of HYSDEL.    	HYSDEL is free software; you can redistribute it and/or	modify it under the terms of the GNU General Public	License as published by the Free Software Foundation; either	version 2 of the License, or (at your option) any later version.	HYSDEL is distributed in the hope that it will be useful,	but WITHOUT ANY WARRANTY; without even the implied warranty of	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU	General Public License for more details.	You should have received a copy of the GNU General Public	License along with this library; if not, write to the Free Software	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA	CONTACT INFORMATION	===================	Fabio D. Torrisi	ETH Zentrum	Physikstrasse. 3 ETL,	CH-8032 Zurich	Switzerland	mailto:torrisi@aut.ee.ethz.ch (preferred)*/#include "CNF_clause.h"#include "Logic_or_clause.h"CNF_clause::CNF_clause(bool val = true) {	const_value = val;}CNF_clause::~CNF_clause() {	for (clauses_iter iter = clauses.begin(); iter != clauses.end(); iter++)		delete(* iter);	clauses.clear();}CNF_clause * CNF_clause::clone() {	CNF_clause * res = new CNF_clause(const_value);	for (clauses_iter iter = clauses.begin(); iter != clauses.end();		iter++) {			res->clauses.push_back((* iter)->clone());	}	return res;}void CNF_clause::add_or_clause(Logic_or_clause * or_clause) {	clauses.push_back(or_clause);}bool CNF_clause::get_const_value() const {	assert(clauses.empty()); //fine	return const_value;}void CNF_clause::log_and(CNF_clause * c2) {	const_value = const_value && c2->const_value;	clauses.insert(clauses.end(), c2->clauses.begin(), c2->clauses.end()); //add all of c2	c2->clauses.clear();	delete c2;}/** note: (A1&&A2&&...&&An)||(B1&&B2&&...&&Bm) = * (A1||B1) && (A1||B2) && ... && (A1||Bm) && (A2||B1) && ... && (An||Bm) */void CNF_clause::log_or(CNF_clause * c2) {	clauses_iter i1, i2;	list < Logic_or_clause * > tmp;	if (is_constant()) {		if (get_const_value()) {			delete c2;		} else // copy c2		{			const_value = c2->const_value;			for (clauses_iter iter = clauses.begin();				iter != clauses.end(); iter++) delete(* iter);			clauses.clear();			clauses = c2->clauses;			c2->clauses.clear();			delete c2;		}		return;	}	if (c2->is_constant()) {		if (c2->get_const_value()) {			for (clauses_iter iter = clauses.begin();				iter != clauses.end(); iter++) delete(* iter);			clauses.clear();			const_value = true;			delete c2;		} else delete c2;		return;	}	tmp = clauses;	clauses.clear();	Logic_or_clause * i1entry;	for (i1 = tmp.begin(); i1 != tmp.end(); i1++) {		for (i2 = c2->clauses.begin(); i2 != c2->clauses.end(); i2++) {			i1entry = (* i1)->clone();			i1entry->merge((* i2)->clone());			add_or_clause(i1entry);		}	}	for (clauses_iter iter = tmp.begin(); iter != tmp.end(); iter++)		delete(* iter);	tmp.clear();	delete c2;	simplify();}/** invert using ~(C1 && C2 && .. && Cn) = ~C1 || ~C2 || .. || ~Cn */void CNF_clause::log_not() {	CNF_clause * not_clause;	clauses_iter iter;	list < Logic_or_clause * > tmp;	//cout << "CNF_clause::NOT(" << c->to_string() << ")"; cout.flush();	if (is_constant()) {		const_value = !const_value;		return;	}	const_value = false;	tmp = clauses;	clauses.clear();	for (iter = tmp.begin(); iter != tmp.end(); iter++) {		not_clause = (* iter)->comp_inverse();		delete(* iter);		log_or(not_clause);	}	tmp.clear();	//cout << " ==> " << res->to_string() << endl; cout.flush();}void CNF_clause::simplify() {	clauses_iter iter, iter2;	//cout << "before simplify: "<< to_string() << endl; cout.flush();	// simplify all clauses seperately	for (iter = clauses.begin(); iter != clauses.end(); ) { // had to move iter++ outside		(* iter)->simplify();		if ((* iter)->is_constant()) { // clause is always true -> remove			assert((* iter)->get_const_value()); //???			delete(* iter);			iter = clauses.erase(iter); // performs iter++					} else iter++;	}	//cout << "after step 1:" << to_string() << endl; cout.flush();	// look for and remove superclauses	for (iter = clauses.begin(); iter != clauses.end(); iter++) {		for (iter2 = clauses.begin(); iter2 != clauses.end(); ) {			if ((iter != iter2) && (* iter)->is_subsum(* iter2)) {				delete(* iter2);				iter2 = clauses.erase(iter2);			} else iter2++;		}	}	//cout << "after step 2:" << to_string() << endl; cout.flush();}string CNF_clause::to_string() const {	string res;	const_clauses_iter iter, tmp;	if (is_constant()) {		if (!get_const_value()) return "FALSE"; else return "TRUE";	}	res += "{";	for (iter = clauses.begin(); iter != clauses.end(); iter++) {		res += (* iter)->to_string();		tmp = iter;		tmp++;		if (tmp != clauses.end()) res += ", ";	}	res += "}";	return res;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -