我怎么能在java中做cnf操作符?

时间:2013-05-11 18:03:14

标签: java acm-java-libraries conjunctive-normal-form

我正在尝试用Java做CNF操作符,并且我有一个相等的错误。

首先,我做了大部分软件,但我没有完全做到。

我的代码在这里:

import acm.program.*;
public class split extends ConsoleProgram{
public void run()
{
    String veri     = "(p or q or s or t or k) and (p or q)";
    String yeni     = tekrarsil(parcala(veri));

    int []sayilar = new int[yeni.length()];
    for (int i = 0; i < yeni.length(); i++) {
        sayilar[i] = readInt("give a number for "+yeni.charAt(i)+" :");

    }
    for (int i = 0; i < sayilar.length; i++) {
        println(sayilar[i]);
    }
}

public String parcala(String veri)
{
    String yenistr  = "";
    String yeni[]   = veri.split("and");
    for (int j = 0; j < yeni.length; j++) {
        String yveri[] = yeni[j].split("or");
        for (int i = 0; i < yveri.length; i++) {
            yveri[i] = yveri[i].trim();
            if(i==0){
                yenistr = yenistr.concat(yveri[i].substring(1));

            }else if(i==yveri.length-1){
                yenistr = yenistr.concat(yveri[i].substring(0,yveri[i].length()-1));

            }else{
                yenistr = yenistr.concat(yveri[i]);

            }
        }
    }
    return (yenistr);
}
public String tekrarsil(String S)
{
        for (int i = 0; i < S.length(); i++)
            for (int k = i+1; k <= S.length()-1; k++){
                if (S.charAt(i) == S.charAt(k))
                {
                    S = S.substring(0,k)+ S.substring(k+1,S.length());
                    k--;
                }
            }
        return S;

     }
    }

问题在于平等。

程序应检查变量是true还是false

例如:

(p or q or s or t or k) and (q or p)

这个程序的确如下:

为p:1提供一个数字(用户将给出一个数字(true)或零(false)) 给q:0的数字 给出一个数字:1 为t:0给出一个数字 给出一个k:0的数字 (如果变量使用多个,程序将询问一次)

如果我们看一下这些变量,我们可以看到(1或0或1或0或0)和(1或0) 它会返回true,但我不能这样做。我无法理解如何做到这一点。

祝福。

1 个答案:

答案 0 :(得分:2)

如何对 this solution 进行一些修改以满足您当前的需求?

或者,作为粗略的解决方法,您可以使用 Rhino 作为JavaScript引擎,只需将操作的文本表示更改为&&,{{1}等运算符等等,让JS引擎评估并给你结果。

如果您只对表达式的输出值感兴趣,则上述内容应该足够了。

如果你需要设计自己的算法,那么你需要自己编写一个解析器,这是一项繁琐的工作,但是可行。

让用户输入所有表达式以及运算符(它与实现的观点不会有太大不同)。您当然需要验证输入。您需要处理的数据包括||0括号(触发结果堆叠/取消堆叠)和运算符本身(以及另外,还有空格,但你应该忽略它们)。

基本上,从左到右进行评估,您可以获取第一个数据参数(10)并将其放在当前结果中。然后,您阅读运算符并将其应用于结果和下一条数据。依此类推,直到你到达输入的结尾。在遇到括号时,最简单的事情就是让解析器以括号内的表达式递归调用自身(你应该匹配它们)并将返回值视为序数数据。