0

如何在java中生成minterms(布尔代数)的总和?我们可以用 生成最小项的总和(X+X')。以下示例解释了具有三个变量 A、B 和 C 的函数的算法:

F(A,B,C)= A + B´*C
        = A*(B+B´) + B´*C
        = A*B + A*B´ + B´*C
        = A*B*(C+C´) + A*B´*(C+C´) + B´*C*(A+A´)
        = A*B*C+A*B*C´+A*B´*C+A*B´*C´+B´*C*A+B´*C*A´
        = A*B*C+A*B*C´+A*B´*C+A*B´*C´+A*B´*C+A´*B´*C

java中的方法如下所示:

String generateSumOfMinterms(String termsOfTheFunction, String variables){}


// Examples for functions with 2 variables A,B
generateSumOfMinterms("A", "A,B"){

//The result should looks like this
return "A*B+A*B'";
}
generateSumOfMinterms("A+B'", "A,B"){

//The result should looks like this (repeated terms are ok for example A*B')
return "A*B+A*B'+A'*B'+A*B'";
}


// Example for a function with 3 variables A,B,C 
generateSumOfMinterms("A", "A,B,C"){

//The result should looks like this
return "A*B*C+A*B*C'+A*B'*C+A*B'*C'";
}

我尝试了以下方法:

public List<Minterm> completeMinterm(Minterm minterm, String variables){
    List<Minterm> minterms=new ArrayList<Minterm>();
    minterms.add(minterm);
    Minterm m1=new Minterm();
    Minterm m2=new Minterm();
    for (int k = 0; k < minterms.size(); k++) {
 //A AB--> AB+AB'
        for (int i = 0; i < variables.length(); i++) {
        boolean varInMinterm=false;
        for (int j = 0; j < minterms.get(k).atoms.size(); j++) {
            if(minterms.get(k).atoms.get(j).variable==variables.charAt(i)){
                varInMinterm=true;
                break;
            }
        }
        if(!varInMinterm){
            varInMinterm=false;
            m1= minterms.get(k);
            m1.addAtom(new Atom(variables.charAt(i),false));
            m2 = minterms.get(k);
            m2.addAtom(new Atom(variables.charAt(i),true));
            minterms.remove(k);
            minterms.add(m1);   
            minterms.add(m2);   
            k=0;

        }
    }
    }

我使用eclipse调试器发现错误,我不明白,为什么添加到m2的原子也同时添加到m1,运行此行时:

m2.addAtom(new Atom(variables.charAt(i),true));
4

1 回答 1

2

下面是一种可能的方法的概要:首先,您应该创建一个更方便的表达式表示 - 例如,表达式可以是一个Minterm类的实例列表,并且Minterm可以包含一个Atom类的实例列表,每个其中可以包含char告诉它是哪个变量的 a 和boolean告诉变量是否被否定的 a 。您应该做的第一件事是循环termsOfTheFunction并创建表示表达式的此类对象。然后,您可以循环遍历这些最小术语,每次看到缺少一个变量的最小术语时,您都可以将其从列表中删除并添加两个带有缺少变量的新最小术语。最后,您可以遍历完成的 minterms 并将它们“打印”到 result String

每个请求的类声明和为清楚起见(为简洁起见使用公共字段):

public class Atom {
    public final char variable;
    public final bool negated;
    public Atom(char variable, bool negated) {
        this.variable = variable;
        this.negated = negated;
    }
}

public class Minterm {
    public final List<Atom> atoms = new ArrayList<Atom>();
}

generateSumOfMinterms()

List<Minterm> expression = new ArrayList<Minterm>();
Minterm currentMinterm = new Minterm();
expression.add(currentMinterm);

然后,遍历 的字符termsOfTheFunction。每次看到一个字母时,查看下一个字符是否是 a ,并在该字母和正确的否定后´加上 an 。Atom每次看到+,创建一个新的Minterm并将其添加到expression,然后继续。之后,您可以开始分析并扩展它们。

根据您的代码进行编辑:看起来您一切顺利!两个原子都被添加到同一个最小项的原因是,自从你说and以来,两者m1m2引用了第k个最小项。不会从列表中复制或删除元素;该元素仍将在列表内。因此,对于,您需要创建一个新的最小项,其中包含旧原子中的所有原子以及新原子。m1 = minterms.get(k);m2 = minterms.get(k);get()m2

于 2012-07-31T22:24:12.007 回答