王浩算法.docx
《王浩算法.docx》由会员分享,可在线阅读,更多相关《王浩算法.docx(20页珍藏版)》请在冰豆网上搜索。
王浩算法
1.实验目的
熟练掌握命题逻辑中的王浩算法。
2.实验内容:
实现命题逻辑框架内的王浩算法。
⑴将命题逻辑中的王浩算法推广至下述命题语言的情形之下:
ⅰ命题变量符号:
,
,
,
ⅱ逻辑连接符:
,
,
,
,
ⅲ间隔符:
,
⑵在上述⑴中所定义的命题语言中实现王浩算法。
3.实验步骤
importjava.io.*;
importjava.util.Vector;
publicclassWangHaoAlgorithm{
staticStrings=null;
staticinti=0;
staticcharch[]=newchar[100];
Vectorw=newVector();
Vectorp=newVector();
publicstaticvoidmain(Stringargs[]){
System.out.println("请输入需要证明的命题公式:
例如[(p-(~q|r))-((p-q)-(p-r))]或[(p|q)&r]或[p=q]");
BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));//输入一个字符串
try{
s=in.readLine();
}catch(Exceptione){}
WangHaoAlgorithmwanghao=newWangHaoAlgorithm();
wanghao.transformArrow();
}
publicvoidtransformArrow(){//把命题公式简化
Stringout=null;
WangHaoAlgorithmwanghao=newWangHaoAlgorithm();
Strings2=null;
s2=wanghao.s;
System.out.println("=>"+s2);
Vectorp=newVector();//把输入的字符串存入一个向量数组Vector中
try{
for(inti=0;ip.add(s2.charAt(i));
}catch(IndexOutOfBoundsExceptione){}
intlcount=0;
intrcount=0;
Vectorright=newVector();
Vectorleft=newVector();
System.out.println("化简命题公式:
");
for(inti=0;i
if(p.elementAt(i)=='|'){//把"或"转化为单箭头
if((p.elementAt(i-1)>='a'&&p.elementAt(i-1)<='z')){
try{
if(p.elementAt(i-2)=='~'){
p.removeElementAt(i-2);
p.set((i-1),'-');
}
else{
p.insertElementAt('~',(i-1));
p.set((i+1),'-');
}
}catch(ArrayIndexOutOfBoundsExceptione){p.insertElementAt('~',(i-1));p.set((i+1),'-');}
}
elseif(p.elementAt(i-1)==')'){
for(intj=i-1;j>=0;j--){
if(p.elementAt(j)==')'){lcount++;}
if(p.elementAt(j)=='('){lcount--;}
if(lcount==0){
try{
if(p.elementAt(j-1)=='~'){
p.removeElementAt(j-1);
p.set((i-1),'-');
}
else{p.insertElementAt('~',j);
p.set((i+1),'-');
}
}catch(ArrayIndexOutOfBoundsExceptione){p.insertElementAt('~',j);p.set((i+1),'-');}
}
}
}
processDisplay(p);
}
elseif(p.elementAt(i)=='&'){//把"与"转化为单箭头
if((p.elementAt(i-1)>='a'&&p.elementAt(i-1)<='z')&&(p.elementAt(i+1)>='a'&&p.elementAt(i+1)<='z')){
try{
if(p.elementAt(i-2)=='~'){
try{
p.insertElementAt('(',(i-2));p.insertElementAt('~',(i-2));
}catch(ArrayIndexOutOfBoundsExceptione){
p.insertElementAt('(',(i-2));p.insertElementAt('~',(i-2));
}
}
else{
p.insertElementAt('(',(i-1));p.insertElementAt('~',(i-1));
}
}catch(ArrayIndexOutOfBoundsExceptione){
p.insertElementAt('(',(i-1));p.insertElementAt('~',(i-1));
}
p.set((i+2),'-');
p.insertElementAt('~',(i+3));p.insertElementAt(')',(i+5));
}
elseif(p.elementAt(i-1)==')'&&(p.elementAt(i+1)>='a'&&p.elementAt(i+1)<='z')){
for(intj=i-1;j>=0;j--){
if(p.elementAt(j)==')'){lcount++;}
if(p.elementAt(j)=='('){lcount--;}
if(lcount==0){
try{
if(p.elementAt(j-1)=='~'){
try{
p.insertElementAt('(',(j-1));p.insertElementAt('~',(j-1));
}catch(ArrayIndexOutOfBoundsExceptione){
p.insertElementAt('(',(j-1));p.insertElementAt('~',(j-1));
}
}
else{p.insertElementAt('(',j);p.insertElementAt('~',j);}
}catch(IndexOutOfBoundsExceptione){
p.insertElementAt('(',j);p.insertElementAt('~',j);
}
p.set((i+2),'-');
p.insertElementAt('~',(i+3));p.insertElementAt(')',(i+5));
}
}
}
elseif((p.elementAt(i-1)>='a'&&p.elementAt(i-1)<='z')&&p.elementAt(i+1)=='~'){
try{
if(p.elementAt(i-2)=='~'){
try{
p.insertElementAt('(',(i-2));p.insertElementAt('~',(i-2));
}catch(ArrayIndexOutOfBoundsExceptione){
p.insertElementAt('(',(i-2));p.insertElementAt('~',(i-2));
}
}
else{p.insertElementAt('(',(i-1));p.insertElementAt('~',(i-1));}
}catch(ArrayIndexOutOfBoundsExceptione){
p.insertElementAt('(',(i-1));p.insertElementAt('~',(i-1));
}
p.set((i+2),'-');
p.removeElementAt(i+3);
if(p.elementAt(i+3)>='a'&&p.elementAt(i+3)<='z'){
p.insertElementAt(')',(i+4));
}
elseif(p.elementAt(i+3)=='('){
for(intj=i+3;j
if(p.elementAt(j)=='('){rcount++;}
if(p.elementAt(j)==')'){rcount--;}
if(rcount==0){
p.insertElementAt(')',(j+1));
}
}
}
}
elseif(p.elementAt(i-1)==')'&&p.elementAt(i+1)=='~'){
for(intj=i-1;j>=0;j--){
if(p.elementAt(j)==')'){lcount++;}
if(p.elementAt(j)=='('){lcount--;}
if(lcount==0){
try{
if(p.elementAt(j-1)=='~'){
try{
p.insertElementAt('(',(j-1));p.insertElementAt('~',(j-1));
}catch(ArrayIndexOutOfBoundsExceptione){
p.insertElementAt('(',(j-1));p.insertElementAt('~',(j-1));
}
}
else{p.insertElementAt('(',j);p.insertElementAt('~',j);}
}catch(IndexOutOfBoundsExceptione){p.insertElementAt('(',j);p.insertElementAt('~',j);}
}
}
p.set((i+2),'-');
p.removeElementAt(i+3);
if(p.elementAt(i+3)>='a'&&p.elementAt(i+3)<='z'){
p.insertElementAt(')',(i+4));
}
elseif(p.elementAt(i+3)=='('){
for(intj=i+3;j
if(p.elementAt(j)=='('){rcount++;}
if(p.elementAt(j)==')'){rcount--;}
if(rcount==0){
p.insertElementAt(')',(j+1));
}
}
}
}
elseif(p.elementAt(i-1)==')'){
for(intj=i-1;j>=0;j--){
if(p.elementAt(j)==')'){lcount++;}
if(p.elementAt(j)=='('){lcount--;}
if(lcount==0){
try{
if(p.elementAt(j-1)=='~'){
try{
p.insertElementAt('(',(j-1));p.insertElementAt('~',(j-1));
}catch(ArrayIndexOutOfBoundsExceptione){
p.insertElementAt('(',(j-1));p.insertElementAt('~',(j-1));
}
}
else{p.insertElementAt('(',j);p.insertElementAt('~',j);}
}catch(IndexOutOfBoundsExceptione){
p.insertElementAt('(',j);p.insertElementAt('~',j);
}
}
}
p.set((i+2),'-');
if(p.elementAt(i+3)=='('){
for(intk=i+3;k
if(p.elementAt(k)=='('){rcount++;}
if(p.elementAt(k)==')'){rcount--;}
if(rcount==0){p.insertElementAt(')',(k+1));}
}
}
elseif(p.elementAt(i+3)>='a'&&p.elementAt(i+3)<='z'){
p.insertElementAt('~',(i+3));p.insertElementAt(')',(i+5));
}
}
processDisplay(p);
}
elseif(p.elementAt(i)=='='){//把"双箭头"转化为单箭头
if((p.elementAt(i-1)>='a'&&p.elementAt(i-1)<='z')&&(p.elementAt(i+1)>='a'&&p.elementAt(i+1)<='z')){
try{
if(p.elementAt(i-2)=='~'){
p.add((i-2),'(');p.add((i-2),'(');p.add((i-2),'~');
p.set((i+3),'-');p.add((i+5),')');p.add((i+6),'-');
p.add((i+7),'~');p.add((i+8),'(');p.add((i+9),p.elementAt(i+2));
p.add((i+10),'-');p.add((i+11),'~');p.add((i+12),p.elementAt(i+4));
p.add((i+13),')');p.add((i+14),')');
}
else{p.add((i-1),'(');p.add((i-1),'(');p.add((i-1),'~');
p.set((i+3),'-');p.add((i+5),')');p.add((i+6),'-');
p.add((i+7),'~');p.add((i+8),'(');p.add((i+9),p.elementAt(i+4));
p.add((i+10),'-');p.add((i+11),p.elementAt(i+2));p.add((i+12),')');
p.add((i+13),')');
}
}catch(ArrayIndexOutOfBoundsExceptione){
p.add((i-1),'(');p.add((i-1),'(');p.add((i-1),'~');
p.set((i+3),'-');p.add((i+5),')');p.add((i+6),'-');
p.add((i+7),'~');p.add((i+8),'(');p.add((i+9),p.elementAt(i+4));
p.add((i+10),'-');p.add((i+11),p.elementAt(i+2));p.add((i+12),')');
p.add((i+13),')');
}
}
processDisplay(p);
}
}
transformComma(p);
proveFormula(w,p);
removeKuohao(w,p);
proveOutput(w,p);
judgeResult(w,p);
}
publicvoidtransformComma(Vectorp){//把单箭头转化为"逗号"
Stringout=null;
intlcount=0;
intrcount=0;
System.out.println("进一步化简命题公式:
");
for(inti=0;i
if(p.elementAt(i)=='-'){
if(p.elementAt(i-1)>='a'&&p.elementAt(i-1)<='z'){
try{
if(p.elementAt(i-2)=='~'){
try{
p.removeElementAt(i-2);p.set((i-1),',');
}catch(ArrayIndexOutOfBoundsExceptione){
p.removeElementAt(i-2);p.set((i-1),',');
}
}
else{p.insertElementAt('~',(i-1));p.set((i+1),',');}
}catch(ArrayIndexOutOfBoundsExceptione){p.insertElementAt('~',(i-1));p.set((i+1),',');}
}
elseif(p.elementAt(i-1)==')'){
for(intj=i-1;j>=0;j--){
if(p.elementAt(j)==')'){lcount++;}
if(p.elementAt(j)=='('){lcount--;}
if(lcount==0){
try{
if(p.elementAt(j-1)=='~'){p.removeElementAt(j-1);p.set((i-1),',');}
else{p.insertElementAt('~',j);p.set((i+1),',');}
}catch(ArrayIndexOutOfBoundsExceptione){
p.insertElementAt('~',j);p.set((i+1),',');
}
break;
}
}
}
}
else{continue;}
processDisplay(p);
}
}
publicvoidproveFormula(Vectorw,Vectorp){//用推理规则推导命题公