如何在不使用外部Java插件的情况下简化布尔代数表达式?
我正在尝试从项目的另一部分生成布尔代数表达式,并在输出之前对其进行简化。由于程序其余部分的性质,此布尔表达式将仅包含or语句 例如,以aC+bC+bC+Ab+aC+aC+Ab这样的表达式开头,以A+C结尾。小写字母表示not,例如A表示not A 我花了好几个小时试图弄明白这一点,但每次我解决了一个案子,就毁了另一个。我想对于这个问题有一些递归函数,但我很难在别处找到任何东西 编辑:说得清楚一点,我知道如何在纸上简化表达式,但我无法用Java来简化它 提前谢谢如何在不使用外部Java插件的情况下简化布尔代数表达式?,java,boolean,simplify,Java,Boolean,Simplify,我正在尝试从项目的另一部分生成布尔代数表达式,并在输出之前对其进行简化。由于程序其余部分的性质,此布尔表达式将仅包含or语句 例如,以aC+bC+bC+Ab+aC+aC+Ab这样的表达式开头,以A+C结尾。小写字母表示not,例如A表示not A 我花了好几个小时试图弄明白这一点,但每次我解决了一个案子,就毁了另一个。我想对于这个问题有一些递归函数,但我很难在别处找到任何东西 编辑:说得清楚一点,我知道如何在纸上简化表达式,但我无法用Java来简化它 提前谢谢 public static voi
public static void mutate (ArrayList<String> Final, ArrayList<String> Factored, String a){
int multiples = 0;
String holder = "";
for (int i = 0; i < Final.size(); i++){
if (Final.get(i).contains(a)){
multiples++;
if (multiples == 1)
holder = Final.get(i);
if (multiples >=2)
Factored.add(Final.get(i));
}
}
if (multiples > 1)
Factored.add(holder);
}
public static void simplify (ArrayList<String> Factored, char a, ArrayList<String> Main){
String temp = "";
int size = Factored.size();
int cnt = 0;
int cnt2 = 0;
int holder = 0;
System.out.println(Factored);
int menial = 0;
if (Factored.size() == 0)
menial = 1;
else{
for (int i = 0; i < size; i++){ //Gets rid of leading letters
if(Factored.get(i).charAt(0) == a){
temp = Factored.get(i).substring(1);
Factored.add(temp);
}
}
for (int i = 0; i < size; i++){ //Gets rid of leading letters
if(Factored.get(i).charAt(1) == a){
temp = Factored.get(i).substring(1);
Factored.add(temp);
}
}
for (int j = 0; j < size; j++){
Factored.remove(j - cnt);
cnt++;
}
for (int i = 0; i < Factored.size(); i++){ //gets rid of duplicates if they exist
for (int j = i + 1; j < Factored.size();j++)
if (Factored.get(i).equals(Factored.get(j))){
cnt2++;
if (cnt2 == 1)
holder = i;
}
}
if (cnt2 >= 1)
Factored.remove(holder);
String temp1 = "";
int size1 = Factored.size();
for (int i = 0; i < size1; i++){ //Makes it uppercase
temp1 = Factored.get(i).toUpperCase();
Factored.add(temp1);
}
int cnt3 = 0;
for (int i = 0; i <size1; i++){
Factored.remove(i-cnt3);
cnt3++;
}
int sizeOver2 = Factored.size()/2;
int holder1 = 0; int holder2 = 0;
for (int q = 0; q < sizeOver2; q++){
int cnt4 = 0;
for (int i = 0; i < Factored.size(); i++){ //gets rid of duplicates if they exist now that there are caps
for (int j = i + 1; j < Factored.size();j++)
if (Factored.get(i).equals(Factored.get(j))){
cnt4++;
if (cnt4 == 1)
holder1 = i;
holder2 = j;
}
if (cnt4 >= 1){
Factored.remove(holder1);
Factored.remove(holder2 - 1);
}
}
}
if (Factored.size() == 0)
Main.add(Character.toString(a));
else if (Factored.size() > 1)
menial = 5;
else
for (int i = 0; i < Factored.size(); i++)
Main.add(Factored.get(i));
}}
}
publicstaticvoidmutate(arraylistfinal,arraylistfactored,stringa){
整数倍=0;
字符串持有者=”;
对于(int i=0;i=2)
加上(最终得到(i));
}
}
如果(倍数>1)
加上(持有人);
}
公共静态void simplify(ArrayList Factored,char a,ArrayList Main){
字符串temp=“”;
int size=Factored.size();
int-cnt=0;
int cnt2=0;
int holder=0;
系统输出打印项次(系数);
int-menial=0;
如果(带系数的.size()==0)
半月板=1;
否则{
for(inti=0;i=1)
移除(支架);
字符串temp1=“”;
int size1=带系数的.size();
对于(inti=0;i1)
半月板=5;
其他的
对于(int i=0;i
Edit2:我已经在上面添加了我的代码。我为之前的草率道歉,快结束时它变得相当混乱。带系数的arraylist将布尔表达式的所有元素分开,例如,第一个元素是aC,第二个元素是bC,等等。我的计划是找到重复的元素并尝试将其系数化,但在对所有这些进行编码之后,我意识到了惊人的逻辑错误。它必须比这更复杂,在这一点上我迷失在我自己的代码中。我很难理解你的意思。你能更深入地谈谈你需要帮助的方面吗?也许把你现在的代码贴出来,你是如何在纸上简化它的;通过手动分解或使用k图?我还认为使用更正式的方法来否定符号更容易理解,例如
\u a
,a'
,或'a
。更清楚的是,它是对已知符号的否定,而不是对其他符号的否定。也许这只是一种偏好……你能提供你目前正在使用的代码吗?基本上,我只是想不出一种方法来编写一个简化的代码,这样程序就可以将任何布尔表达式或运算更改为最简单的形式。在纸上,我通过手动分解来简化它,我听说过k-映射,但我不熟悉它们。我也更喜欢使用“a”,但作业要求使用我前面提到的符号。我是一名高中生,所以我有点无知。