北航2018年秋高等数理逻辑大作业——逻辑表达式求值和判断连接符集合完全

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#define MAX 1024+10

/**************
输入文件test.txt
求不超过二元连接符集合的最小完全集输入文件:wqj.txt
输出文件output.txt

输入样例格式:test.txt
求真值时:
¬fa(ps∨q→ps∨q,q→q)∨p↔⊕q→ga(p∨q→q,qs,q)∨ps (可以有空格)
#fa 2 1010     (名称、元数、真值表最后一列为这样的格式,井号之后可换行输入)
ga 2 11001010

判断完全集时
#f 3 11000010
g 0 1

求不超过二元连接符集合的最小完全集时
#
二元以内所有连接符

***************/

typedef struct/**运算数栈和运算符栈**/
{
    int data[MAX];
    wchar_t op[MAX][10];
    int top;
} stack;
stack stnum,stackop;

int prinum=9;
int lst=15,rst=14;
struct node/**定义左优先级和右优先级**/
{
    wchar_t ch[10];
    int pri;
} lpri[40]= {{L"#",0},{L"(",1},{L"^",3},{L"~",5},{L"-",7},{L"|",9},{L"&",11},{L"!",13},{L")",100}},
rpri[40]= {{L"#",0},{L"(",100},{L"^",2},{L"~",4},{L"-",6},{L"|",8},{L"&",10},{L"!",12},{L")",1}};

int leftpri(wchar_t op[])/**求运算符的左优先级**/
{
    int i;
    for(i=0; i<prinum; i++)
        if(!wcscmp(lpri[i].ch,op))return lpri[i].pri;
}
int rigpri(wchar_t op[])/**求运算符的右优先级**/
{
    int i;
    for(i=0; i<prinum; i++)
        if(!wcscmp(rpri[i].ch,op))return rpri[i].pri;
}

int pricmp(wchar_t op1[],wchar_t op2[])/**比较两个运算符的优先级**/
{
    if(leftpri(op1)==rigpri(op2))return 0;
    else if(leftpri(op1)<rigpri(op2))return -1;
    else return 1;
}
struct postex/**定义后缀表达式的数据结构**/
{
    wchar_t name[10];//变元或连接符的名
    int no;  //标志
    int nof;
} postexp[MAX];
int postlen;
int isop(wchar_t cs[])/**判断是否是连接符**/
{
    int i;
    for(i=0; i<prinum; i++)
    {
        if(wcscmp(cs,lpri[i].ch)==0)
            return 1;
    }
    return 0;
}
int preop(wchar_t ch)/**判断数字、逗号、连接符**/
{
    wchar_t op[10];
    op[0]=ch;
    op[1]=L'\0';
    int i;
    for(i=0; i<9; i++)
    {
        if(wcscmp(op,lpri[i].ch)==0)
            return 1;
    }
    if(ch==L',')return 2;
    else if(ch>=L'0'&&ch<=L'9')return 3;
    else return 0;
}

int trans(wchar_t *exp) /**中缀表达式转后缀**/
{
    //wprintf(L"%ls\n",exp);
    stackop.top=-1;
    int i=0,j,k,cas,que,flag;
    stackop.top++;
    wcscpy(stackop.op[stackop.top],L"#");

    wchar_t tmp[10];
    int leng=0;
    while(*exp!=L'\r'&&*exp!=L'\0'&&*exp!=L' ')
    {
        wcsset(tmp,L'\0',sizeof(tmp));
        //wcscpy(tmp,L"");
        que=preop(*exp);

        if(que==0)//不是经典的逻辑连接符
        {

            if(!((*exp>=L'a'&&*exp<=L'z')||(*exp>=L'A'&&*exp<=L'Z'))) //当前逻辑连接符或变元首字符不是字母
            {
                wprintf(L"当前逻辑连接符或变元首字符不是字母 error!\n");
                return 0;
            }
            //tmpbuf[leng++]=*exp;
            k=0;
            while(preop(*exp)==0||preop(*exp)==3)//&&(*exp)!=',')//提取变元或自定义连接符
            {
                if(!((*exp>=L'a'&&*exp<=L'z')||(*exp>=L'A'&&*exp<=L'Z')||(*exp>=L'0'&&*exp<=L'9')))
                {
                    wprintf(L"当前逻辑连接符或变元中有违规字符!\n");
                    return 0;
                }
                //tmpbuf[leng++]=*exp;
                tmp[k++]=*exp;
                exp++;
                if(*exp==L'\r'||*exp==L'\0')break;
            }
            //exp--;
            tmp[k]=L'\0';
        }
        else if(que==3)
        {
            if((*(exp+1)>=L'a'&&*(exp+1)<=L'z')||(*(exp+1)>=L'a'&&*(exp+1)<=L'z')||(*(exp+1)>=L'A'&&*(exp+1)<=L'Z')) //当前逻辑连接符或变元首字符不是字母
            {
                printf("0-1 defined error!\n");
                return 0;
            }
            tmp[0]=*exp;
            tmp[1]=L'\0';
            exp++;
            if(*exp==L'\r'||*exp==L'\0')break;
        }
        else if(que==1)
        {
            //tmpbuf[leng++]=*exp;
            tmp[0]=*exp;
            tmp[1]=L'\0';
        }
        else //逗号
        {
            if(*exp!=L','&&*exp!=L' ')
            {
                printf("标点定义错误!!!\n");
                return 0;
            }
            //tmpbuf[leng++]=*exp;
            //把前边栈顶的连接符弹出
            while(wcscmp(stackop.op[stackop.top],L"(")!=0)
            {
                wcscpy(postexp[i++].name,stackop.op[stackop.top]);
                //wprintf(L"出%ls\n",stackop.op[stackop.top]);
                stackop.top--;

            }
            exp++;
        }

        if(que!=2)
        {
            cas=isop(tmp);
            //printf("%d\n",cas);
            if(cas==0) //逻辑变元
            {
                //j=0;
                //while(*exp!=','||*exp!=')'||isop(*exp)==0)
                //{
                wcscpy(postexp[i++].name,tmp);
                //wprintf(L"%ls\n",tmp);
                if(*exp==L'\r')break;  //?
                //exp++;
                //}
                //postexp[i][j]='\0';
                //memset(nop,'\0',sizeof(nop));
            }
            else if(cas==1) //连接符
            {
                flag=0;
                if(que==0)
                {
                    for(j=9; j<prinum; j++)
                    {
                        if(!wcscmp(lpri[j].ch,tmp))
                        {
                            flag=1;
                            break;
                        }
                    }
                    if(!flag)
                    {
                        wprintf(L"没有定义这个逻辑连接符!!\n");
                        return 0;
                    }
                }
                switch(pricmp(stackop.op[stackop.top],tmp))
                {
                case -1:
                    stackop.top++;
                    wcscpy(stackop.op[stackop.top],tmp);
                    //wprintf(L"入%ls\n",tmp);
                    if(que==1)
                        exp++;
                    break;
                case 0:
                    stackop.top--;
                    //pop(stackop);
                    /*if(!strcmp(stackop.op[stackop.top],"f")||!strcmp(stackop.op[stackop.top],"g"))
                    {
                        strcpy(postexp[i++],stackop.op[stackop.top]);
                        pop(stackop);
                    }*/
                    //wprintf(L"出(\n");
                    exp++;
                    break;
                case 1:
                    wcscpy(postexp[i++].name,stackop.op[stackop.top]);
                    //wprintf(L"出%ls\n",stackop.op[stackop.top]);
                    stackop.top--;

                    break;
                }
                //memset(nop,'\0',sizeof(nop));
            }
            /*else if(isop(*exp)==2)//自定义连接符
            {

            }*/
        }
    }
    while(wcscmp(stackop.op[stackop.top],L"#")!=0) //把剩余元素出栈(连接符)
    {
        wcscpy(postexp[i++].name,stackop.op[stackop.top]);
        //wprintf(L"出%ls\n",stackop.op[stackop.top]);
        stackop.top--;

    }
    postlen=i;
    return 1;
}

wchar_t str1[15][10]= {L"∧",L"∨",L"¬",L"→",L"↔",L"⊕"};
wchar_t str2[15][10]= {L"&",L"|",L"!",L"-",L"~",L"^"};
char strr[MAX];
wchar_t buf[MAX];

struct newfunc/**新定义逻辑连接符信息**/
{
    wchar_t name[10];//名
    int yuan; //元数
    int zzbf[MAX]; //真值表最后一列
    int no;
} newf[40],tnewf[40],nfunc[11][500][11],ffunc[11][500][11];
int newfnum;
int errflag=0;
wchar_t errstr[10];
int check(wchar_t name[],int dou)/**检查新定义连接符的元数**/
{
    int i;
    for(i=0; i<newfnum; i++)
    {
        if(!wcscmp(name,newf[i].name))
        {
            //wprintf(L"%ls\n",name);
            if(dou==newf[i].yuan-1)return 1;
            else
            {
                wcscpy(errstr,name);
                return 0;
            }
        }
    }
    return 0;
}
void judge(wchar_t *s,wchar_t name[],int state)/**判断逻辑连接符元数是否正确的函数**/
{
    //wprintf(L"%ls\n",name);
    int i,dou,sta,k;
    int len = wcslen(s);
    dou=0;
    k=0;
    sta=0;
    wchar_t nam[10];
    for(i=0; i<len; i++)
    {
        if((*s>=L'a'&&*s<=L'z')||(*s>=L'A'&&*s<=L'Z')||(*s>=L'0'&&*s<=L'9'))
        {
            if(sta==0)sta=1;
            nam[k++]=*s;
        }
        else if(*s==L',')
        {
            dou++;
            sta=0;
            //wcscpy(nam,L"");
            wcsset(nam,L'\0',sizeof(nam));
            k=0;
        }
        else if(*s==L')'&&state==1)
        {
            //wprintf(L"%ls1\n",name);
            if(!check(name,dou))errflag=1;

            return ;
        }
        else if(sta==1&&*s==L'(')/***改***/
        {
            nam[k]=L'\0';

            /*if(*(s+1)==L'('){
                s++;
               while(*s!=L')')s++;
            }*/

            judge(s+1,nam,1);
            state=0;
            wcsset(nam,L'\0',sizeof(nam));
            k=0;
            sta=0;
        }
        else if(sta==0&&*s==L'(')
        {
            state=0;
        }
        else if(state==0&&*s==L')')
        {

        }
        else
        {
            sta=0;
            //wcscpy(nam,L"");
            wcsset(nam,L'\0',sizeof(nam));
            k=0;
        }
        s++;
    }
}
int kuohpp(wchar_t str[])/**括号匹配**/
{
    int len=wcslen(str)-2;
    int i,j;
    struct node
    {
        wchar_t st[MAX];
        int top;
    } kuo;
    kuo.top=-1;
    int loc;
    for(i=0; i<len; i++)
    {
        if(str[i]==L'(')
        {
            kuo.top++;
            kuo.st[kuo.top]=str[i];
        }
        else if(str[i]==L')')
        {
            loc=i;
            if(kuo.top==-1)
            {
                wprintf(L"括号不匹配!\n");
                return i;
            }
            else
            {
                kuo.st[kuo.top]=L' ';
                kuo.top--;
            }
        }
    }
    if(kuo.top>=0)
    {
        wprintf(L"括号不匹配!\n");
        return loc;
    }
    return -1;
}
int find_error(wchar_t str[])/**语法检查**/
{
    int i,k=0,len=wcslen(str)-2;//k为了找最后一个右括号
    //printf("%d\n",len);
    int k1=0,k2=0;
    int state=0;

    int loc=kuohpp(str);
    if(loc!=-1)return loc;
    if(str[0]==L'¬')
    {
        state=1;
    }
    else if(str[0]==L'(')
    {
        state=5;
    }
    else if(str[i]==L'0'||str[i]==L'1')state=2;
    else if((str[0]>=L'a'&&str[0]<=L'z')||(str[0]>=L'A'&&str[0]<=L'Z'))state=4;
    else
    {
        wprintf(L"语法error!!!\n");
        return 0;
    }
    for(i=1; i<len; i++)
    {
        if(str[i]=='\r'||str[i]==' '||str[i]=='\0')return -1;
        switch(state)
        {
        case 1:
            if((str[i]>=L'a'&&str[i]<=L'z')||(str[i]>=L'A'&&str[i]<=L'Z'))state=4;
            else if(str[i]==L'0'||str[i]==L'1')state=2;
            else if(str[i]==L'(')
            {
                state=5;
            }
            else if(str[i]==L'¬')state=1;
            else
            {
                wprintf(L"语法error!!! \n");
                return i;
            }
            break;
        case 2:
            if(str[i]==L'∧'||str[i]==L'∨'||str[i]==L'→'||str[i]==L'↔'||str[i]==L'⊕')state=3;
            else if(str[i]==L')')state=2;
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 3:
            if(str[i]==L'0'||str[i]==L'1')state=2;
            else if((str[i]>=L'a'&&str[i]<=L'z')||(str[i]>=L'A'&&str[i]<=L'Z'))state=4;
            else if(str[i]==L'¬')state=1;
            else if(str[i]==L'(')
            {
                state=5;
            }
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 4:
            if(str[i]==L')'||(str[i]>=L'a'&&str[i]<=L'z')||(str[i]>=L'A'&&str[i]<=L'Z')||(str[i]>=L'0'&&str[i]<=L'9'))state=4;
            else if(str[i]==L'∧'||str[i]==L'∨'||str[i]==L'→'||str[i]==L'↔'||str[i]==L'⊕')state=3;
            else if(str[i]==L'(')
            {
                state=6;
            }
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 5:
            if(str[i]==L'(')
            {
                state=5;
            }
            else if(str[i]==L'¬')state=1;
            else if(str[i]==L'0'||str[i]==L'1')state=2;
            else if((str[i]>=L'a'&&str[i]<=L'z')||(str[i]>=L'A'&&str[i]<=L'Z'))state=4;
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 6:
            if(str[i]==L'(')
            {
                state=7;
            }
            else if(str[i]==L'¬')state=11;
            else if(str[i]==L'0'||str[i]==L'1')state=12;
            else if((str[i]>=L'a'&&str[i]<=L'z')||(str[i]>=L'A'&&str[i]<=L'Z'))state=13;
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 7:
            if(str[i]==L'(')
                state=7;
            else if(str[i]==L'0'||str[i]==L'1')state=9;
            else if((str[i]>=L'a'&&str[i]<=L'z')||(str[i]>=L'A'&&str[i]<=L'Z'))state=8;
            else if(str[i]==L'¬')state=10;
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 8:
            if(str[i]==L')')
            {
                state=14;
            }
            else if(str[i]==L'(')
            {
                state=6;
            }
            else if(str[i]==L'∧'||str[i]==L'∨'||str[i]==L'→'||str[i]==L'↔'||str[i]==L'⊕')state=7;
            else if((str[i]>=L'a'&&str[i]<=L'z')||(str[i]>=L'A'&&str[i]<=L'Z')||(str[i]>=L'0'&&str[i]<=L'9'))state=8;
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 9:
            if(str[i]==L'∧'||str[i]==L'∨'||str[i]==L'→'||str[i]==L'↔'||str[i]==L'⊕')state=7;
            else if(str[i]==L')')
            {
                state=14;
            }
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 10:
            if(str[i]==L'(')state=7;
            else if(str[i]==L'0'||str[i]==L'1')state=9;
            else if(str[i]==L'¬')state=10;
            else if((str[i]>=L'a'&&str[i]<=L'z')||(str[i]>=L'A'&&str[i]<=L'Z'))state=8;
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 11:
            if(str[i]==L'¬')state=11;
            else if(str[i]==L'(')state=7;
            else if(str[i]==L'0'||str[i]==L'1')state=12;
            else if((str[i]>=L'a'&&str[i]<=L'z')||(str[i]>=L'A'&&str[i]<=L'Z'))state=13;
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 12:
            if(str[i]==L')')state=14;
            else if(str[i]==L'∧'||str[i]==L'∨'||str[i]==L'→'||str[i]==L'↔'||str[i]==L'⊕')state=6;
            else if(str[i]==L',')state=6;
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 13:
            if((str[i]>=L'a'&&str[i]<=L'z')||(str[i]>=L'A'&&str[i]<=L'Z')||(str[i]>=L'0'&&str[i]<=L'9'))state=13;
            else if(str[i]==L'∧'||str[i]==L'∨'||str[i]==L'→'||str[i]==L'↔'||str[i]==L'⊕')state=6;
            else if(str[i]==L')')state=14;
            else if(str[i]==L'('||str[i]==L',')state=6;
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        case 14:
            if(str[i]==L')')state=14;
            else if(str[i]==L'∧'||str[i]==L'∨'||str[i]==L'→'||str[i]==L'↔'||str[i]==L'⊕')state=3;
            else if(str[i]==L',')state=6;
            else
            {
                wprintf(L"语法error!!! \n");
                //printf("error in %d\n",i);
                return i;
            }
            break;
        default:
            wprintf(L"语法error!!! \n");
            //printf("error in %d\n",i);
            return i;
        }
    }
    return -1;
}

void strrpc(wchar_t str[],wchar_t oldstr[],wchar_t newstr[])/**为了便于用控制台debug,加一步逻辑连接符替换的处理**/
{
    int len=wcslen(oldstr);
    int p=wcslen(str);
    wchar_t bstr[p];//转换缓冲区
    memset(bstr,0,sizeof(bstr));//初始化为空
    int i;
    for(i = 0; i < p; i++)
    {
        if(wcsncmp(str+i,oldstr,len)==0) //在当前位置取和oldstr等长字符
        {
            wcscat(bstr,newstr);
            i += len;
        }
        wcsncat(bstr,str + i,1);//保存一字节进缓冲区
    }

    wcscpy(str,bstr);
}

int hequ(int p,int q) //合取
{
    return p&q;
}
int xiqu(int p,int q) //析取
{
    return p|q;
}
int fei(int p) //取非
{
    return !p;
}
int yunhan(int p,int q) //蕴含
{
    return (!p)|q;
}
int dengjia(int p,int q) //等价
{
    return ((!p)|q)&&((!q)|p);
}
int yihuo(int p,int q) //异或
{
    return ((!p)&q)|((!q)&p);
}

int zzb[MAX][50];
void tentob(int len,int row,int x)/**十进制转二进制,填真值表的一行**/
{
    int k=0,j=0;
    while(x)
    {
        zzb[row][len-1-j]=x%2;
        k++;
        j++;
        x/=2;
    }
}
void creatzzb(int n)/**生成真值表**/
{
    int i,j,row=(int)pow(2.0,n),col=n;
    for(i=0; i<row; i++)
    {
        tentob(col,i,i);
    }
}

int compvalue(int row)/**按全局真值表的一行,求真值**/
{
    stnum.top=-1;
    int a,b,c,i,j;
    int u[10];
    int op=0;
    memset(stnum.data,0,sizeof(stnum.data));
    while(op<postlen)
    {
        if(!wcscmp(postexp[op].name,L"!"))
        {
            a=stnum.data[stnum.top];
            stnum.top--;
            b=fei(a);
            stnum.top++;
            stnum.data[stnum.top]=b;
        }
        else if(!wcscmp(postexp[op].name,L"-"))
        {
            a=stnum.data[stnum.top];
            stnum.top--;
            b=stnum.data[stnum.top];
            stnum.top--;
            c=yunhan(b,a);
            stnum.top++;
            stnum.data[stnum.top]=c;
        }
        else if(!wcscmp(postexp[op].name,L"^"))
        {
            a=stnum.data[stnum.top];
            stnum.top--;
            b=stnum.data[stnum.top];
            stnum.top--;
            c=yihuo(b,a);
            stnum.top++;
            stnum.data[stnum.top]=c;
        }
        else if(!wcscmp(postexp[op].name,L"&"))
        {
            a=stnum.data[stnum.top];
            stnum.top--;
            b=stnum.data[stnum.top];
            stnum.top--;
            c=hequ(b,a);
            stnum.top++;
            stnum.data[stnum.top]=c;
        }
        else if(!wcscmp(postexp[op].name,L"|"))
        {
            a=stnum.data[stnum.top];
            stnum.top--;
            b=stnum.data[stnum.top];
            stnum.top--;
            c=xiqu(b,a);
            stnum.top++;
            stnum.data[stnum.top]=c;
        }
        else if(!wcscmp(postexp[op].name,L"~"))
        {
            a=stnum.data[stnum.top];
            stnum.top--;
            b=stnum.data[stnum.top];
            stnum.top--;
            //printf("%d %d\n",a,b);
            c=dengjia(b,a);
            //printf("c=%d\n",c);
            stnum.top++;
            stnum.data[stnum.top]=c;
        }
        else
        {
            if(postexp[op].no==-1)
            {
                int s=0,z=postexp[op].nof;
                //printf("\n");
                for(i=0; i<z; i++)
                {
                    u[i]=stnum.data[stnum.top];
                    //printf("%d ",u[i]);
                    stnum.top--;
                    s+=u[i]*(int)pow(2.0,i);
                }
                //printf("%d\n",s);
                stnum.top++;
                for(i=0; i<newfnum; i++)
                {
                    if(!wcscmp(newf[i].name,postexp[op].name))
                    {
                        stnum.data[stnum.top]=newf[i].zzbf[s];
                        break;
                    }
                }
            }
            else
            {
                stnum.top++;
                if(postexp[op].name[0]>=L'0'&&postexp[op].name[0]<=L'9')
                    stnum.data[stnum.top]=_wtoi(postexp[op].name);
                else  /*wprintf(L"%ls %d %d\n",postexp[op].name, postexp[op].no,zzb[row][postexp[op].no]);*/
                {
                    stnum.data[stnum.top]=zzb[row][postexp[op].no];
                }
            }
        }
        op++;
    }
    return stnum.data[stnum.top];
}


wchar_t newexp[MAX];
void inserstr(wchar_t str[],int loc,wchar_t tmp[]) /**往自定义连接符中嵌套字符串**/
{
    int i,stop;
    int len=wcslen(str);
    wcsset(newexp,L'\0',sizeof(newexp));
    if(loc==1)
    {
        for(i=0; i<len; i++)
        {
            if(str[i]==L'(')
            {
                stop=i;
                newexp[i]=L'(';
                break;
            }
            newexp[i]=str[i];
        }
        wcscat(newexp,tmp);
        for(i=stop+1; i<len; i++)
        {
            if(str[i]==L','||str[i]==L')')
            {
                break;
            }
        }
        wcscat(newexp,str+i);

    }
    else
    {
        int k=0,go,zuok=0;
        for(i=0; i<len; i++) //for(i=0; i<3; i++)
        {
            newexp[i]=str[i];
            if(str[i]==L'(')
            {
                //printf("22\n");
                go=i;
                break;
            }
        }
        //wprintf(L"1%ls\n",newexp);
        for(i=go+1; i<len; i++)
        {
            if(str[i]==L'(')
            {
                //zuok++;
                while(!(str[i]==L')'&&zuok==1))
                {
                    if(str[i]==L'(')zuok++;
                    if(str[i]==L')')zuok--;
                    newexp[i]=str[i];
                    i++;
                }
                zuok=0;
                //wprintf(L"1%ls\n",newexp);
            }
            else
            {
                if(str[i]==L',')
                {
                    k++;
                    if(k==loc-1)
                    {
                        stop=i;
                        newexp[i]=L',';
                        break;
                    }
                }

            }
            newexp[i]=str[i];
        }
        wcscat(newexp,tmp);
        for(i=stop+1; i<len; i++)
        {
            if(str[i]==L','||str[i]==L')')
            {
                break;
            }
        }
        wcscat(newexp,str+i);
    }
}
struct finalwk/**求完全集所生成的公式表**/
{
    wchar_t gs[MAX];
    int hide;
} gsb[200];

int gsblen,hidelen;
struct WQJ/**求完全集,存连接符号表**/
{
    wchar_t fname[12];
    int yuan;
} fhb[100];
int fhblen,step;
wchar_t dfsstr[2000];
wchar_t tmps[2000];
int bynum;//逻辑变元数
int dopostexp() /**处理后缀表达式的信息,为求值做准备**/
{
    int fg,bynum=0,i,j,k;
    wchar_t bian[MAX][10];
    for(i=0; i<postlen; i++)
    {
        fg=0;
        if((postexp[i].name[0]>=L'a'&&postexp[i].name[0]<=L'z')||(postexp[i].name[0]>=L'A'&&postexp[i].name[0]<=L'Z'))
        {
            for(k=0; k<newfnum; k++)
            {
                if(!wcscmp(newf[k].name,postexp[i].name))
                {
                    postexp[i].no=-1;
                    postexp[i].nof=newf[k].yuan;
                    fg=1;
                    break;
                }
            }
            for(j=0; j<i; j++)
            {
                if(!wcscmp(postexp[i].name,postexp[j].name))
                {
                    postexp[i].no=postexp[j].no;
                    fg=1;
                    break;
                }
            }
            if(!fg)
            {
                postexp[i].no=bynum++;
            }
        }
        else
        {
            postexp[i].no=-2;//连接符和变元的no区分
        }

    }
    return bynum;
}
int checkexit(wchar_t str[])/**求完全集时,判断新生成的公式是否与已生成公式等价**/
{
    //if(!wcscmp(str,L"f(q,q,q)"))printf("1\n");
    int i,j,k,bynum,sum,row;
    wchar_t tmpe[MAX]=L"";
    for(j=0; j<gsblen; j++)
    {
        //if(!wcscmp(gsb[j],L"f(p,p,p)"))printf("2\n");
        //if(!wcscmp(gsb[j].gs,str))continue;
        wcscat(tmpe,gsb[j].gs);
        wcscat(tmpe,L"~");
        wcscat(tmpe,str);
        //wprintf();
        trans(tmpe);

        bynum=dopostexp();

        memset(zzb,0,sizeof(zzb));
        creatzzb(bynum);
        row=(int)pow(2.0,bynum);
        sum=0;
        for(i=0; i<row; i++)
        {
            zzb[i][bynum]=compvalue(i);
            sum+=zzb[i][bynum];
        }

        if(sum==row)
        {
            /**for(i=0; i<row; i++)
            {
                for(k=0;k<bynum+1;k++)
                printf("%d ",zzb[i][k]);
                printf("\n");
            }
            printf("\n");
            wprintf(L"%d %ls\n",bynum,tmpe);
            wprintf(L"后缀式:\n");
            for(i=0; i<postlen; i++)
                wprintf(L"%ls ",postexp[i].name);
            printf("\n");**/
            return 1;//等价公式永真
        }
        memset(tmpe,L'\0',sizeof(tmpe));
    }
    return 0;
}
int lastgsblen;//上次遍历的公式表长
int fin;
int growexp()/**求完全集时,对每个连接符生成公式**/
{
    //fin=0;
    int i,j,k,t,tmpt;
    gsblen=0;
    for(i=0; i<30; i++)
    {
        gsb[i].hide=0;
        memset(gsb[i].gs,L'\0',sizeof(gsb[i].gs));
    }

    wcscpy(gsb[gsblen++].gs,L"p");
    wcscpy(gsb[gsblen++].gs,L"q");
    for(i=0; i<fhblen; i++)
    {
        if(fhb[i].yuan==0)
        {
            //hidelen++;
            wcscpy(gsb[gsblen++].gs,fhb[i].fname);
            //gsb[gsblen++].hide=1;
        }
    }
    step=0;
    lastgsblen=-1;
    while(step<300)
    {
        for(i=0; i<fhblen; i++)
        {
            //fin++;
            if(fhb[i].yuan==0)continue;
            tmpt=gsblen;
            wcsset(tmps,L'\0',sizeof(tmps));
            wcscat(tmps,fhb[i].fname);
            wcscat(tmps,L"(");
            for(j=0; j<fhb[i].yuan-1; j++)
                wcscat(tmps,L",");
            wcscat(tmps,L")");
            wcscpy(dfsstr,tmps);
            dfs(tmpt,fhb[i].yuan,0);
            step++;
            if(gsblen>=16){/*wprintf(L"有%d个连接符即完全\n",fin);*/
                    return 1;}
        }
        if(lastgsblen==gsblen)return 0;/**两轮遍历所有连接符没有生成新公式,则连接符集合不完全**/
        else lastgsblen=gsblen;
    }
    return 0;
}

int arr[200];
void dfs(int n,int m,int t)/**用向量法,枚举向量,将已求出的公式填入连接符生成新公式**/
{
    if(gsblen>=16)return ;
    if(t==m)
    {
        int j;
        for(j=0; j<m; j++)
        {
            //printf("1");
            inserstr(dfsstr,j+1,gsb[arr[j]].gs);
            //printf("2");
            wcscpy(dfsstr,newexp);
            //wprintf(L"%ls ",newexp);
            //printf("%d ",arr[j]);
        }
        //printf("\n");
        //wprintf(L"%ls ",newexp);
        if(checkexit(newexp)==0)
        {
            //printf("3");
            wcscpy(gsb[gsblen++].gs,newexp);
            //wprintf(L"%ls\n",newexp);
        }
        wcscpy(dfsstr,tmps);
        return ;
    }
    int i;
    for(i=0; i<n; i++)
    {
        arr[t]=i;
        dfs(n,m,t+1);
        if(gsblen>=16)return ;
    }
}

void delkg()/**输入预处理,删除多余空格**/
{
    wchar_t tmp[MAX];
    int i,tol=0,len=wcslen(buf);
    for(i=0; i<len; i++)
    {
        if(buf[i]==L' ')
        {
            while(buf[i]==L' ')
            {
                i++;
            }
        }
        tmp[tol++]=buf[i];
    }
    tmp[tol]=L'\0';
    wcscpy(buf,tmp);
}
void Hilbert(wchar_t op[],FILE *file2)/**一个集成处理的函数**/
{
    wchar_t tmp[MAX]=L"";
    wcscpy(tmp,op);
    int i,j;
    for(j=0; j<6; j++)
    {
        strrpc(op,str1[j],str2[j]);
    }

    trans(op);
    bynum=dopostexp();
    memset(zzb,0,sizeof(zzb));
    creatzzb(bynum);
    int row=(int)pow(2.0,bynum),col=bynum+1;
    int sum=0;
    for(i=0; i<row; i++)
    {
        zzb[i][bynum]=compvalue(i);
        sum+=zzb[i][bynum];
    }
    if(sum==row)
    {
        fwprintf(file2,L"%ls\n",tmp);
    }
}
int vis[30],Cantor[30];
int ni[22],fni[22];
//int clu[15][15][15][15][15];
int clu2[15][15],clu3[15][15][15],clu4[15][15][15][15],clu5[15][15][15][15][15];
int clu6[15][15][15][15][15][15];
int main()
{
    int i,j,k,len,opera;
    int cas=-1;
    wchar_t rule[40][1024];
    setlocale(LC_ALL, "");
    char cxf[1024];
    wchar_t buf2[1024],tmp[1024];
    FILE *file = _wfopen(L"test.txt", L"rb");
    if (file == NULL)
    {
        fprintf(stderr, "Source file open error.\n");
        return -1;
    }

    FILE *file2 = _wfopen(L"output.txt", L"w, ccs=UNICODE");
    if(file2==NULL)
    {
        fprintf(stderr, "Source file open error.\n");
        return -1;
    }
    wprintf(L"1.求真值\n2.求完全集\n3.求二元及以内所有逻辑连接词集合的最小完全集\n请输入数字表示您要执行的功能:\n");
    scanf("%d",&opera);
    if(opera==1)
    {
        wprintf(L"正在读取文件test.txt...\n");
        fgetws(buf,1024,file);//先读第一行
        if(buf[1]!=L'%'&&buf[1]!=L'\r') //是公式
        {
            if(cas==-1)
            {
                delkg();
                len=wcslen(buf);
                //wcstombs(cxf, buf, len);
                //fputws(cxf+1,file2);
                fputws(buf+1,file2);
                //fwprintf(file2,L"%ls\n",buf);
                wcscpy(buf2,buf+1);
                cas++;
                //fprintf(file2,"<br/>");
            }
        }
        while(fgetws(buf, 1024, file) != NULL)
        {
            if(buf[0]==L'\r'||buf[0]==L'%')continue;
            else
            {
                len=wcslen(buf);
                //wcstombs(cxf, buf, len);
            }
            if(cas==-1)//公式
            {
                delkg();
                //fputws(cxf,file2);
                fputws(buf,file2);
                wcscpy(buf2,buf);
                cas++;
            }
            else
            {
                //fputws(cxf,file2);
                fputws(buf,file2);
                if(buf[0]==L'#')
                {
                    if(((buf[1]>=L'a'&&buf[1]<=L'z')||(buf[1]>=L'A'&&buf[1]<=L'Z')))
                    {
                        wcscpy(rule[cas],buf+1);
                    }
                    else continue;
                }
                else wcscpy(rule[cas],buf);
                cas++;
            }
            //fprintf(file2,"<br/>");
        }
        wprintf(L"文件test.txt读取完毕.\n");
        wcscpy(tmp,buf2);
        wcscpy(buf2,buf);
        wcscpy(buf,tmp);

        wprintf(L"公式:\n");
        len=wcslen(buf)-2;
        for(i=0; i<len; i++)
            wprintf(L"%lc",buf[i]);
        printf("\n");

        wprintf(L"额外规则:\n");
        for(i=0; i<cas; i++)
        {
            wprintf(L"%ls",rule[i]);/*****/
        }

        int j1,j2,j3,flag;
        wchar_t yuan[3],zzbf[MAX];
        for(i=0; i<cas; i++)
        {
            //wcstombs(rules[i], rule[i], 1024);
            int leng=wcslen(rule[i]);

            j1=0,j2=0,j3=0,flag=0;
            for(k=0; k<leng; k++)
            {
                if(rule[i][k]==L'%')break;
                if(rule[i][k]==L' ')
                {
                    flag++;
                    while(rule[i][k]==L' ')
                    {
                        k++;
                    }
                }
                if(rule[i][k]!=L' ')
                {
                    if(flag==0)
                        newf[i].name[j1++]=rule[i][k];
                    else if(flag==1)
                        yuan[j2++]=rule[i][k];
                    else if(flag==2)
                        zzbf[j3++]=rule[i][k];
                }
            }
            newf[i].name[j1]=L'\0';
            /*****新定义的连接符加入表******/

            wcscpy(lpri[prinum].ch,newf[i].name);
            wcscpy(rpri[prinum].ch,newf[i].name);
            lpri[prinum].pri=lst;
            rpri[prinum].pri=rst;
            prinum++;
            lst+=2;
            rst+=2;
            /***********/
            yuan[j2]=L'\0';
            newf[i].yuan=_wtoi(yuan);
            for(j=0; j<(int)pow(2.0,newf[i].yuan); j++)
            {
                newf[i].zzbf[j]=zzbf[j]-L'0';
            }
        }
        newfnum=cas;

        /*for(i=0;i<cas;i++){
            wprintf(L"%ls\n",newf[i].name);
            printf("%d\n",newf[i].yuan);
            for(j=0;j<(int)pow(2.0,newf[i].yuan);j++)
            printf("%d ",newf[i].zzbf[j]);
            printf("\n");
        }*/
        int loc=find_error(buf);
        if(loc==-1)
        {
            wchar_t name[10]=L"";
            judge(buf,name,0);
            if(errflag==1)
            {
                wprintf(L"出现逻辑连接符 %ls 元数错误或命名错误!\n",errstr);
            }
            else
            {
                size_t ret;
                for(i=0; i<6; i++)
                {
                    strrpc(buf,str1[i],str2[i]);
                }
                //find_error(buf);
                if(trans(buf)) //中缀转后缀
                {

                    wprintf(L"后缀式:\n");
                    for(i=0; i<postlen; i++)
                        wprintf(L"%ls ",postexp[i].name);
                    printf("\n");

                    bynum=dopostexp();
                    creatzzb(bynum);
                    int row=(int)pow(2.0,bynum),col=bynum+1;
                    int sum=0;
                    for(i=0; i<row; i++)
                    {
                        zzb[i][bynum]=compvalue(i);
                        sum+=zzb[i][bynum];
                    }

                    ret=wcstombs(strr, buf, 1024);
                    strr[strlen(strr)-1]='\0';/*****/
                    wprintf(L"符号替换后的公式:\n");
                    printf("%s\n",strr);

                    if(sum==0)wprintf(L"这是永假式\n");
                    else if(sum==row)wprintf(L"这是永真式\n");
                    else
                    {
                        wprintf(L"这是可满足式,成真赋值是:\n");
                        int hsh[100]= {0};
                        for(i=0; i<postlen; i++)
                            if(postexp[i].no>-1&&hsh[postexp[i].no]==0)
                            {
                                hsh[postexp[i].no]=1;
                                wprintf(L"%5ls ",postexp[i].name);
                            }
                        wprintf(L" 真值\n");

                        for(i=0; i<row; i++)
                        {
                            if(zzb[i][col-1]==1)
                            {
                                for(j=0; j<col; j++)
                                {
                                    printf("%5d ",zzb[i][j]);
                                }
                                printf("\n");
                            }
                        }
                    }
                }///
            }
        }
        else
        {
            wprintf(L"命题公式错误,错误信息见output.txt\n");
            char buaa[MAX][10];
            wchar_t to100[10]=L"";
            for(i=0; i<len; i++)
            {
                to100[0]=buf[i];
                to100[1]=L'\0';
                wcstombs(buaa[i], to100, 1024);
                wcscpy(to100,L"");
            }
            //fprintf(file2,"<br/>");
            fwprintf(file2,L"ERROR IN 下标%d:\n",loc);
            for(i=0; i<len; i++)
            {
                if(i==loc)
                {
                    //fprintf(file2,"<font color='red'>");fprintf(file2,"%s",buaa[i]);
                    fwprintf(file2,L"?");
                    //fprintf(file2,"</font>");
                }
                else fwprintf(file2,L"%lc",buf[i]);//fprintf(file2,"%s",buaa[i]);
            }
        }
        //fprintf(file2,"</body>");
        //fprintf(file2,"</html>");
    }
    else if(opera==2)
    {
        FILE *file3 = _wfopen(L"output.txt", L"w, ccs=UNICODE");
        if (file3 == NULL)
        {
            fprintf(stderr, "Source file open error.\n");
            return -1;
        }
        cas=0;
        wprintf(L"正在读取文件test.txt...\n");
        fgetws(buf,1024,file);//先读第一行
        if(buf[1]!=L'%'&&buf[1]!=L'\r') //不是空行
        {
            if(cas==0)
            {
                //len=wcslen(buf+1);
                //wcstombs(cxf, buf, len);
                //fputws(cxf+1,file3);
                if(buf[1]==L'#')
                {
                    if(((buf[2]>=L'a'&&buf[2]<=L'z')||(buf[2]>=L'A'&&buf[2]<=L'Z')))
                    {
                        wcscpy(rule[cas++],buf+2);
                    }
                }
            }
        }
        while(fgetws(buf, 1024, file) != NULL)
        {
            if(buf[0]==L'\r'||buf[0]==L'%')continue;
            else
            {
                //len=wcslen(buf);
                //wcstombs(cxf, buf, len);
                //fputws(cxf,file3);
                if(buf[0]==L'#')
                {
                    if(((buf[1]>=L'a'&&buf[1]<=L'z')||(buf[1]>=L'A'&&buf[1]<=L'Z')))
                    {
                        wcscpy(rule[cas],buf+1);
                    }
                    else continue;
                }
                else wcscpy(rule[cas],buf);
                cas++;
            }
        }
        wprintf(L"文件test.txt读取完毕.\n");
        int j1,j2,j3,flag;
        wchar_t yuan[3],zzbf[MAX];
        for(i=0; i<cas; i++)
        {
            //wcstombs(rules[i], rule[i], 1024);
            int leng=wcslen(rule[i]);

            j1=0,j2=0,j3=0,flag=0;
            for(k=0; k<leng; k++)
            {
                if(rule[i][k]==L'%')break;
                if(rule[i][k]==L' ')
                {
                    flag++;
                    while(rule[i][k]==L' ')
                    {
                        k++;
                    }
                }
                if(rule[i][k]!=L' ')
                {
                    if(flag==0)
                        newf[i].name[j1++]=rule[i][k];
                    else if(flag==1)
                        yuan[j2++]=rule[i][k];
                    else if(flag==2)
                        zzbf[j3++]=rule[i][k];
                }
            }
            newf[i].name[j1]=L'\0';
            /*****新定义的连接符加入表******/

            wcscpy(lpri[prinum].ch,newf[i].name);
            wcscpy(rpri[prinum].ch,newf[i].name);

            lpri[prinum].pri=lst;
            rpri[prinum].pri=rst;
            prinum++;
            lst+=2;
            rst+=2;
            /***********/
            yuan[j2]=L'\0';
            newf[i].yuan=_wtoi(yuan);
            wcscpy(fhb[fhblen].fname,newf[i].name);
            //if(newf[i].yuan==0)fhb[fhblen].zhi=zzbf[0]-L'0';
            fhb[fhblen++].yuan=newf[i].yuan;
            for(j=0; j<(int)pow(2.0,newf[i].yuan); j++)
            {
                newf[i].zzbf[j]=zzbf[j]-L'0';
            }
        }
        /*for(i=0;i<cas;i++){
            wprintf(L"%ls\n",newf[i].name);
            printf("%d\n",newf[i].yuan);
            for(j=0;j<(int)pow(2.0,newf[i].yuan);j++)
            printf("%d ",newf[i].zzbf[j]);
            printf("\n");
        }*/
        newfnum=cas;

        int fff=growexp();
        wprintf(L"全部%d个公式:\n",gsblen);
        for(i=0; i<gsblen; i++)
            wprintf(L"%ls\n",gsb[i].gs);

        if(fff==1)
        {
            wprintf(L"此逻辑连接词集合是完全集\n");
            wprintf(L"其中,与最小完全集匹配的公式见output.txt\n");

            wchar_t op1[MAX],op2[MAX],op3[MAX];
            for(i=0; i<gsblen; i++)
            {
                wcscat(op1,L"p→q↔");
                wcscat(op1,gsb[i].gs);

                wcscat(op3,L"¬p↔");
                wcscat(op3,gsb[i].gs);

                Hilbert(op1,file3);
                Hilbert(op3,file3);

                wcsset(op1,L'\0',sizeof(op1));
                wcsset(op3,L'\0',sizeof(op3));
            }
            //
        }
        else
        {
            wprintf(L"此逻辑连接词集合不是完全集\n");
        }
        fclose(file3);
    }
    else  /***************/
    {
        FILE *file4 = _wfopen(L"wqj.txt", L"rb");
        if (file4 == NULL)
        {
            fprintf(stderr, "Source file open error.\n");
            return -1;
        }
        FILE *file5 = _wfopen(L"output.txt", L"w, ccs=UNICODE");
        if (file5 == NULL)
        {
            fprintf(stderr, "Source file open error.\n");
            return -1;
        }
        cas=0;
        fgetws(buf,1024,file4);//先读第一行
        if(buf[1]!=L'%'&&buf[1]!=L'\r') //不是空行
        {
            if(cas==0)
            {
                fputws(buf+1,file5);
                if(buf[1]==L'#')
                {
                    if(((buf[2]>=L'a'&&buf[2]<=L'z')||(buf[2]>=L'A'&&buf[2]<=L'Z')))
                    {
                        wcscpy(rule[cas++],buf+2);
                    }
                }
            }
        }
        while(fgetws(buf, 1024, file4) != NULL)
        {
            if(buf[0]==L'\r'||buf[0]==L'%')continue;
            else
            {
                fputws(buf,file5);
                if(buf[0]==L'#')
                {
                    if(((buf[1]>=L'a'&&buf[1]<=L'z')||(buf[1]>=L'A'&&buf[1]<=L'Z')))
                    {
                        wcscpy(rule[cas],buf+1);
                    }
                    else continue;
                }
                else wcscpy(rule[cas],buf);
                cas++;
            }
        }
        int j1,j2,j3,flag;
        wchar_t yuan[3],zzbf[MAX];
        for(i=0; i<cas; i++)
        {
            //wcstombs(rules[i], rule[i], 1024);
            int leng=wcslen(rule[i]);

            j1=0,j2=0,j3=0,flag=0;
            for(k=0; k<leng; k++)
            {
                if(rule[i][k]==L'%')break;
                if(rule[i][k]==L' ')
                {
                    flag++;
                    while(rule[i][k]==L' ')
                    {
                        k++;
                    }
                }
                if(rule[i][k]!=L' ')
                {
                    if(flag==0)
                        newf[i].name[j1++]=rule[i][k];
                    else if(flag==1)
                        yuan[j2++]=rule[i][k];
                    else if(flag==2)
                        zzbf[j3++]=rule[i][k];
                }
            }
            newf[i].name[j1]=L'\0';
            /*****新定义的连接符加入表******/

            wcscpy(lpri[prinum].ch,newf[i].name);
            wcscpy(rpri[prinum].ch,newf[i].name);

            lpri[prinum].pri=lst;
            rpri[prinum].pri=rst;
            prinum++;
            lst+=2;
            rst+=2;
            /***********/
            yuan[j2]=L'\0';
            newf[i].yuan=_wtoi(yuan);
            //wcscpy(fhb[fhblen].fname,newf[i].name);
            //fhb[fhblen++].yuan=newf[i].yuan;
            for(j=0; j<(int)pow(2.0,newf[i].yuan); j++)
            {
                newf[i].zzbf[j]=zzbf[j]-L'0';
            }
        }
        newfnum=cas;
        fwprintf(file5,L"\n自己构成完全集的有:\n");
        int mou=0;
        for(i=0; i<newfnum; i++) //求单个构成完全集的字符
        {
            wcscpy(fhb[0].fname,newf[i].name);
            fhb[0].yuan=newf[i].yuan;
            gsblen=0;
            fhblen=1;
            if(growexp())
            {
                fwprintf(file5,L"%ls %d ",newf[i].name,newf[i].yuan);
                for(j=0; j<(int)pow(2.0,newf[i].yuan); j++)
                    fwprintf(file5,L"%d",newf[i].zzbf[j]);
                fwprintf(file5,L"\n\n");
                //wprintf(L"全部%d个公式:\n",gsblen);
            }
            else
            {
                wcscpy(tnewf[mou].name,newf[i].name);
                tnewf[mou].yuan=newf[i].yuan;
                for(j=0; j<(int)pow(2.0,newf[i].yuan); j++)
                    tnewf[mou].zzbf[j]=newf[i].zzbf[j];
                mou++;
            }
            fhblen=0;
            gsblen=0;
        }
        wprintf(L"剩余不完全:%d\n",mou);

        //memset(vis,0,sizeof(vis));
        //Riemann(mou,2,0);
        for(i=0; i<mou; i++)
        {
            for(k=i+1; k<mou; k++)
            {
                int u;
                fhblen=0;
                wcscpy(fhb[fhblen].fname,tnewf[i].name);
                fhb[fhblen++].yuan=tnewf[i].yuan;
                wcscpy(fhb[fhblen].fname,tnewf[k].name);
                fhb[fhblen++].yuan=tnewf[k].yuan;

                if(growexp())
                {
                    int tt;
                    Cantor[0]=i;
                    Cantor[1]=k;
                    for(u=0; u<2; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(nfunc[2][ni[2]][u].name,tnewf[Cantor[u]].name);
                        nfunc[2][ni[2]][u].yuan=tnewf[Cantor[u]].yuan;
                        for(j=0; j<tt; j++)
                            nfunc[2][ni[2]][u].zzbf[j]=tnewf[Cantor[u]].zzbf[j];
                    }
                    ni[2]++;clu2[i][k]++;
                    //clu[i+1][k+1][0][0][0]++;
                }
                else
                {
                    int tt;
                    Cantor[0]=i;
                    Cantor[1]=k;
                    for(u=0; u<2; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(ffunc[2][fni[2]][u].name,tnewf[Cantor[u]].name);
                        ffunc[2][fni[2]][u].yuan=tnewf[Cantor[u]].yuan;
                        for(j=0; j<tt; j++)
                            ffunc[2][fni[2]][u].zzbf[j]=tnewf[Cantor[u]].zzbf[j];
                        ffunc[2][fni[2]][u].no=Cantor[u];
                    }
                    fni[2]++;
                }
            }
        }
        wprintf(L"剩余不完全:%d\n",fni[2]);
        int nop[15];
        int fy=2,flagx;

        for(i=0;i<fni[fy];i++){
                for(j=0;j<mou;j++){
                    flagx=0;
               for(k=0;k<fy;k++){
                    nop[k]=ffunc[fy][i][k].no;
                    if(nop[k]>=j){flagx=1;break;}
               if(clu2[j][nop[k]]||clu2[nop[k]][j]){flagx=1;break;}
               }
               if(flagx)continue;
                int u;
                fhblen=0;

                for(k=0;k<fy;k++){
                wcscpy(fhb[fhblen].fname,ffunc[fy][i][k].name);
                fhb[fhblen++].yuan=ffunc[fy][i][k].yuan;
                }
                wcscpy(fhb[fhblen].fname,tnewf[j].name);
                fhb[fhblen++].yuan=tnewf[j].yuan;
                int yy=3;
                int tt,v;
                    for(v=0;v<fy;v++){
                        Cantor[v]=ffunc[fy][i][v].no;
                    }
                    Cantor[fy]=j;
                if(growexp())
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(nfunc[yy][ni[yy]][u].name,tnewf[Cantor[u]].name);
                        nfunc[yy][ni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            nfunc[yy][ni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                    }
                    ni[yy]++;//wprintf(L"\n");
                    //clu[i+1][k+1][0][0][0]++;
                    clu3[Cantor[0]][Cantor[1]][Cantor[2]]++;
                }
                else
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(ffunc[yy][fni[yy]][u].name,tnewf[Cantor[u]].name);
                        ffunc[yy][fni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            ffunc[yy][fni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                        ffunc[yy][fni[yy]][u].no=Cantor[u];
                    }
                    fni[yy]++;
                }
            }
        }
        wprintf(L"剩余不完全:%d\n",fni[3]);

        fy=3;
        for(i=0;i<fni[fy];i++){
                for(j=0;j<mou;j++){
                    flagx=0;
               for(k=0;k<fy;k++){
                    nop[k]=ffunc[fy][i][k].no;
                    if(nop[k]>=j){flagx=1;break;}
                    if(clu2[nop[k]][j]){flagx=1;break;}
               }
               if(clu3[nop[0]][nop[1]][j]||clu3[nop[0]][nop[2]][j]||clu3[nop[1]][nop[2]][j]){flagx=1;}
               if(flagx)continue;
                int u;
                fhblen=0;

                for(k=0;k<fy;k++){
                wcscpy(fhb[fhblen].fname,ffunc[fy][i][k].name);
                fhb[fhblen++].yuan=ffunc[fy][i][k].yuan;
                }
                wcscpy(fhb[fhblen].fname,tnewf[j].name);
                fhb[fhblen++].yuan=tnewf[j].yuan;
                int yy=4;
                int tt,v;
                    for(v=0;v<fy;v++){
                        Cantor[v]=ffunc[fy][i][v].no;
                    }
                    Cantor[fy]=j;
                if(growexp())
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(nfunc[yy][ni[yy]][u].name,tnewf[Cantor[u]].name);
                        nfunc[yy][ni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            nfunc[yy][ni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                    }
                    ni[yy]++;//wprintf(L"\n");
                    //clu[i+1][k+1][0][0][0]++;
                    clu4[Cantor[0]][Cantor[1]][Cantor[2]][Cantor[3]]++;
                }
                else
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(ffunc[yy][fni[yy]][u].name,tnewf[Cantor[u]].name);
                        ffunc[yy][fni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            ffunc[yy][fni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                        ffunc[yy][fni[yy]][u].no=Cantor[u];
                    }
                    fni[yy]++;
                }
            }
        }
        wprintf(L"剩余不完全:%d\n",fni[4]);
        fy=4;
        for(i=0;i<fni[fy];i++){
                for(j=0;j<mou;j++){
                    flagx=0;
               for(k=0;k<fy;k++){
                    nop[k]=ffunc[fy][i][k].no;
                    if(nop[k]>=j){flagx=1;break;}
                    if(clu2[nop[k]][j]){flagx=1;break;}
               }
               if(clu3[nop[0]][nop[1]][j]||clu3[nop[0]][nop[2]][j]||clu3[nop[0]][nop[3]][j]||clu3[nop[1]][nop[2]][j]){flagx=1;}
               if(clu3[nop[1]][nop[3]][j]||clu3[nop[2]][nop[3]][j]){flagx=1;}
               if(clu4[nop[0]][nop[1]][nop[2]][j]||clu4[nop[0]][nop[1]][nop[3]][j]||clu4[nop[0]][nop[2]][nop[3]][j]){flagx=1;}
               if(clu4[nop[1]][nop[2]][nop[3]][j]){flagx=1;}
               if(flagx)continue;
                int u;
                fhblen=0;

                for(k=0;k<fy;k++){
                wcscpy(fhb[fhblen].fname,ffunc[fy][i][k].name);
                fhb[fhblen++].yuan=ffunc[fy][i][k].yuan;
                }
                wcscpy(fhb[fhblen].fname,tnewf[j].name);
                fhb[fhblen++].yuan=tnewf[j].yuan;
                int yy=5;
                int tt,v;
                    for(v=0;v<fy;v++){
                        Cantor[v]=ffunc[fy][i][v].no;
                    }
                    Cantor[fy]=j;
                if(growexp())
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(nfunc[yy][ni[yy]][u].name,tnewf[Cantor[u]].name);
                        nfunc[yy][ni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            nfunc[yy][ni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                    }
                    ni[yy]++;//wprintf(L"\n");
                    //clu[i+1][k+1][0][0][0]++;
                    clu5[Cantor[0]][Cantor[1]][Cantor[2]][Cantor[3]][Cantor[4]]++;
                }
                else
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(ffunc[yy][fni[yy]][u].name,tnewf[Cantor[u]].name);
                        ffunc[yy][fni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            ffunc[yy][fni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                        ffunc[yy][fni[yy]][u].no=Cantor[u];
                    }
                    fni[yy]++;
                }
            }
        }

       wprintf(L"剩余不完全:%d\n",fni[5]);
        fy=5;
        for(i=0;i<fni[fy];i++){
                for(j=0;j<mou;j++){
                    flagx=0;
               for(k=0;k<fy;k++){
                    nop[k]=ffunc[fy][i][k].no;
                    if(nop[k]>=j){flagx=1;break;}
                    if(clu2[nop[k]][j]){flagx=1;break;}
               }
               if(clu3[nop[0]][nop[1]][j]||clu3[nop[0]][nop[2]][j]||clu3[nop[0]][nop[3]][j]|| clu3[nop[0]][nop[4]][j]||clu3[nop[1]][nop[2]][j]){flagx=1;}
               if(clu3[nop[1]][nop[3]][j]|| clu3[nop[1]][nop[4]][j]||clu3[nop[2]][nop[3]][j]||clu3[nop[2]][nop[4]][j]){flagx=1;}
               if(clu4[nop[0]][nop[1]][nop[2]][j]||clu4[nop[0]][nop[1]][nop[3]][j]||clu4[nop[0]][nop[1]][nop[4]][j]||clu4[nop[0]][nop[2]][nop[3]][j]){flagx=1;}
               if(clu4[nop[0]][nop[2]][nop[4]][j]||clu4[nop[0]][nop[3]][nop[4]][j]||clu4[nop[1]][nop[2]][nop[3]][j]||clu4[nop[1]][nop[2]][nop[4]][j]||clu4[nop[1]][nop[3]][nop[4]][j]||clu4[nop[2]][nop[3]][nop[4]][j]){flagx=1;}

               if(clu5[nop[0]][nop[1]][nop[2]][nop[3]][j]||clu5[nop[0]][nop[1]][nop[2]][nop[4]][j]||clu5[nop[0]][nop[1]][nop[3]][nop[4]][j]){flagx=1;}
               if(clu5[nop[0]][nop[2]][nop[3]][nop[4]][j]||clu5[nop[1]][nop[2]][nop[3]][nop[4]][j]){flagx=1;}
               if(flagx)continue;
                int u;
                fhblen=0;

                for(k=0;k<fy;k++){
                wcscpy(fhb[fhblen].fname,ffunc[fy][i][k].name);
                fhb[fhblen++].yuan=ffunc[fy][i][k].yuan;
                }
                wcscpy(fhb[fhblen].fname,tnewf[j].name);
                fhb[fhblen++].yuan=tnewf[j].yuan;
                int yy=6;
                int tt,v;
                    for(v=0;v<fy;v++){
                        Cantor[v]=ffunc[fy][i][v].no;
                    }
                    Cantor[fy]=j;
                if(growexp())
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(nfunc[yy][ni[yy]][u].name,tnewf[Cantor[u]].name);
                        nfunc[yy][ni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            nfunc[yy][ni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                    }
                    ni[yy]++;//wprintf(L"\n");
                    //clu[i+1][k+1][0][0][0]++;
                    clu6[Cantor[0]][Cantor[1]][Cantor[2]][Cantor[3]][Cantor[4]][Cantor[5]]++;
                }
                else
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(ffunc[yy][fni[yy]][u].name,tnewf[Cantor[u]].name);
                        ffunc[yy][fni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            ffunc[yy][fni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                        ffunc[yy][fni[yy]][u].no=Cantor[u];
                    }
                    fni[yy]++;
                }
            }
        }
        wprintf(L"剩余不完全:%d\n",fni[6]);
        fy=6;
        for(i=0;i<fni[fy];i++){
                for(j=0;j<mou;j++){
                    flagx=0;
               for(k=0;k<fy;k++){
                    nop[k]=ffunc[fy][i][k].no;
                    if(nop[k]>=j){flagx=1;break;}
                    if(clu2[nop[k]][j]){flagx=1;break;}
               }
               if(clu3[nop[0]][nop[1]][j]||clu3[nop[0]][nop[2]][j]||clu3[nop[0]][nop[3]][j]|| clu3[nop[0]][nop[4]][j]||clu3[nop[1]][nop[2]][j]){flagx=1;}
               if(clu3[nop[1]][nop[3]][j]|| clu3[nop[1]][nop[4]][j]||clu3[nop[2]][nop[3]][j]||clu3[nop[2]][nop[4]][j]){flagx=1;}
               if(clu4[nop[0]][nop[1]][nop[2]][j]||clu4[nop[0]][nop[1]][nop[3]][j]||clu4[nop[0]][nop[1]][nop[4]][j]||clu4[nop[0]][nop[2]][nop[3]][j]){flagx=1;}
               if(clu4[nop[0]][nop[2]][nop[4]][j]||clu4[nop[0]][nop[3]][nop[4]][j]||clu4[nop[1]][nop[2]][nop[3]][j]||clu4[nop[1]][nop[2]][nop[4]][j]||clu4[nop[1]][nop[3]][nop[4]][j]||clu4[nop[2]][nop[3]][nop[4]][j]){flagx=1;}

               if(clu5[nop[0]][nop[1]][nop[2]][nop[3]][j]||clu5[nop[0]][nop[1]][nop[2]][nop[4]][j]||clu5[nop[0]][nop[1]][nop[3]][nop[4]][j]){flagx=1;}
               if(clu5[nop[0]][nop[2]][nop[3]][nop[4]][j]||clu5[nop[1]][nop[2]][nop[3]][nop[4]][j]){flagx=1;}
               if(flagx)continue;
                int u;
                fhblen=0;

                for(k=0;k<fy;k++){
                wcscpy(fhb[fhblen].fname,ffunc[fy][i][k].name);
                fhb[fhblen++].yuan=ffunc[fy][i][k].yuan;
                }
                wcscpy(fhb[fhblen].fname,tnewf[j].name);
                fhb[fhblen++].yuan=tnewf[j].yuan;
                int yy=7;
                int tt,v;
                    for(v=0;v<fy;v++){
                        Cantor[v]=ffunc[fy][i][v].no;
                    }
                    Cantor[fy]=j;
                if(growexp())
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(nfunc[yy][ni[yy]][u].name,tnewf[Cantor[u]].name);
                        nfunc[yy][ni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            nfunc[yy][ni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                    }
                    ni[yy]++;//wprintf(L"\n");
                    //clu[i+1][k+1][0][0][0]++;
                }
                else
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(ffunc[yy][fni[yy]][u].name,tnewf[Cantor[u]].name);
                        ffunc[yy][fni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            ffunc[yy][fni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                        ffunc[yy][fni[yy]][u].no=Cantor[u];
                    }
                    fni[yy]++;
                }
            }
        }
        wprintf(L"剩余不完全:%d\n",fni[7]);
        fy=7;
        for(i=0;i<fni[fy];i++){
                for(j=0;j<mou;j++){
                    flagx=0;
               for(k=0;k<fy;k++){
                    nop[k]=ffunc[fy][i][k].no;
                    if(nop[k]>=j){flagx=1;break;}
                    if(clu2[nop[k]][j]){flagx=1;break;}
               }
               if(clu3[nop[0]][nop[1]][j]||clu3[nop[0]][nop[2]][j]||clu3[nop[0]][nop[3]][j]|| clu3[nop[0]][nop[4]][j]||clu3[nop[1]][nop[2]][j]){flagx=1;}
               if(clu3[nop[1]][nop[3]][j]|| clu3[nop[1]][nop[4]][j]||clu3[nop[2]][nop[3]][j]||clu3[nop[2]][nop[4]][j]){flagx=1;}
               if(clu4[nop[0]][nop[1]][nop[2]][j]||clu4[nop[0]][nop[1]][nop[3]][j]||clu4[nop[0]][nop[1]][nop[4]][j]||clu4[nop[0]][nop[2]][nop[3]][j]){flagx=1;}
               if(clu4[nop[0]][nop[2]][nop[4]][j]||clu4[nop[0]][nop[3]][nop[4]][j]||clu4[nop[1]][nop[2]][nop[3]][j]||clu4[nop[1]][nop[2]][nop[4]][j]||clu4[nop[1]][nop[3]][nop[4]][j]||clu4[nop[2]][nop[3]][nop[4]][j]){flagx=1;}

               if(clu5[nop[0]][nop[1]][nop[2]][nop[3]][j]||clu5[nop[0]][nop[1]][nop[2]][nop[4]][j]||clu5[nop[0]][nop[1]][nop[3]][nop[4]][j]){flagx=1;}
               if(clu5[nop[0]][nop[2]][nop[3]][nop[4]][j]||clu5[nop[1]][nop[2]][nop[3]][nop[4]][j]){flagx=1;}
               if(flagx)continue;
                int u;
                fhblen=0;

                for(k=0;k<fy;k++){
                wcscpy(fhb[fhblen].fname,ffunc[fy][i][k].name);
                fhb[fhblen++].yuan=ffunc[fy][i][k].yuan;
                }
                wcscpy(fhb[fhblen].fname,tnewf[j].name);
                fhb[fhblen++].yuan=tnewf[j].yuan;
                int yy=8;
                int tt,v;
                    for(v=0;v<fy;v++){
                        Cantor[v]=ffunc[fy][i][v].no;
                    }
                    Cantor[fy]=j;
                if(growexp())
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(nfunc[yy][ni[yy]][u].name,tnewf[Cantor[u]].name);
                        nfunc[yy][ni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            nfunc[yy][ni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                    }
                    ni[yy]++;//wprintf(L"\n");
                    //clu[i+1][k+1][0][0][0]++;
                }
                else
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(ffunc[yy][fni[yy]][u].name,tnewf[Cantor[u]].name);
                        ffunc[yy][fni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            ffunc[yy][fni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                        ffunc[yy][fni[yy]][u].no=Cantor[u];
                    }
                    fni[yy]++;
                }
            }
        }
        wprintf(L"剩余不完全:%d\n",fni[8]);
        fy=8;
        for(i=0;i<fni[fy];i++){
                for(j=0;j<mou;j++){
                    flagx=0;
               for(k=0;k<fy;k++){
                    nop[k]=ffunc[fy][i][k].no;
                    if(nop[k]>=j){flagx=1;break;}
                    if(clu2[nop[k]][j]){flagx=1;break;}
               }
               if(clu3[nop[0]][nop[1]][j]||clu3[nop[0]][nop[2]][j]||clu3[nop[0]][nop[3]][j]|| clu3[nop[0]][nop[4]][j]||clu3[nop[1]][nop[2]][j]){flagx=1;}
               if(clu3[nop[1]][nop[3]][j]|| clu3[nop[1]][nop[4]][j]||clu3[nop[2]][nop[3]][j]||clu3[nop[2]][nop[4]][j]){flagx=1;}
               if(clu4[nop[0]][nop[1]][nop[2]][j]||clu4[nop[0]][nop[1]][nop[3]][j]||clu4[nop[0]][nop[1]][nop[4]][j]||clu4[nop[0]][nop[2]][nop[3]][j]){flagx=1;}
               if(clu4[nop[0]][nop[2]][nop[4]][j]||clu4[nop[0]][nop[3]][nop[4]][j]||clu4[nop[1]][nop[2]][nop[3]][j]||clu4[nop[1]][nop[2]][nop[4]][j]||clu4[nop[1]][nop[3]][nop[4]][j]||clu4[nop[2]][nop[3]][nop[4]][j]){flagx=1;}

               if(clu5[nop[0]][nop[1]][nop[2]][nop[3]][j]||clu5[nop[0]][nop[1]][nop[2]][nop[4]][j]||clu5[nop[0]][nop[1]][nop[3]][nop[4]][j]){flagx=1;}
               if(clu5[nop[0]][nop[2]][nop[3]][nop[4]][j]||clu5[nop[1]][nop[2]][nop[3]][nop[4]][j]){flagx=1;}
               if(flagx)continue;
                int u;
                fhblen=0;

                for(k=0;k<fy;k++){
                wcscpy(fhb[fhblen].fname,ffunc[fy][i][k].name);
                fhb[fhblen++].yuan=ffunc[fy][i][k].yuan;
                }
                wcscpy(fhb[fhblen].fname,tnewf[j].name);
                fhb[fhblen++].yuan=tnewf[j].yuan;
                int yy=9;
                int tt,v;
                    for(v=0;v<fy;v++){
                        Cantor[v]=ffunc[fy][i][v].no;
                    }
                    Cantor[fy]=j;
                if(growexp())
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(nfunc[yy][ni[yy]][u].name,tnewf[Cantor[u]].name);
                        nfunc[yy][ni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            nfunc[yy][ni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                    }
                    ni[yy]++;//wprintf(L"\n");
                    //clu[i+1][k+1][0][0][0]++;
                }
                else
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(ffunc[yy][fni[yy]][u].name,tnewf[Cantor[u]].name);
                        ffunc[yy][fni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            ffunc[yy][fni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                        ffunc[yy][fni[yy]][u].no=Cantor[u];
                    }
                    fni[yy]++;
                }
            }
        }
        wprintf(L"剩余不完全:%d\n",fni[9]);
        fy=9;
        for(i=0;i<fni[fy];i++){
                for(j=0;j<mou;j++){
                    flagx=0;
               for(k=0;k<fy;k++){
                    nop[k]=ffunc[fy][i][k].no;
                    if(nop[k]>=j){flagx=1;break;}
                    if(clu2[nop[k]][j]){flagx=1;break;}
               }
               if(clu3[nop[0]][nop[1]][j]||clu3[nop[0]][nop[2]][j]||clu3[nop[0]][nop[3]][j]|| clu3[nop[0]][nop[4]][j]||clu3[nop[1]][nop[2]][j]){flagx=1;}
               if(clu3[nop[1]][nop[3]][j]|| clu3[nop[1]][nop[4]][j]||clu3[nop[2]][nop[3]][j]||clu3[nop[2]][nop[4]][j]){flagx=1;}
               if(clu4[nop[0]][nop[1]][nop[2]][j]||clu4[nop[0]][nop[1]][nop[3]][j]||clu4[nop[0]][nop[1]][nop[4]][j]||clu4[nop[0]][nop[2]][nop[3]][j]){flagx=1;}
               if(clu4[nop[0]][nop[2]][nop[4]][j]||clu4[nop[0]][nop[3]][nop[4]][j]||clu4[nop[1]][nop[2]][nop[3]][j]||clu4[nop[1]][nop[2]][nop[4]][j]||clu4[nop[1]][nop[3]][nop[4]][j]||clu4[nop[2]][nop[3]][nop[4]][j]){flagx=1;}

               if(clu5[nop[0]][nop[1]][nop[2]][nop[3]][j]||clu5[nop[0]][nop[1]][nop[2]][nop[4]][j]||clu5[nop[0]][nop[1]][nop[3]][nop[4]][j]){flagx=1;}
               if(clu5[nop[0]][nop[2]][nop[3]][nop[4]][j]||clu5[nop[1]][nop[2]][nop[3]][nop[4]][j]){flagx=1;}
               if(flagx)continue;
                int u;
                fhblen=0;

                for(k=0;k<fy;k++){
                wcscpy(fhb[fhblen].fname,ffunc[fy][i][k].name);
                fhb[fhblen++].yuan=ffunc[fy][i][k].yuan;
                }
                wcscpy(fhb[fhblen].fname,tnewf[j].name);
                fhb[fhblen++].yuan=tnewf[j].yuan;
                int yy=10;
                int tt,v;
                    for(v=0;v<fy;v++){
                        Cantor[v]=ffunc[fy][i][v].no;
                    }
                    Cantor[fy]=j;
                if(growexp())
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(nfunc[yy][ni[yy]][u].name,tnewf[Cantor[u]].name);
                        nfunc[yy][ni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            nfunc[yy][ni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                    }
                    ni[yy]++;//wprintf(L"\n");
                    //clu[i+1][k+1][0][0][0]++;
                }
                else
                {
                    for(u=0; u<yy; u++)
                    {
                        //wprintf(L"%ls\n",tnewf[Cantor[u]].name);
                        tt=(int)pow(2.0,tnewf[Cantor[u]].yuan);
                        wcscpy(ffunc[yy][fni[yy]][u].name,tnewf[Cantor[u]].name);
                        ffunc[yy][fni[yy]][u].yuan=tnewf[Cantor[u]].yuan;
                        int jj;
                        for(jj=0; jj<tt; jj++)
                            ffunc[yy][fni[yy]][u].zzbf[jj]=tnewf[Cantor[u]].zzbf[jj];
                        ffunc[yy][fni[yy]][u].no=Cantor[u];
                    }
                    fni[yy]++;
                }
            }
        }
        wprintf(L"剩余不完全:%d\n",fni[10]);
        int lp;
        for(i=2; i<=9; i++)
        {
            fwprintf(file5,L"\n%d个连接符构成最小完全集的有:\n",i);
            for(lp=0; lp<ni[i]; lp++)
            {
                for(j=0; j<i; j++)
                {
                    fwprintf(file5,L"%ls %d ",nfunc[i][lp][j].name,nfunc[i][lp][j].yuan);
                    for(k=0; k<(int)pow(2.0,nfunc[i][lp][j].yuan); k++)
                        fwprintf(file5,L"%d",ffunc[i][lp][j].zzbf[k]);
                    fwprintf(file5,L"\n");
                }
                fwprintf(file5,L"\n");
            }
        }
        fwprintf(file5,L"\n总而言之,任意不超过二元的连接符集合只要是完全的,它的最小完全集规模最大为3.\n");
        for(i=4; i<=9; i++)
        {
            fwprintf(file5,L"\n%d个连接符构成最大不完全集的有:\n",i);
            for(lp=0; lp<fni[i]; lp++)
            {
                for(j=0; j<i; j++)
                {
                    fwprintf(file5,L"%ls %d ",ffunc[i][lp][j].name,ffunc[i][lp][j].yuan);
                    for(k=0; k<(int)pow(2.0,ffunc[i][lp][j].yuan); k++)
                        fwprintf(file5,L"%d",ffunc[i][lp][j].zzbf[k]);
                    fwprintf(file5,L"\n");
                }
                fwprintf(file5,L"\n");
            }
        }

        fclose(file4);
        fclose(file5);
    }
    fclose(file);
    fclose(file2);
    system("pause");
    return 0;
}

测试样例
(p1⊕r3)∧(q1⊕p3)∧(r1⊕p2)∧¬(p1∧q1)∧¬(p1∧r1)∧¬(q1∧r1)∧¬(p3∧r3)∧¬(p1∧p2)∧¬(p1∧p3)∧¬(p2∧p3)∧¬(r1∧r3)
% 仅取011001成立

(p)⊕(q↔r)
%10010110

f((p),g(q, r))
#f 2 0110 
g 2 1001
%10010110 不完全

(0∧0∨0∨0→0)⊕0↔0
% 永假

((q ⊕ r) ⊕s)↔(q ⊕ (r ⊕s))
% 永真

f(p, f(q, r))↔f(f(p,q),r)
#f 2 1001
% 永真,不完全

F(0,1,F(0,0,ff(0)))→0
#F 3 00000011
ff 1 01
% 永真,不完全

F(p, q, F(p, p, ff(p)))→p
#F 3 00000011
ff 1 01
% 永真,不完全

F(p, q, F(p, p, g(q,f(p))))→p
#F 3 00000011
f 1 01
g 2 0011
% 永真,不完全

F(p, q, F(p, p, g(q,f(p))))→p
#F 3 10000011
f 1 10
g 2 1100
% 0111,完全

#f 2 0110
g 1 10
% 不完全

p→q↔f(f(q,f(q,p,p),p),p,p)
#f 3 10010010
% 永真,完全

¬p↔f(p,p,p)
#f 3 10010010
% 永真,完全

#f 2 0110
g 2 0111
h 2 0001
% 不完全

#f 2 0001
g 2 1001
h 2 0110
% 完全

#f 2 0111
g 2 1001
h 1 00
% 完全

#f 2 0111
g 2 0001
h 2 1101
i 2 1001
% 不完全

p→q↔f(f(q,q,p),f(p,p,p),p)
#f 3 11000010
% 永真,完全

¬p↔f(p,p,p)
#f 3 11000010
% 永真,完全

#f 2 0111
g 2 0001
h 2 1101
k 2 1001
% 不完全:p q f(q,p) g(q,p) h(p,p) h(q,p) h(p,q) k(q,p)

p→q↔g(h(q,p),q)
#f 2 0110
g 2 0111
h 2 1001
% 永真,完全

¬p↔f(h(p,p),p)
#f 2 0110
g 2 0111
h 2 1001
% 永真,完全

#f 2 0110
% 不完全:p q f(p,p) f(q,p)

p→q↔f(h(),f(p,q))
#f 2 0010
h 0 1
% 永真,不完全

¬p↔f(h(),p)
#f 2 0010
h 0 1
% 永真,不完全

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值