目录
前言
一.判断输入表达式是否正确
二.求解命题逻辑表达式的真值表
三.代码的运行过程
四.整体代码
前言
离散数学作为计算机专业非常重要的一门科目,其中有许多的解题过程都可以通过代码来进行实现。当我学完第一章之后,发现求解命题逻辑表达式真值表的过程是非常枯燥且繁琐的。对于这一问题,我想通过代码的方式来实现真值表的求解过程。经过三天的不懈努力,最终我也完成了代码的编写。该代码主要分为三个功能,第一个功能是判断输入的命题逻辑表达式是否正确,第二个功能是列出真值表的优先级,再求出各个优先级表达式的数据,列出完整的真值表。第三个功能是通过判断最后一个优先级的数据来得出该命题逻辑表达式是永真式还是永假式或者是可满足式,并且还可以使用真值表来判断两个命题逻辑表达式是否等价。这样就将繁琐的计算过程交给电脑来实现了。
一.判断输入表达式是否正确
要判断表达式是否正确,第一步首先要判断表达式中每一个字符的左边和右边是否是可以匹配的字符,如果判断表达式中每一个字符左右两边的匹配都正确,那么这个表达式的第一步就处理完了。
对于表达式的开头和结尾,表达式只能以”A“,”(“,”¬”三个符号开头,并以”A“,”)“两个符号结尾。
对于这些判断的代码如下:
for(char i='a';i<='z';i++)//判断表达式开头是否是以”A“,”(“,”¬”开头
{
if(expression.charAt(0)==i)
{
C=1;
break;
}
}
for(char i='A';i<='Z';i++)
{
if(expression.charAt(0)==i)
{
C=1;
break;
}
}
if(expression.charAt(0)=='('||expression.charAt(0)=='¬')
{
C=1;
}
if(C==0)//如果B==0,则note的值+1
{
note=1;
}
for(char i='a';i<='z';i++)//判断表达式开头是否是以”A“,”)“结尾
{
if(expression.charAt(length-1)==i)
{
C=1;
break;
}
}
for(char i='A';i<='Z';i++)
{
if(expression.charAt(length-1)==i)
{
C=1;
break;
}
}
if(expression.charAt(length-1)==')')
{
C=1;
}
if(C==0)//如果B==0,则note的值+1
{
note=1;
}
for(int i=0;i<length-1;i++)
{
D=0;//D用于判断两个连续的符号是否为AA,如果判断为A则C++
for(char j='a';j<='z';j++)
{
if(expression.charAt(i)==j)//用于判断两个连续的AA
{
D++;
}
if(expression.charAt(i+1)==j)//用于判断两个连续的AA
{
D++;
}
if((expression.charAt(i)==')'&&expression.charAt(i+1)==j)||(expression.charAt(i)==j&&expression.charAt(i+1)=='('))//用于判断是否是)A或者A(
{
note=1;
}
if(expression.charAt(i)==j&&expression.charAt(i+1)=='¬')//用于判断是否是A¬
{
note=1;
}
}
for(char j='A';j<='Z';j++)
{
if(expression.charAt(i)==j)//用于判断两个连续的AA
{
D++;
}
if(expression.charAt(i+1)==j)//用于判断两个连续的AA
{
D++;
}
if((expression.charAt(i)==')'&&expression.charAt(i+1)==j)||(expression.charAt(i)==j&&expression.charAt(i+1)=='('))//用于判断是否是)A或者A(
{
note=1;
}
if(expression.charAt(i)==j&&expression.charAt(i+1)=='¬')//用于判断是否是A¬
{
note=1;
}
}
if(expression.charAt(i)=='0'||expression.charAt(i)=='1')//用于判断两个连续的AA
{
D++;
}
if(expression.charAt(i+1)=='0'||expression.charAt(i+1)=='1')//用于判断两个连续的AA
{
D++;
}
if(D==2)
{
note=1;
}
if((expression.charAt(i)==')'&&(expression.charAt(i+1)=='0'||expression.charAt(i+1)=='1'))||(expression.charAt(i+1)=='('&&(expression.charAt(i)=='0'||expression.charAt(i)=='1')))//用于判断是否是)A或者A(
{
note=1;
}
if((expression.charAt(i)=='0'&&expression.charAt(i+1)=='¬')||expression.charAt(i)=='1'&&expression.charAt(i+1)=='¬')//用于判断是否是A¬
{
note=1;
}
if(expression.charAt(i)==')'&&expression.charAt(i+1)=='(')//用于判断是否是)(
{
note=1;
}
if(expression.charAt(i)=='('&&expression.charAt(i+1)==')')//用于判断是否是()
{
note=1;
}
if(expression.charAt(i)=='('&&(expression.charAt(i+1)=='∧'||expression.charAt(i+1)=='∨'||expression.charAt(i+1)=='→'||expression.charAt(i+1)=='↔'))//用于判断是否是(∧
{
note=1;
}
if(expression.charAt(i+1)==')'&&(expression.charAt(i)=='∧'||expression.charAt(i)=='∨'||expression.charAt(i)=='→'||expression.charAt(i)=='↔'))//用于判断是否是∧)
{
note=1;
}
if((expression.charAt(i)=='¬'&&expression.charAt(i+1)==')')||(expression.charAt(i)==')'&&expression.charAt(i+1)=='¬'))//用于判断是否是¬)和)¬
{
note=1;
}
if((expression.charAt(i)=='∧'||expression.charAt(i)=='∨'||expression.charAt(i)=='→'||expression.charAt(i)=='↔')&&(expression.charAt(i+1)=='∧'||expression.charAt(i+1)=='∨'||expression.charAt(i+1)=='→'||expression.charAt(i+1)=='↔'))//用于判断是否是∧∧
{
note=1;
}
if(expression.charAt(i)=='¬'&&(expression.charAt(i)=='∧'||expression.charAt(i)=='∨'||expression.charAt(i)=='→'||expression.charAt(i)=='↔'))//用于判断¬∧
{
note=1;
}
}
if(note==1)
{
System.out.println("该公式不正确,无法进行计算!");
}
else
{
System.out.println("该公式正确");
}
表达式左右两边符号匹配判断完之后,还要判断表达式中是否出现了其他未知的符号。 这里可以通过对已知符号的数量进行计数并与输入表达式的长度进行对比,就能得出表达式中是否出现了其他未知的符号。之后还要判断括号是否匹配,可以先将表达式中的括号全部分离出来,再单独进行判断。如果没有括号,则不进行判断。
具体代码如下:
if(A!=0)
{
//用于判断括号是否匹配,匹配就进行删去操作
char[] copy2 =new char[A];
for(int i=0;i<A;i++)
{
copy2[i]='.';
}
int B=0;
for(int i=0;i<A;i++)
{
copy2[B]=copy1[i];
if(B-1>=0)
{
if(copy2[B-1]=='('&©2[B]==')')
{
copy2[B]='.';
copy2[B-1]='.';
B=B-2;
}
}
if(B<A-1)
{
B++;
}
}
if(copy2[0]=='('||copy2[0]==')')//如果copy2数组中还有“(",")"符号,说明括号匹配有问题
{
note=1;
}
}
通过这几个操作,对表达式进行判断就可以基本确定表达式是否正确了。如果该表达是正确则继续进行真值表求解,如果不正确则退出程序。
二.求解命题逻辑表达式的真值表
如果表达式中出现了多个”¬”符号,可以先将表达式进行化简,再对表达式进行处理。
具体代码如下:
char []sdf=new char[length];//用于存储将¬符号进行化简之后的字符串
for(int i=0;i<length;i++)
{
sdf[i]='.';
}
int se,st=0;//se用于记录连续¬符号的数量,
for(int i=0;i<length;i++)
{
se=0;
if(expression.charAt(i)=='¬')
{
se++;
for(;;)
{
i++;
if(expression.charAt(i)=='¬')
{
se++;
}
else
{
break;
}
}
if(se%2!=0)
{
sdf[st]='¬';
if(st<length-1)
{
st++;
}
}
}
sdf[st]=expression.charAt(i);
if(st<length-1)
{
st++;
}
处理完之后再创建两个char类型的数组,第一个数组F用于存储表达式中不重复的大小写字母,0和1等字母。第二个数组F1用于存储表达式中大小写字母,0和1前面出现‘¬’符号的字母。
具体代码如下:
char []F=new char[number2];//用于存储去重之后的大小写字母和0,1
for(int i=0;i<number2;i++)
{
F[i]='.';
}
char []F1=new char[number2];//用于存储去重之后的大小写字母和0,1,且前面有“¬”符号
for(int i=0;i<number2;i++)
{
F1[i]='.';
}
A=0;
for(int i=0;i<se;i++)//将表达式里面的大小写字母,0,1去重
{
C=0;
for(char j='a';j<='z';j++)
{
if(sdf2[i]==j)
{
if(A!=0)
{
for(int k=0;k<A;k++)
{
if(j==F[k])
{
C=1;
break;
}
}
}
if(C==0)
{
F[A]=j;
if(A<number2-1)
{
A++;
}
}
}
}
C=0;
for(char j='A';j<='Z';j++)
{
if(sdf2[i]==j)
{
if(A!=0)
{
for(int k=0;k<A;k++)
{
if(j==F[k])
{
C=1;
break;
}
}
}
if(C==0)
{
F[A]=j;
if(A<number2-1)
{
A++;
}
}
}
}
C=0;
if(sdf2[i]=='0')
{
if(A!=0)
{
for(int k=0;k<A;k++)
{
if(F[k]=='0')
{
C=1;
break;
}
}
}
if(C==0)
{
F[A]='0';
if(A<number2-1)
{
A++;
}
}
}
C=0;
if(sdf2[i]=='1')
{
if(A!=0)
{
for(int k=0;k<A;k++)
{
if(F[k]=='1')
{
C=1;
break;
}
}
}
if(C==0)
{
F[A]='1';
if(A<number2-1)
{
A++;
}
}
}
}
for(int i=0;i<se;i++)
{
for(char j='a';j<='z';j++)
{
if(sdf2[i]==j)
{
if(i-1>=0&&sdf2[i-1]=='¬')
{
for(int k=0;k<A;k++)
{
if(F[k]==j)
{
F1[k]=j;
}
}
}
}
}
for(char j='A';j<='Z';j++)
{
if(sdf2[i]==j)
{
if(i-1>=0&&sdf2[i-1]=='¬')
{
for(int k=0;k<A;k++)
{
if(F[k]==j)
{
F1[k]=j;
}
}
}
}
}
if(sdf2[i]=='0')
{
if(i-1>=0&&sdf2[i-1]=='¬')
{
for(int k=0;k<A;k++)
{
if(F[k]=='0')
{
F1[k]='0';
}
}
}
}
if(sdf2[i]=='1')
{
if(i-1>=0&&sdf2[i-1]=='¬')
{
for(int k=0;k<A;k++)
{
if(F[k]=='1')
{
F1[k]='1';
}
}
}
}
}
A=0;
for(int i=0;i<number2;i++)
{
if(F[i]!='.')
{
A++;
}
}
对于F和F1两个数组,还需要创建两个char类型的二维数组分别存放真值表的数据。
具体代码如下:
int str= (int) Math.pow(2,A);
int [][]ste=new int[A][str];
int J=1;
for(int i=A-1;i>=0;i--)//对于大小写字母,0,1通过二进制不断加一,如果是1则全为1,如果是0则全为0
{
if(F[i]=='0')
{
for(int j=0;j<str;j++)
{
ste[i][j]=1;
}
}
else
if(F[i]=='1')
{
for(int j=0;j<str;j++)
{
ste[i][j]=0;
}
}
else
{
for(int j=0;j<str;j++)
{
if(ste[i][j]==0)
{
ste[i][j+J]=1;
}
}
J*=2;
}
}
int [][]ste1=new int[A][str];
for(int i=0;i<A;i++)//用于将元素的数据进行转化,0变为1,1变为0
{
if(F1[i]!='.')
{
if(F1[i]==F[i])
{
for(int j=0;j<str;j++)
{
if(ste[i][j]==0)
{
ste1[i][j]=1;
}
else
{
ste1[i][j]=0;
}
//ste1[i][j]=-ste[i][j];
}
}
}
}
之后就需要对整个表达式来进行处理,首先需要把优先级通过数字的大小来进行区分,数字越大则说明优先级越高,并且两个配对的括号会有相同的数字。
for(int i=0;i<se;i++)//用于将括号分为不同等级的优先级
{
if(sdf2[i]=='(')
{
qwe[i]=++H;
if(H>MAX)
{
MAX=H;
}
}
else
if(sdf2[i]==')')
{
qwe[i]=H--;
}
else
{
qwe[i]=-1;
}
}
比如表达式(¬A→(¬B→¬C)→(¬D→¬E)→(¬B→¬C→(¬B→¬C→(¬B→¬C→(¬B→¬C→(¬B→¬C→(¬B→¬C)))))))的优先级如下:
1 -1 -1 -1 2 -1 -1 -1 -1 -1 2 -1 2 -1 -1 -1 -1 -1 2 -1 2 -1 -1 -1 -1 -1 -1 3 -1 -1 -1 -1 -1 -1 4 -1 -1 -1 -1 -1 -1 5 -1 -1 -1 -1 -1 -1 6 -1 -1 -1 -1 -1 -1 7 -1 -1 -1 -1 -1 7 6 5 4 3 2 1 0
其中-1表示非括号的部分,大于0的数表示括号的优先级,其中最后一个0需要在代码的后面做特殊处理。
最后对表达式进行处理时,对不同的运算符号的处理除了最后的运算方式不同之外其他的处理方式是基本一致的。需要先创建一个数组数组的大小与化简后数组的大小一致,当高的优先级结果计算完之后就将运算之后的表达式存入到这个数组中,在以此方式不断的运算优先级更低的表达式,同时,还需要判断每个大小写字母,0和1前面的符号是否为'¬'符号,还需要判断每个'('符号前面是否有'¬'符号。并将每一个优先级表达式运算完之后的数据存储到特定的数组中。对于没有括号存在时还要做特殊处理,这与括号处理完之后没有括号存在时的处理一致,只需要加一些限定条件即可。
三.代码的运行过程
在网上随便找了一个题用于做验证。
验证过程如下:
四.整体代码
package zuopin;
import java.util.Scanner;
public class str2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("【真值表求解】");
System.out.println("输入可以包括字母大小写,否定词‘¬’,合取词‘∧’,析取词‘∨’,蕴涵词‘→’,等值词‘↔’,0和1");
System.out.println("请输入表达式:");
String expression;
expression=input.next();//表达式输入
int length=expression.length();//表达式长度计算
//note用于表示表达式是否正确,如果note=0说明表达式正确,如果note=1说明表达式不正确,number判断表达式长度是否为length。
//A用于计算表达式中“(",")"符号的数量,C用于判断表达式开头是否是以”A“,”(“,”¬”开头,以”A“,”)“结尾。
//E用于判断表达式中是否有大写字母或小写字母,0,1和合取词‘∧’,析取词‘∨’,蕴涵词‘→’,等值词‘↔’。
//number2用于记录小写字母,大写字母,0,1的数量
int A=0,note=0,number=0,C=0,D,E=0,number2=0;
char[] copy1 =new char[length];//将表达式中的括号分离出来
for(int i=0;i<length;i++)
{
copy1[i]='.';
}
for(char i='a';i<='z';i++)//判断表达式开头是否是以”A“,”(“,”¬”开头
{
if(expression.charAt(0)==i)
{
C=1;
break;
}
}
for(char i='A';i<='Z';i++)
{
if(expression.charAt(0)==i)
{
C=1;
break;
}
}
if(expression.charAt(0)=='('||expression.charAt(0)=='¬'||expression.charAt(0)=='0'||expression.charAt(0)=='1')
{
C=1;
}
if(C==0)//如果B==0,则note的值+1
{
note=1;
}
for(char i='a';i<='z';i++)//判断表达式开头是否是以”A“,”)“结尾
{
if(expression.charAt(length-1)==i)
{
C=1;
break;
}
}
for(char i='A';i<='Z';i++)
{
if(expression.charAt(length-1)==i)
{
C=1;
break;
}
}
if(expression.charAt(length-1)==')'||expression.charAt(0)=='0'||expression.charAt(0)=='1')
{
C=1;
}
if(C==0)//如果B==0,则note的值+1
{
note=1;
}
for(int i=0;i<length;i++)
{
if(expression.charAt(i)=='('||expression.charAt(i)==')')//分离括号操作
{
copy1[A]=expression.charAt(i);
A++;
}
for(char j='a';j<='z';j++)//判断表达式中是否存在其他未知符号
{
if(expression.charAt(i)==j)
{
E=1;
number++;
number2++;
}
}
for(char j='A';j<='Z';j++)
{
if(expression.charAt(i)==j)
{
E=1;
number++;
number2++;
}
}
if(expression.charAt(i)=='('||expression.charAt(i)==')'||expression.charAt(i)=='¬'||expression.charAt(i)=='∧'||expression.charAt(i)=='∨'||expression.charAt(i)=='→'||expression.charAt(i)=='↔'||expression.charAt(i)=='0'||expression.charAt(i)=='1')
{
number++;
}
if(expression.charAt(i)=='0'||expression.charAt(i)=='1')
{
E=1;
number2++;
}
if(expression.charAt(i)=='∧'||expression.charAt(i)=='∨'||expression.charAt(i)=='→'||expression.charAt(i)=='↔')
{
E=1;
}
}
if(E==0)
{
note=1;
}
if(number!=length)
{
note=1;
}
if(A!=0)
{
//用于判断括号是否匹配,匹配就进行删去操作
char[] copy2 =new char[A];
for(int i=0;i<A;i++)
{
copy2[i]='.';
}
int B=0;
for(int i=0;i<A;i++)
{
copy2[B]=copy1[i];
if(B-1>=0)
{
if(copy2[B-1]=='('&©2[B]==')')
{
copy2[B]='.';
copy2[B-1]='.';
B=B-2;
}
}
if(B<A-1)
{
B++;
}
}
if(copy2[0]=='('||copy2[0]==')')//如果copy2数组中还有“(",")"符号,说明括号匹配有问题
{
note=1;
}
}
for(int i=0;i<length-1;i++)
{
D=0;//D用于判断两个连续的符号是否为AA,如果判断为A则C++
for(char j='a';j<='z';j++)
{
if(expression.charAt(i)==j)//用于判断两个连续的AA
{
D++;
}
if(expression.charAt(i+1)==j)//用于判断两个连续的AA
{
D++;
}
if((expression.charAt(i)==')'&&expression.charAt(i+1)==j)||(expression.charAt(i)==j&&expression.charAt(i+1)=='('))//用于判断是否是)A或者A(
{
note=1;
}
if(expression.charAt(i)==j&&expression.charAt(i+1)=='¬')//用于判断是否是A¬
{
note=1;
}
if((expression.charAt(i)=='0'&&expression.charAt(i+1)==j)||(expression.charAt(i+1)=='0'&&expression.charAt(i)==j)||(expression.charAt(i)=='1'&&expression.charAt(i+1)==j)||(expression.charAt(i+1)=='1'&&expression.charAt(i)==j))
{
note=1;
}
}
for(char j='A';j<='Z';j++)
{
if(expression.charAt(i)==j)//用于判断两个连续的AA
{
D++;
}
if(expression.charAt(i+1)==j)//用于判断两个连续的AA
{
D++;
}
if((expression.charAt(i)==')'&&expression.charAt(i+1)==j)||(expression.charAt(i)==j&&expression.charAt(i+1)=='('))//用于判断是否是)A或者A(
{
note=1;
}
if(expression.charAt(i)==j&&expression.charAt(i+1)=='¬')//用于判断是否是A¬
{
note=1;
}
if((expression.charAt(i)=='0'&&expression.charAt(i+1)==j)||(expression.charAt(i+1)=='0'&&expression.charAt(i)==j)||(expression.charAt(i)=='1'&&expression.charAt(i+1)==j)||(expression.charAt(i+1)=='1'&&expression.charAt(i)==j))
{
note=1;
}
}
if(D==2)
{
note=1;
}
if(expression.charAt(i)=='0'&&expression.charAt(i+1)=='1')//用于判断两个连续的AA
{
note=1;
}
if(expression.charAt(i+1)=='0'&&expression.charAt(i)=='1')//用于判断两个连续的AA
{
note=1;
}
if(expression.charAt(i)=='0'&&expression.charAt(i+1)=='0')//用于判断两个连续的AA
{
note=1;
}
if(expression.charAt(i+1)=='1'&&expression.charAt(i)=='1')//用于判断两个连续的AA
{
note=1;
}
if((expression.charAt(i)==')'&&(expression.charAt(i+1)=='0'||expression.charAt(i+1)=='1'))||(expression.charAt(i+1)=='('&&(expression.charAt(i)=='0'||expression.charAt(i)=='1')))//用于判断是否是)A或者A(
{
note=1;
}
if((expression.charAt(i)=='0'&&expression.charAt(i+1)=='¬')||(expression.charAt(i)=='1'&&expression.charAt(i+1)=='¬'))//用于判断是否是A¬
{
note=1;
}
if(expression.charAt(i)==')'&&expression.charAt(i+1)=='(')//用于判断是否是)(
{
note=1;
}
if(expression.charAt(i)=='('&&expression.charAt(i+1)==')')//用于判断是否是()
{
note=1;
}
if(expression.charAt(i)=='('&&(expression.charAt(i+1)=='∧'||expression.charAt(i+1)=='∨'||expression.charAt(i+1)=='→'||expression.charAt(i+1)=='↔'))//用于判断是否是(∧
{
note=1;
}
if(expression.charAt(i+1)==')'&&(expression.charAt(i)=='∧'||expression.charAt(i)=='∨'||expression.charAt(i)=='→'||expression.charAt(i)=='↔'))//用于判断是否是∧)
{
note=1;
}
if((expression.charAt(i)=='¬'&&expression.charAt(i+1)==')')||(expression.charAt(i)==')'&&expression.charAt(i+1)=='¬'))//用于判断是否是¬)和)¬
{
note=1;
}
if((expression.charAt(i)=='∧'||expression.charAt(i)=='∨'||expression.charAt(i)=='→'||expression.charAt(i)=='↔')&&(expression.charAt(i+1)=='∧'||expression.charAt(i+1)=='∨'||expression.charAt(i+1)=='→'||expression.charAt(i+1)=='↔'))//用于判断是否是∧∧
{
note=1;
}
if(expression.charAt(i)=='¬'&&(expression.charAt(i+1)=='∧'||expression.charAt(i+1)=='∨'||expression.charAt(i+1)=='→'||expression.charAt(i+1)=='↔'))//用于判断¬∧
{
note=1;
}
}
if(note==1)
{
System.out.println("该公式不正确,无法进行计算!");
}
else
{
System.out.println("该公式正确");
}
if(note==0)
{
char []sdf=new char[length];//用于存储将¬符号进行化简之后的字符串
for(int i=0;i<length;i++)
{
sdf[i]='.';
}
int se,st=0;//se用于记录连续¬符号的数量,
for(int i=0;i<length;i++)
{
se=0;
if(expression.charAt(i)=='¬')
{
se++;
for(;;)
{
i++;
if(expression.charAt(i)=='¬')
{
se++;
}
else
{
break;
}
}
if(se%2!=0)
{
sdf[st]='¬';
if(st<length-1)
{
st++;
}
}
}
sdf[st]=expression.charAt(i);
if(st<length-1)
{
st++;
}
}
se=0;
for(int i=0;i<length;i++)
{
if(sdf[i]!='.')
{
se++;
}
}
char []sdf2=new char[se];//用于存储将¬符号进行化简之后的字符串2
for(int i=0;i<se;i++)
{
sdf2[i]=sdf[i];
//System.out.print(sdf2[i]);//检查化简¬符号后的公式
}
char []F=new char[number2];//用于存储去重之后的大小写字母和0,1
for(int i=0;i<number2;i++)
{
F[i]='.';
}
char []F1=new char[number2];//用于存储去重之后的大小写字母和0,1,且前面有“¬”符号
for(int i=0;i<number2;i++)
{
F1[i]='.';
}
A=0;
for(int i=0;i<se;i++)//将表达式里面的大小写字母,0,1去重
{
C=0;
for(char j='a';j<='z';j++)
{
if(sdf2[i]==j)
{
if(A!=0)
{
for(int k=0;k<A;k++)
{
if(j==F[k])
{
C=1;
break;
}
}
}
if(C==0)
{
F[A]=j;
if(A<number2)
{
A++;
}
}
}
}
C=0;
for(char j='A';j<='Z';j++)
{
if(sdf2[i]==j)
{
if(A!=0)
{
for(int k=0;k<A;k++)
{
if(j==F[k])
{
C=1;
break;
}
}
}
if(C==0)
{
F[A]=j;
if(A<number2)
{
A++;
}
}
}
}
C=0;
if(sdf2[i]=='0')
{
if(A!=0)
{
for(int k=0;k<A;k++)
{
if(F[k]=='0')
{
C=1;
break;
}
}
}
if(C==0)
{
F[A]='0';
if(A<number2)
{
A++;
}
}
}
C=0;
if(sdf2[i]=='1')
{
if(A!=0)
{
for(int k=0;k<A;k++)
{
if(F[k]=='1')
{
C=1;
break;
}
}
}
if(C==0)
{
F[A]='1';
if(A<number2)
{
A++;
}
}
}
}
for(int i=0;i<se;i++)
{
for(char j='a';j<='z';j++)
{
if(sdf2[i]==j)
{
if(i-1>=0&&sdf2[i-1]=='¬')
{
for(int k=0;k<A;k++)
{
if(F[k]==j)
{
F1[k]=j;
}
}
}
}
}
for(char j='A';j<='Z';j++)
{
if(sdf2[i]==j)
{
if(i-1>=0&&sdf2[i-1]=='¬')
{
for(int k=0;k<A;k++)
{
if(F[k]==j)
{
F1[k]=j;
}
}
}
}
}
if(sdf2[i]=='0')
{
if(i-1>=0&&sdf2[i-1]=='¬')
{
for(int k=0;k<A;k++)
{
if(F[k]=='0')
{
F1[k]='0';
}
}
}
}
if(sdf2[i]=='1')
{
if(i-1>=0&&sdf2[i-1]=='¬')
{
for(int k=0;k<A;k++)
{
if(F[k]=='1')
{
F1[k]='1';
}
}
}
}
}
A=0;
for(int i=0;i<number2;i++)
{
if(F[i]!='.')
{
A++;
}
}
int str= (int) Math.pow(2,A);
int [][]ste=new int[A][str];
int J=1;
for(int i=A-1;i>=0;i--)//对于大小写字母,0,1通过二进制不断加一,如果是1则全为1,如果是0则全为0
{
if(F[i]=='0')
{
for(int j=0;j<str;j++)
{
ste[i][j]=1;
}
}
else
if(F[i]=='1')
{
for(int j=0;j<str;j++)
{
ste[i][j]=0;
}
}
else
{
for(int j=0;j<str;j++)
{
if(ste[i][j]==0)
{
ste[i][j+J]=1;
}
}
J*=2;
}
}
/*for(int i=0;i<A;i++)
{
for(int j=0;j<str;j++)
{
System.out.print(ste[i][j]+" ");
}
System.out.println();
}*/
int [][]ste1=new int[A][str];
/*System.out.println(F);//检查元素
System.out.println(F1);//检查负元素*/
for(int i=0;i<A;i++)//用于将元素的数据进行转化,0变为1,1变为0
{
if(F1[i]!='.')
{
if(F1[i]==F[i])
{
for(int j=0;j<str;j++)
{
if(ste[i][j]==0)
{
ste1[i][j]=1;
}
else
{
ste1[i][j]=0;
}
//ste1[i][j]=-ste[i][j];
}
}
}
}
/*for(int i=0;i<A;i++)
{
for(int j=0;j<str;j++)
{
System.out.print(ste[i][j]+" ");
}
System.out.println();
}
for(int i=0;i<A;i++)
{
for(int j=0;j<str;j++)
{
System.out.print(ste1[i][j]+" ");
}
System.out.println();
}*/
/*System.out.println(F);//检查元素
System.out.println(F1);//检查负元素*/
//确定优先级sdf2
int []qwe=new int[se+1];//创建qwe用于给括号分配数字,来统计优先级
int H=0,MAX=-1;//数字,MAX用于记录最大的数
for(int i=0;i<se;i++)//用于将括号分为不同等级的优先级
{
if(sdf2[i]=='(')
{
qwe[i]=++H;
if(H>MAX)
{
MAX=H;
}
}
else
if(sdf2[i]==')')
{
qwe[i]=H--;
}
else
{
qwe[i]=-1;
}
}
qwe[se]=0;
//针对没有括号的情况,MAX的赋值
int O=0;
for(int i=0;i<length;i++)
{
if(copy1[i]=='('||copy1[i]==')')
{
O++;
}
}
if(O==0)
{
MAX=0;
}
//System.out.println(MAX);
/*for(int i=0;i<se+1;i++)//用于显示数字优先级
{
System.out.print(qwe[i]+" ");
}*/
char [][]save=new char[se][se];//用于记录表达式
int []G=new int[se];//用于记录运算符号的位置
int [][]save1=new int[se][str];//用于记录表达式的所有数
int T=0;//用于记录表达式的使用个数
for(int i=0;i<se;i++)
{
for(int j=0;j<se;j++)
{
save[i][j]='.';
}
}
int JSW=0;//用于没有括号的情况
char []JT=new char[length];//用于存储表达式
int JK;
for(int r=0;r<se;r++)
{
JT[r]='.';
}
for(int i=MAX;i>=0;i--)//对优先级依次进行处理
{
if(i==0)
{
JSW=1;
}
for(int j=0;j<se;j++)
{
if(qwe[j]==i||JSW==1)
{
if(JSW==1)
{
j=-1;
JK=se;
}
else
{
JK=0;
for(int k=j+1;qwe[k]!=i;k++)
{
JK++;
}
}
for(int k=j+1;qwe[k]!=i;k++)
{
if(sdf2[k]=='∧'&&JT[k]=='.')
{
if(JT[k-1]!='.')
{
if(JT[k+1]!='.')
{
int W1=k-1;//记录当前位置1
int W2=k-1;//记录当前位置1
int W3=k+1;//记录当前位置2
int W4=k+1;//记录当前位置2
do {
W1--;
}while(W1!=j+1&&JT[W1-1]!='.');
do {
W4++;
}while(W4!=JK+j&&JT[W4+1]!='.');
int W5=0,W6=0,L=0;//W5,W6用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W1&&w<=W2)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W1||w>W2)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W5=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
L=0;
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W3&&w<=W4)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W3||w>W4)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W6=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W1;e<=W2;e++)
{
save[T][e]=save[W5][e];
}
for(int e=W3;e<=W4;e++)
{
save[T][e]=save[W6][e];
}
JT[G[T]]='∧';
save[T][G[T]]='∧';
for(int y=0;y<str;y++)
{
if(save1[W5][y]==1&&save1[W6][y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
int W1=k-1;//记录当前位置1
int W2=k-1;//记录当前位置1
do {
W1--;
}while(W1!=j+1&&JT[W1-1]!='.');
int W5=0,L=0;//W5用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W1&&w<=W2)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W1||w>W2)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W5=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W1;e<=W2;e++)
{
save[T][e]=save[W5][e];
}
int []S2=new int[str];
if(sdf2[k+1]=='¬')
{
for(int e=0;e<3;e++)
{
JT[k+e]=sdf2[k+e];
save[T][k+e]=JT[k+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
}
else
{
for(int e=0;e<2;e++)
{
JT[k+e]=sdf2[k+e];
save[T][k+e]=JT[k+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
}
for(int y=0;y<str;y++)
{
if(save1[W5][y]==1&&S2[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
}
else
{
if(JT[k+1]!='.')
{
int W3=k+1;//记录当前位置2
int W4=k+1;//记录当前位置2
do {
W4++;
}while(W4!=JK+j&&JT[W4+1]!='.');
int W6=0,L=0;//W5,W6用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W3&&w<=W4)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W3||w>W4)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W6=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W3;e<=W4;e++)
{
save[T][e]=save[W6][e];
}
int []S1=new int[str];
if(k-2>=0&&sdf2[k-2]=='¬')
{
for(int e=0;e<3;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
}
}
else
{
for(int e=0;e<2;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
}
}
for(int y=0;y<str;y++)
{
if(save1[W6][y]==1&&S1[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
if(k-2>=0&&sdf2[k-2]=='¬')
{
if(sdf2[k+1]=='¬')
{
for(int e=0;e<5;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1&&S2[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
for(int e=0;e<4;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1&&S2[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
}
else
{
if(sdf2[k+1]=='¬')
{
for(int e=0;e<4;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1&&S2[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
for(int e=0;e<3;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1&&S2[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
}
}
}
}
}
for(int k=j+1;qwe[k]!=i;k++)
{
if(sdf2[k]=='∨'&&JT[k]=='.')
{
if(JT[k-1]!='.')
{
if(JT[k+1]!='.')
{
int W1=k-1;//记录当前位置1
int W2=k-1;//记录当前位置1
int W3=k+1;//记录当前位置2
int W4=k+1;//记录当前位置2
do {
W1--;
}while(W1!=j+1&&JT[W1-1]!='.');
do {
W4++;
}while(W4!=JK+j&&JT[W4+1]!='.');
int W5=0,W6=0,L=0;//W5,W6用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W1&&w<=W2)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W1||w>W2)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W5=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
L=0;
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W3&&w<=W4)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W3||w>W4)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W6=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W1;e<=W2;e++)
{
save[T][e]=save[W5][e];
}
for(int e=W3;e<=W4;e++)
{
save[T][e]=save[W6][e];
}
JT[G[T]]='∨';
save[T][G[T]]='∨';
for(int y=0;y<str;y++)
{
if(save1[W5][y]==1||save1[W6][y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
int W1=k-1;//记录当前位置1
int W2=k-1;//记录当前位置1
do {
W1--;
}while(W1!=j+1&&JT[W1-1]!='.');
int W5=0,L=0;//W5用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W1&&w<=W2)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W1||w>W2)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W5=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W1;e<=W2;e++)
{
save[T][e]=save[W5][e];
}
int []S2=new int[str];
if(sdf2[k+1]=='¬')
{
for(int e=0;e<3;e++)
{
JT[k+e]=sdf2[k+e];
save[T][k+e]=JT[k+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
}
else
{
for(int e=0;e<2;e++)
{
JT[k+e]=sdf2[k+e];
save[T][k+e]=JT[k+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
}
for(int y=0;y<str;y++)
{
if(save1[W5][y]==1||S2[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
}
else
{
if(JT[k+1]!='.')
{
int W3=k+1;//记录当前位置2
int W4=k+1;//记录当前位置2
do {
W4++;
}while(W4!=JK+j&&JT[W4+1]!='.');
int W6=0,L=0;//W5,W6用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W3&&w<=W4)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W3||w>W4)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W6=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W3;e<=W4;e++)
{
save[T][e]=save[W6][e];
}
int []S1=new int[str];
if(k-2>=0&&sdf2[k-2]=='¬')
{
for(int e=0;e<3;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
}
}
else
{
for(int e=0;e<2;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
}
}
for(int y=0;y<str;y++)
{
if(save1[W6][y]==1||S1[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
if(k-2>=0&&sdf2[k-2]=='¬')
{
if(sdf2[k+1]=='¬')
{
for(int e=0;e<5;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1||S2[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
for(int e=0;e<4;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1||S2[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
}
else
{
if(sdf2[k+1]=='¬')
{
for(int e=0;e<4;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1||S2[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
for(int e=0;e<3;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1||S2[y]==1)
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
}
}
}
}
}
for(int k=j+1;qwe[k]!=i;k++)
{
if(sdf2[k]=='→'&&JT[k]=='.')
{
if(JT[k-1]!='.')
{
if(JT[k+1]!='.')
{
int W1=k-1;//记录当前位置1
int W2=k-1;//记录当前位置1
int W3=k+1;//记录当前位置2
int W4=k+1;//记录当前位置2
do {
W1--;
}while(W1!=j+1&&JT[W1-1]!='.');
do {
W4++;
}while(W4!=JK+j&&JT[W4+1]!='.');
int W5=0,W6=0,L=0;//W5,W6用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W1&&w<=W2)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W1||w>W2)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W5=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
L=0;
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W3&&w<=W4)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W3||w>W4)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W6=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W1;e<=W2;e++)
{
save[T][e]=save[W5][e];
}
for(int e=W3;e<=W4;e++)
{
save[T][e]=save[W6][e];
}
JT[G[T]]='→';
save[T][G[T]]='→';
for(int y=0;y<str;y++)
{
if(save1[W5][y]==1&&save1[W6][y]==0)
{
save1[T][y]=0;
}
else
{
save1[T][y]=1;
}
}
if(T<se-1)
{
T++;
}
}
else
{
int W1=k-1;//记录当前位置1
int W2=k-1;//记录当前位置1
do {
W1--;
}while(W1!=j+1&&JT[W1-1]!='.');
int W5=0,L=0;//W5用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W1&&w<=W2)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W1||w>W2)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W5=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W1;e<=W2;e++)
{
save[T][e]=save[W5][e];
}
int []S2=new int[str];
if(sdf2[k+1]=='¬')
{
for(int e=0;e<3;e++)
{
JT[k+e]=sdf2[k+e];
save[T][k+e]=JT[k+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
}
else
{
for(int e=0;e<2;e++)
{
JT[k+e]=sdf2[k+e];
save[T][k+e]=JT[k+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
}
for(int y=0;y<str;y++)
{
if(save1[W5][y]==1&&S2[y]==0)
{
save1[T][y]=0;
}
else
{
save1[T][y]=1;
}
}
if(T<se-1)
{
T++;
}
}
}
else
{
if(JT[k+1]!='.')
{
int W3=k+1;//记录当前位置2
int W4=k+1;//记录当前位置2
do {
W4++;
}while(W4!=JK+j&&JT[W4+1]!='.');
int W6=0,L=0;//W5,W6用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W3&&w<=W4)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W3||w>W4)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W6=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W3;e<=W4;e++)
{
save[T][e]=save[W6][e];
}
int []S1=new int[str];
if(k-2>=0&&sdf2[k-2]=='¬')
{
for(int e=0;e<3;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
}
}
else
{
for(int e=0;e<2;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
}
}
for(int y=0;y<str;y++)
{
if(save1[W6][y]==0&&S1[y]==1)
{
save1[T][y]=0;
}
else
{
save1[T][y]=1;
}
}
if(T<se-1)
{
T++;
}
}
else
{
if(k-2>=0&&sdf2[k-2]=='¬')
{
if(sdf2[k+1]=='¬')
{
for(int e=0;e<5;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1&&S2[y]==0)
{
save1[T][y]=0;
}
else
{
save1[T][y]=1;
}
}
if(T<se-1)
{
T++;
}
}
else
{
for(int e=0;e<4;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1&&S2[y]==0)
{
save1[T][y]=0;
}
else
{
save1[T][y]=1;
}
}
if(T<se-1)
{
T++;
}
}
}
else
{
if(sdf2[k+1]=='¬')
{
for(int e=0;e<4;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1&&S2[y]==0)
{
save1[T][y]=0;
}
else
{
save1[T][y]=1;
}
}
if(T<se-1)
{
T++;
}
}
else
{
for(int e=0;e<3;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==1&&S2[y]==0)
{
save1[T][y]=0;
}
else
{
save1[T][y]=1;
}
}
if(T<se-1)
{
T++;
}
}
}
}
}
}
}
for(int k=j+1;qwe[k]!=i;k++)
{
if(sdf2[k]=='↔'&&JT[k]=='.')
{
if(JT[k-1]!='.')
{
if(JT[k+1]!='.')
{
int W1=k-1;//记录当前位置1
int W2=k-1;//记录当前位置1
int W3=k+1;//记录当前位置2
int W4=k+1;//记录当前位置2
do {
W1--;
}while(W1!=j+1&&JT[W1-1]!='.');
do {
W4++;
}while(W4!=JK+j&&JT[W4+1]!='.');
int W5=0,W6=0,L=0;//W5,W6用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W1&&w<=W2)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W1||w>W2)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W5=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
L=0;
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W3&&w<=W4)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W3||w>W4)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W6=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W1;e<=W2;e++)
{
save[T][e]=save[W5][e];
}
for(int e=W3;e<=W4;e++)
{
save[T][e]=save[W6][e];
}
JT[G[T]]='↔';
save[T][G[T]]='↔';
for(int y=0;y<str;y++)
{
if(save1[W5][y]==save1[W6][y])
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
int W1=k-1;//记录当前位置1
int W2=k-1;//记录当前位置1
do {
W1--;
}while(W1!=j+1&&JT[W1-1]!='.');
int W5=0,L=0;//W5用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W1&&w<=W2)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W1||w>W2)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W5=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W1;e<=W2;e++)
{
save[T][e]=save[W5][e];
}
int []S2=new int[str];
if(sdf2[k+1]=='¬')
{
for(int e=0;e<3;e++)
{
JT[k+e]=sdf2[k+e];
save[T][k+e]=JT[k+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
}
else
{
for(int e=0;e<2;e++)
{
JT[k+e]=sdf2[k+e];
save[T][k+e]=JT[k+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
}
for(int y=0;y<str;y++)
{
if(save1[W5][y]==S2[y])
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
}
else
{
if(JT[k+1]!='.')
{
int W3=k+1;//记录当前位置2
int W4=k+1;//记录当前位置2
do {
W4++;
}while(W4!=JK+j&&JT[W4+1]!='.');
int W6=0,L=0;//W5,W6用于记录与哪一个表达式相匹配,L用于退出条件
for(int r=0;r<se;r++)
{
for(int w=0;w<se;w++)
{
if(w>=W3&&w<=W4)
{
if(save[r][w]=='.')
{
break;
}
}
if(w<W3||w>W4)
{
if(save[r][w]!='.')
{
break;
}
}
if(w==se-1)
{
W6=r;
L=1;
break;
}
}
if(L==1)
{
break;
}
}
G[T]=k;
for(int e=W3;e<=W4;e++)
{
save[T][e]=save[W6][e];
}
int []S1=new int[str];
if(k-2>=0&&sdf2[k-2]=='¬')
{
for(int e=0;e<3;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
}
}
else
{
for(int e=0;e<2;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
}
}
for(int y=0;y<str;y++)
{
if(save1[W6][y]==S1[y])
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
if(k-2>=0&&sdf2[k-2]=='¬')
{
if(sdf2[k+1]=='¬')
{
for(int e=0;e<5;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==S2[y])
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
for(int e=0;e<4;e++)
{
JT[k-2+e]=sdf2[k-2+e];
save[T][k-2+e]=JT[k-2+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F1[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste1[y][U];
}
}
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==S2[y])
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
}
else
{
if(sdf2[k+1]=='¬')
{
for(int e=0;e<4;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
}
for(int y=0;y<A;y++)
{
if(save[T][G[T]+2]==F1[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste1[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==S2[y])
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
else
{
for(int e=0;e<3;e++)
{
JT[k-1+e]=sdf2[k-1+e];
save[T][k-1+e]=JT[k-1+e];
}
G[T]=k;
int []S1=new int[str];
int []S2=new int[str];
for(int y=0;y<A;y++)
{
if(save[T][G[T]-1]==F[y])
{
for(int U=0;U<str;U++)
{
S1[U]=ste[y][U];
}
}
if(save[T][G[T]+1]==F[y])
{
for(int U=0;U<str;U++)
{
S2[U]=ste[y][U];
}
}
}
for(int y=0;y<str;y++)
{
if(S1[y]==S2[y])
{
save1[T][y]=1;
}
else
{
save1[T][y]=0;
}
}
if(T<se-1)
{
T++;
}
}
}
}