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

📄 conseqdlg.cpp

📁 命题逻辑中的归结推理系统设计与实现,人工智能实习项目,包括实验报告
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	start=head;
	end=scur;
	dohequ();

	// replace();

	/*plink=scur;
	addchar2('(',1);
	plink=head->pre;
	addchar2(')',1);
    start=scur;
	end=head->pre;
	dohequ();
	*/
	replace();
	over();
}

void CconseqDlg::dohequ()
{

	memset(result,0,sizeof(result));
	resultfst=0;
	char and[10][30];
	char sv[30];

    CListBox* pLB = (CListBox*)GetDlgItem(IDC_OUTPUT);
    link* tolink=(link*)malloc(sizeof(link));

	for( plink=end;plink!=head;)
	{		  
		int ll=resultfst;
		link* svlink=(link*)malloc(sizeof(link));
		if( plink->data=='(')
		{
			tolink=plink->pre;
			link *cur=(link*)malloc(sizeof(link));
			cur=plink->next;
		    memset(and,0,sizeof(and));
		    int andfst=0,andsec=0;
		    memset(sv,0,sizeof(sv));
		    int sfst=0;
			int isand=0;
              //将并存入and[][]中
			for( ;cur->data!=')';)        //如a V ( b V c A d V e A f V h)
			{                         ///将 c A d中的c,d放入and[0][]={c,d},
				if( cur->data=='&')   //e A f放入 and[1][]={e,f}
					{  
							   //pLB->AddString(CString(L"&&"));   
							   isand=1;              //下面的for将 b,h放入sv[]={a,f};
								if( cur->pre->pre->data=='~' )
							   		and[andfst][andsec++]=char( int(cur->pre->data)-32);
								else 
									and[andfst][andsec++]=cur->pre->data;
								cur=cur->next;
								if( cur->data=='~' )
								{   
									cur=cur->next;
									and[andfst][andsec++]=char( int(cur->data)-32);
								}
								else 
									and[andfst][andsec++]=cur->data;                    
								if( cur->next->data=='&') 						
								{
									while(cur!=end)
									{
										cur=cur->next; 
										if( cur->data=='&') continue;
										if( cur->data=='v'|| cur->data==')' ) break;
										else
										{
										//    cur=cur->next;
											if( cur->data=='~' ) 
											{   
												cur=cur->next;
												and[andfst][andsec++]=char( int(cur->data)-32);
											}
											else 
												and[andfst][andsec++]=cur->data;
										}
									 }
								}
						//  and[andfst][andsec]='\0';
				    	  andfst++;
						  andsec=0;							
						//  break;
					/*	for( int i=0;i<andfst;i++)
						{
							CString sb=L"and:";
							sb+=CString(CString(and[i]));
								  pLB->AddString(CString(sb)); 
						}*/
                     }
					else cur=cur->next;
			   }
	    	    
			for( svlink=plink;svlink->data!=')';svlink=svlink->next);
			svlink=svlink;
			svlink=cur;
	        CString tp=L":";
		 //   tp+=CString(svlink->data);
		//    pLB->AddString(tp);
			
             sfst=0;
			//将与存入sv[]中
			for(cur=plink->next;cur->data!=')';)
				{
					if( cur->data!='v'  && cur->data!='&' && cur->data!='~' )
						{
							if ( cur->next->data=='v' || cur->next->data==')' )
						   {
							   if ( cur->pre->data=='v' || cur->pre->data=='(' )
								   sv[sfst++]=cur->data;
							   else if(cur->pre->pre->data=='v'  || cur->pre->pre->data=='(')
								   sv[sfst++]=cur->data-32;
						   }

                        }
				   cur=cur->next;
				}         
			                /*CString s=L"andfst";
			                 s+=(CString)(char)(andfst+65);

					   		  pLB->AddString(s);
							  s=L"sfts";
							  s+=(CString)(char)(sfst+65);
							  pLB->AddString(s);*/

		   if( andfst==1 && !sfst )
			{
				plink->data='!';
				svlink->data='!';
				delnot();
				plink=tolink;
				if( plink==head ) break;
				else continue;
			}
			else if( isand ) 
			{
			//	 pLB->AddString((CString)(char)(andfst+65));
		       //   pLB->AddString(CString(L"ened"));
		      //    pLB->AddString(CString(end->data));
		   		//  pLB->AddString(CString(L"stat"));
		     //     pLB->AddString(CString(start->next->data));
				//	tp=L"ai:"; 
				//	for( int i=0;i<andfst;i++)
				//	  pLB->AddString(tp+CString(and[i]));
			//		tp=L"sv:";
				//	  pLB->AddString(tp+CString(sv));
                  int len;
				  for( len=0;and[0][len]!='\0';len++);
				  int sj=0;
				  if( andfst==1)
				    for( int ss=0;ss<len;ss++)
                       result[resultfst++][0]=and[0][ss];
				  else  if(andfst==2)
					  {
						  int sj=0;
						  int lenb;
						  for( lenb=0;and[1][lenb]!='\0';lenb++);
						  int lv=(len>=lenb)?len:lenb;
						  int lc=(len<=lenb)?len:lenb;
						  lv--;
						  lc--;
						  if( lv==lc )
							  {
						      for( int h=0;h<2;h++)
                                    for( int ss=0;ss<=lv;ss++)
							          {						
								           result[resultfst++][0]=and[0][ss];
						        	   //    tp=L"resultadd:";
							            //   tp+=(CString)(result[resultfst-1][0]);
							          //     pLB->AddString(tp);
							          }
							  int sf=0;
							//  tp=L"reseultfst:";
							  //  tp+=(CString)(char)(resultfst+48);
								// pLB->AddString(tp);
							    int pp=ll;
							    for( sf=0;sf<2*lv;sf+=lv)
									 for( int ss=0;ss<=lc;ss++)
								  {
									//  tp=L"";
									//  tp+=(CString)(char)(sf+48);
								//	  pLB->AddString(tp);
									  result[pp++][1]=and[1][ss];
								 //     tp=L"re:";
							     //     tp+=(CString)(result[pp-1][1]);
							     //     pLB->AddString(tp);
								  }

							  }
						  else {
					              for( int h=0;h<2;h++)
                                       for( int ss=0;ss<=lv;ss++)
								         if( lv==len) result[resultfst++][0]=and[0][ss];
								          else  result[resultfst++][0]=and[1][ss];
							      int sf=0;
							      int pp=ll;
							         for( sf=0;sf<2*lv;sf+=lv)
									     for( int ss=0;ss<=lc;ss++)
									        if( lv==len) result[sf][1]=and[1][ss];
									       else  result[sf][1]=and[0][ss];

							  }
					  }
				  

			 } //只有并,直接去括号

			//有并有与
            if( sfst && isand)
			{ int lens;
				for(  lens=0;sv[lens]!='\0';lens++);
				for( int vv=ll;vv<resultfst;vv++)
				{       
					 int j=0;
					 while( result[vv][j]!='\0')j++;
					 for( int hv=0;hv<lens;hv++)
						 result[vv][j++]=sv[hv];
				}
	 	    }  //只有与,直接存入去
			else if( !isand && sfst )
			{
               int lens;
				for(  lens=0;sv[lens]!='\0';lens++);
			    for( int ss=0;ss<lens;ss++)
				     result[resultfst][ss]=sv[ss];
				resultfst++;
			}

		    link * tmp=(link*)malloc(sizeof(link));
         	for( tmp=plink;tmp!=svlink->next;tmp=tmp->next)
			     tmp->data='!';
	        delnot();
        	plink=tolink;
            for(;ll<resultfst;ll++)
		       {
			    addchar2(char(ll+49),2);
			    if( ll<resultfst-1 ) addchar2('&',1);
		        }
		 //  for( int sh=0;sh<resultfst;sh++)
		   //   pLB->AddString(L"result:"+CString(result[sh]));	
		//   tp=L"ggg :  ";
		 /*  for( qlink=head->next;qlink!=head;qlink=qlink->next)
				{
					if( qlink->data=='v') 			tp+=L"∨";
					else if( qlink->data=='>')      tp+=L"->";
					else if( qlink->data==',')      tp+=L",";
					else if( qlink->data=='(')      tp+=L"(";
					else if( qlink->data==')')      tp+=L")";
					else if( qlink->data=='&')       tp+=L"∧";
					else tp+=CString(qlink->data);

				}
			   pLB->AddString(CString(tp));*/
		       plink=tolink;
          	  // pLB->AddString(CString(L"plink"));pLB->AddString(CString(plink->data));
		       if( plink==head ) break;
	     }
	   else plink=plink->pre;
	  }
}

void CconseqDlg::replace()
{
			CListBox* pLB = (CListBox*)GetDlgItem(IDC_OUTPUT);
			link*tmp=(link*)malloc(sizeof(link));
			for(plink=start->next;plink!=end;)
			{
				if( plink->n==1 )
				{
					int len=0;
					int si=int(plink->data)-49;
					while( result[si][len]!='\0') len++;
					plink->data='!';
				//	plink->n=0;
					addchar2('(',1);
					tmp=plink;
					for( int i=0;i<len;i++)
					{ 
						if( result[si][i]>='A' && result[si][i]<='Z')
						{
							addchar2('~',1);
							addchar2(char((int)result[si][i]+32),1);
						//	result[si][i]=' ';
						}
						else if( result[si][i]>='a' && result[si][i]<='z')
						{
							addchar2(result[si][i],1);
						//	result[si][i]=' ';
						}
						else// if( result[si][i]!=' ')
						addchar2(result[si][i],2);
						if( i<len-1 ) 
							addchar2('v',1);
					}
					addchar2(')',1);
					delnot();
					plink=tmp->next;
					continue;
				//	break;
				}
				else plink=plink->next;
			}
			CString tp=L"化成合取式 :  ";
    	    for( qlink=head->next;qlink!=head;qlink=qlink->next)
				{
					if( qlink->data=='v') 			tp+=L"∨";
					else if( qlink->data=='>')      tp+=L"->";
					else if( qlink->data==',')      tp+=L",";
					else if( qlink->data=='&')       tp+=L"∧";
					else if( qlink->data=='(')      tp+=L"(";
					else if( qlink->data==')')       tp+=L")";
					else tp+=CString(qlink->data);
				}
		   pLB->AddString(CString(tp));
}

void CconseqDlg::over()
{

	        CListBox* pLB = (CListBox*)GetDlgItem(IDC_OUTPUT);
		    for( plink=head->next;plink!=head;plink=plink->next)
				if( plink->data=='&')
					   plink->data=',';
				else if( plink->data=='(' || plink->data==')')
				    	plink->data='!';
			int isagain=0;
			delnot();
			while(1)
			{  
				isagain=0;
				for( plink=head->next;plink!=head;)
				{
			    	char c=plink->data;
					if ( c==','|| c=='~' || c=='v') plink=plink->next;
					else
					{ 
						int flag=-1,flag1=-1;
						if ( plink->pre->data=='~') flag=1;
						    else flag=0;
						link* tmp=(link*)malloc(sizeof(tmp));
						for( tmp=plink->next;tmp!=head;tmp=tmp->next)
							if( tmp->data==',') break;
							else if( tmp->data==c )
							{
								if( tmp->pre->data=='~') flag1=1;
								else flag1=0;
							    if( flag ==0 && flag1==0 )
								 { 
									tmp->data='!';
									tmp->pre->data='!';
									isagain=1;
									break;
								 }
								 else if( flag==1 && flag1==1 )
								 {
									tmp->data='!';
									tmp->pre->data='!';
									tmp->pre->pre->data='!';
									isagain=1;
									break;
								 }
								 else flag1=-1;
							}	
						if( isagain ) break;
						if(plink==head||plink->next==head) break;
						else   plink=plink->next;
					}
				}
				if( isagain ){ delnot(); continue;}
				else
					break;
			}

            CString tp=L"";
			CString sp=L"";
    	    for( qlink=head->next;qlink!=head;qlink=qlink->next)
				{
					if( qlink->data=='v') 		{ tp+=L"∨";sp+='|';}
					else if( qlink->data==',')    {   tp+=L","; sp+=',';}
					else 
					{  tp+=CString(qlink->data);sp+=CString(qlink->data);}
				}
		   pLB->AddString(L"化简得子句 :  "+tp);
		   tp=L"";
		   UpdateData(true);
		   SetDlgItemTextW(IDC_INPUT,sp);
}

void CconseqDlg::addkuo()
{
	for( plink=head->next;plink!=head;)
	{
		link* tmp=(link*)malloc(sizeof(link));
		tmp=plink;
		if( plink->data=='&')
		{
			link*cur=(link*)malloc(sizeof(link));
			int flag=0;
			int yes=0;
			for(cur=plink->pre;cur!=head;cur=cur->pre)
			{
				if( flag==0)
				{
					if( cur->data==',' || cur->data=='v' ) 
					{   yes=1;
						break;
					}
				}
				if( cur->data=='(' && flag!=0 ) break;
				else if( cur->data==')') flag++;
				else if( cur->data=='(')
				{  
					flag--;
					if( !flag )
						break;
				}
			}
	       plink=cur;
		   if( flag) addchar2('(',1);
		   for(cur=tmp->next;cur!=head;cur=cur->next)
			{
				if( flag==0)
				{
					if( cur->data==',' || cur->data=='v' )  
						break;
				}
				if( cur->data=='(' && flag!=0 )  break;
				else if( cur->data==')') 
				{
					flag--; 
					if (!flag )break;
				}
				else if( cur->data=='(') flag++;
			}
           plink=cur;
		   addchar2(')',1);
		   plink=tmp->next;
		   if( plink==head || plink->next==head ) break;
		}
		else plink=plink->next;
	}
	    CString tp=L"加入括号得:   ";
	for( plink=head->next;plink!=head;plink=plink->next)
	{
		if( plink->data=='v') 			tp+=L"∨";
		else if( plink->data=='>')      tp+=L"->";
		else if( plink->data==',')      tp+=L",";
		else if( plink->data=='(')      tp+=L"(";
		else if( plink->data==')')      tp+=L")";
	    else if( plink->data=='&')       tp+=L"∧";
	    else tp+=CString(plink->data);

	}
	CListBox* pLB = (CListBox*)GetDlgItem(IDC_OUTPUT);
			pLB->AddString(CString(tp));
}

⌨️ 快捷键说明

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