0

javaで最小項(ブール代数)の合計を生成するにはどうすればよいですか? minterms throw ANDing の合計を生成できます(X+X')。次の例は、3 つの変数 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それがどの変数であるbooleanかを示す a と、変数が否定されているかどうかを示す a を含めることができます。最初にすべきことはtermsOfTheFunction、式を表すオブジェクトをループして作成することです。次に、minterm をループして、1 つの変数が欠落している minterm が表示されるたびに、それをリストから削除して、欠落している変数を持つ 2 つの新しい minterms を追加できます。最後に、完成した 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。文字が表示されるたびに、次の文字を見て、それが であるかどうかを確認し、その文字と正しい否定で´an を追加します。Atomが表示されるたびに+、新しいMintermを作成して に追加しexpression、続けてください。その後、最小項の分析と拡張を開始できます。

あなたのコードに応じて編集してください: 順調に進んでいるようです! 両方のアトムが同じ最小項に追加される理由は、 and と言うので、両方とm1k番目の最小項をm2参照するためです。リストから要素をコピーまたは削除しません。要素はリスト内に残ります。そのため、古いものからのすべてのアトムと新しいアトムを含む新しい minterm を作成する必要があります。m1 = minterms.get(k);m2 = minterms.get(k);get()m2

于 2012-07-31T22:24:12.007 に答える