为命题逻辑公式创建真值表?
Creating truth tables for propositional logic formulas?
我想创建一个程序,根据用户给定的逻辑公式,例如 ((¬A ∧ B) ∨ C) ∧ A,计算其真值 table。
在这种情况下,如果 A=1、B=0、C=1,或者如果 A=1、B=1、C=1,则公式为真,在任何其他情况下为假。
但是,我不知道如何创建一个方法来读取给定的表达式,然后计算所有可能的结果。
I don't know how to create a method that can read the expression given, and then calculate all the possible outcomes.
好的,让我们从将任务分解为子任务开始。
这是您需要做的...
- 将您获得的字符串解析为程序使用的某些内部数据结构的输入。这是一项艰巨的任务。确保通过单元测试覆盖相关方法。
- 计算真值表。这更容易。您只需要遍历所有可能的输入集。这些将是从 0 到 2^n-1 的二进制数,其中
n
是布尔输入的数量。
让我们看看您可以使用哪些资源...
- 对于解析部分,您可以调整 this
- 要生成所有可能的输入,您可以使用 this
此外,请确保通过单元测试覆盖您的方法。像这样复杂的逻辑很容易出错,调试起来要花好几个小时。因此,单元测试将为您节省大量时间。
这能解决您的问题吗?在评论里告诉我。
试试这个。
interface Bool {
boolean get();
default Bool and(Bool r) { return () -> get() ? r.get() : false; }
default Bool or(Bool r) { return () -> get() ? true : r.get(); }
default Bool not() { return () -> !get(); }
}
static class TruthTable {
String formula;
int index, ch;
List<Character> variables;
Map<Character, Boolean> map;
Bool bool;
int get() {
return ch = index < formula.length() ? formula.charAt(index++) : -1;
}
boolean match(int expect) {
if (ch == expect) {
get();
return true;
}
return false;
}
Bool element() {
Bool b;
if (match('(')) {
b = expression();
if (!match(')'))
throw new RuntimeException("')' expected");
} else if (Character.isAlphabetic(ch)) {
char v = (char) ch;
get();
if (!variables.contains(v))
variables.add(v);
b = () -> map.get(v);
} else
throw new RuntimeException("unknown char: " + (char) ch);
return b;
}
Bool factor() {
if (match('¬'))
return element().not();
return element();
}
Bool term() {
Bool b = factor();
while (match('∧'))
b = b.and(factor());
return b;
}
Bool expression() {
Bool b = term();
while (match('∨'))
b = b.or(term());
return b;
}
String str(boolean b) {
return b ? "T" : "F";
}
void print() {
for (char v : variables)
System.out.print(str(map.get(v)) + " ");
System.out.println(str(bool.get()));
}
void test(int i) {
if (i >= variables.size())
print();
else {
char c = variables.get(i);
map.put(c, true);
test(i + 1);
map.put(c, false);
test(i + 1);
}
}
public void make(String formula) {
this.formula = formula.replaceAll("\s", "");
index = 0;
variables = new ArrayList<>();
map = new HashMap<>();
get();
bool = expression();
if (ch != -1)
throw new RuntimeException(
"extra string '" + formula.substring(index - 1) + "'");
for (char v : variables)
System.out.print(v + " ");
System.out.println(formula);
test(0);
System.out.println();
}
}
和
public static void main(String[] args) {
new TruthTable().make("¬A");
new TruthTable().make("¬A ∧ B");
new TruthTable().make("(¬A ∧ B) ∨ C");
new TruthTable().make("((¬A ∧ B) ∨ C) ∧ A");
}
输出:
A ¬A
T F
F T
A B ¬A ∧ B
T T F
T F F
F T T
F F F
A B C (¬A ∧ B) ∨ C
T T T T
T T F F
T F T T
T F F F
F T T T
F T F T
F F T T
F F F F
A B C ((¬A ∧ B) ∨ C) ∧ A
T T T T
T T F F
T F T T
T F F F
F T T F
F T F F
F F T F
F F F F
我想创建一个程序,根据用户给定的逻辑公式,例如 ((¬A ∧ B) ∨ C) ∧ A,计算其真值 table。 在这种情况下,如果 A=1、B=0、C=1,或者如果 A=1、B=1、C=1,则公式为真,在任何其他情况下为假。
但是,我不知道如何创建一个方法来读取给定的表达式,然后计算所有可能的结果。
I don't know how to create a method that can read the expression given, and then calculate all the possible outcomes.
好的,让我们从将任务分解为子任务开始。 这是您需要做的...
- 将您获得的字符串解析为程序使用的某些内部数据结构的输入。这是一项艰巨的任务。确保通过单元测试覆盖相关方法。
- 计算真值表。这更容易。您只需要遍历所有可能的输入集。这些将是从 0 到 2^n-1 的二进制数,其中
n
是布尔输入的数量。
让我们看看您可以使用哪些资源...
- 对于解析部分,您可以调整 this
- 要生成所有可能的输入,您可以使用 this
此外,请确保通过单元测试覆盖您的方法。像这样复杂的逻辑很容易出错,调试起来要花好几个小时。因此,单元测试将为您节省大量时间。
这能解决您的问题吗?在评论里告诉我。
试试这个。
interface Bool {
boolean get();
default Bool and(Bool r) { return () -> get() ? r.get() : false; }
default Bool or(Bool r) { return () -> get() ? true : r.get(); }
default Bool not() { return () -> !get(); }
}
static class TruthTable {
String formula;
int index, ch;
List<Character> variables;
Map<Character, Boolean> map;
Bool bool;
int get() {
return ch = index < formula.length() ? formula.charAt(index++) : -1;
}
boolean match(int expect) {
if (ch == expect) {
get();
return true;
}
return false;
}
Bool element() {
Bool b;
if (match('(')) {
b = expression();
if (!match(')'))
throw new RuntimeException("')' expected");
} else if (Character.isAlphabetic(ch)) {
char v = (char) ch;
get();
if (!variables.contains(v))
variables.add(v);
b = () -> map.get(v);
} else
throw new RuntimeException("unknown char: " + (char) ch);
return b;
}
Bool factor() {
if (match('¬'))
return element().not();
return element();
}
Bool term() {
Bool b = factor();
while (match('∧'))
b = b.and(factor());
return b;
}
Bool expression() {
Bool b = term();
while (match('∨'))
b = b.or(term());
return b;
}
String str(boolean b) {
return b ? "T" : "F";
}
void print() {
for (char v : variables)
System.out.print(str(map.get(v)) + " ");
System.out.println(str(bool.get()));
}
void test(int i) {
if (i >= variables.size())
print();
else {
char c = variables.get(i);
map.put(c, true);
test(i + 1);
map.put(c, false);
test(i + 1);
}
}
public void make(String formula) {
this.formula = formula.replaceAll("\s", "");
index = 0;
variables = new ArrayList<>();
map = new HashMap<>();
get();
bool = expression();
if (ch != -1)
throw new RuntimeException(
"extra string '" + formula.substring(index - 1) + "'");
for (char v : variables)
System.out.print(v + " ");
System.out.println(formula);
test(0);
System.out.println();
}
}
和
public static void main(String[] args) {
new TruthTable().make("¬A");
new TruthTable().make("¬A ∧ B");
new TruthTable().make("(¬A ∧ B) ∨ C");
new TruthTable().make("((¬A ∧ B) ∨ C) ∧ A");
}
输出:
A ¬A
T F
F T
A B ¬A ∧ B
T T F
T F F
F T T
F F F
A B C (¬A ∧ B) ∨ C
T T T T
T T F F
T F T T
T F F F
F T T T
F T F T
F F T T
F F F F
A B C ((¬A ∧ B) ∨ C) ∧ A
T T T T
T T F F
T F T T
T F F F
F T T F
F T F F
F F T F
F F F F