c语言编程实现合取析取,C++实现离散数学求主合取范式和主析取范式

-------YYC

#include #include #include #include using namespace std; /* *说明: *     用!表示 否定 *     用& 表示 合取 *     用| 表示 析取 *     用- 表示 条件 *     用~ 表示 双条件 */ list> inlist_value_map ;//用于记录所有最初变量的真值组合 list> hqlist_value_map;//用于记录所有符合主合取范式条件的真值组合 list> xqlist_value_map;//用于记录所有符合主析取范式条件的真值组合 int value=0; //string expr; //真值转换函数 void change_val(int & s) { if(0==s) s=1; else s=0; } //处理基本连接词的函数 int deal_cal(int par1,char  par2,int par3) {   // cout<& value_map) { int a; int par_value;//该部分表达式的值 string::size_type l=str.length(); string::const_iterator it = str.begin(); for(;it!=str.end();it++) {  if(*it=='!') { //利用string类型的迭代器实现对String对象的字符的遍历访问。erase string::const_iterator init_it = it+1;//保存!符后的下一个位置 change_val(value_map[*(init_it)]);//转换真值 str.erase(it);//删除否定符号    } } it = str.begin(); par_value=value_map[*it]; if(l==1)//如果该部分只有一个命题则返回该命题的真值 { return par_value; } else { for(;it !=str.end()-1;)   {   // cout<& value_map) { //扫描括号 int sum_kh=0;//括号数 string::const_iterator iter; string::const_iterator addr_kh[50];//用于记录括号的位置 char kind_kh[50];//用于记录括号的类型 for(iter = Expr.begin();iter!=Expr.end();iter++) { if(*iter=='('||*iter==')') { addr_kh[sum_kh]=iter; kind_kh[sum_kh]=*iter; sum_kh++; } } if(0==sum_kh)//如果没有括号 { value=run_unkh_expr(Expr,value_map); return value; } else { int i=0; for(;i<=sum_kh;i++) { if(kind_kh[i]==')')//找到最内级的括号并跳出循环 break; } //取出最内层没有括号的字符串 string in_str = string(addr_kh[i-1]+1,addr_kh[i]); //算出最内层表达式的值 value = run_unkh_expr(in_str,value_map); static char var = '1'; value_map[var]=value;//将括号整体设为一个字符‘1’ string::const_iterator ite =  addr_kh[i-1];//"字符(的位置" //判断(是不是表达式的开头 string::const_iterator init_i; bool is_begin=false; if(ite==Expr.begin()) {is_begin = true; } else { init_i = addr_kh[i-1]-1; } { Expr.erase(ite,addr_kh[i]+1);//删除掉最内层表达式包括括号在内 } //再在删除的地方插入新的字符‘1’ if(is_begin==true) { Expr = var+Expr; } else {Expr.insert(init_i+1,var); } var = var +1; value = run_expr(Expr,value_map);   return value; } } //求主析取范式和主合取范式的函数 //为value_map取到所有不同真值组合的函数 //回溯法 map::iterator it; map in_value_map; void init_value_map(map& value_map) { map::size_type lern = value_map.size();//用于记录变量的个数       if(it == in_value_map.begin()) {   cout<::const_iterator bb= value_map.begin();bb!=value_map.end();bb++) { in_value_map[bb->first]=bb->second; } it = in_value_map.begin();//重新对it赋值  } if(it == in_value_map.end())//如果已经赋值完毕则想队列中加载组合 {     inlist_value_map.push_back(in_value_map);//向队列中加载组合   --it;//如果到底了则只往回走一步,释放最后一步的资源   return ;//跳出函数 }  for(int i=0;i<2;i++)  {   it->second = i;  ++it;  init_value_map(value_map);    }  --it;//每一个子树结束则往回退一步 } int main() {   string expr; map initial_value_map; cout<>expr; string::const_iterator iter = expr.begin(); for(;iter!=expr.end();iter++) { if(*iter!='!'&&*iter!='&'&&*iter!='~'&&*iter!='-'&&*iter!='|'&&*iter!='('&&*iter!=')') { initial_value_map[*iter]=1;//为每一个原子命题默认为真 } } //输出测试组合赋值函数 it = in_value_map.begin(); init_value_map(initial_value_map);     cout<>::iterator ii=inlist_value_map.begin();ii!=inlist_value_map.end();ii++) {   map::iterator ai = (*ii).begin(); if(ai==(*ii).end()) {  cout<::iterator yy = (*ii).begin();yy !=(*ii).end();yy++) { cout<first<second<>::iterator xqchei; xqchei = xqlist_value_map.begin(); if(xqchei ==xqlist_value_map.end()) { cout<>::iterator iit = xqlist_value_map.begin();iit != xqlist_value_map.end();iit++) { cout<::iterator i = (*iit).begin();i !=(*iit).end();i++) {   if(i->first>='0'&&i->first<='9')//不输出表达式中的临时数字字符 { ; } else { if(0==i->second)   { cout<first; map::iterator iii=i; ++iii;   if((iii)==(*iit).end())//如果是最后一位元素则不用再输出合取符   {     ;   }   else   { cout<>::iterator aaa = iit; ++aaa; if(aaa == xqlist_value_map.end())//如果是最后一组组合则不用再输出吸取符 { ; } else { cout<>::iterator hqchei; hqchei = hqlist_value_map.begin(); if(hqchei ==hqlist_value_map.end()) { cout<>::iterator iit = hqlist_value_map.begin();iit != hqlist_value_map.end();iit++) { cout<::iterator i = (*iit).begin();i !=(*iit).end();i++) {   if(i->first>='0'&&i->first<='9')//不输出表达式中的临时数字字符 { ; } else { if(1==i->second)   { cout<first; map::iterator iii=i; ++iii;   if((iii)==(*iit).end())//如果是最后一位元素则不用再输出合取符   {     ;   }   else   { cout<>::iterator aaa = iit; ++aaa; if(aaa == hqlist_value_map.end())//如果是最后一组组合则不用再输出吸取符 { ; } else { cout<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值