C++ 编程实现用真值表法求取任意含三个以内变量的合式 公式的主析取范式和主合取范式
时间: 2023-12-07 21:07:01 浏览: 80
可以通过以下步骤来实现:
1. 定义变量个数及其对应的变量名,例如对于三个变量,可以定义为:
```cpp
const int n = 3;
char var_name[n] = {'a', 'b', 'c'};
```
2. 构建真值表,使用二进制数表示每一行的变量取值情况,例如对于三个变量,真值表可以构建为:
```cpp
bool truth_table[8][3] = {
{0, 0, 0},
{0, 0, 1},
{0, 1, 0},
{0, 1, 1},
{1, 0, 0},
{1, 0, 1},
{1, 1, 0},
{1, 1, 1},
};
```
3. 输入合式公式,并将其转化为真值表的逻辑值,例如对于公式 `(a ∧ b) ∨ c`,可以转化为真值表的逻辑值:
```cpp
bool expr_value[8] = {
false, true, false, true, true, true, true, true
};
```
4. 根据主析取范式和主合取范式的定义,分别遍历真值表,将取值为真的行的变量值取反并保存为主析取范式,将取值为假的行的变量值取反并保存为主合取范式,例如对于上述公式,其主析取范式为 `(¬a ∧ ¬b ∧ c) ∨ (¬a ∧ b ∧ ¬c) ∨ (a ∧ ¬b ∧ ¬c) ∨ (a ∧ b ∧ ¬c) ∨ (a ∧ b ∧ c)`,主合取范式为 `(a ∨ c) ∧ (b ∨ c)`
```cpp
string main_DNF, main_CNF;
for (int i = 0; i < 8; i++) {
if (expr_value[i]) { // 主析取范式
string dnf;
for (int j = 0; j < n; j++) {
if (!truth_table[i][j]) {
dnf += "¬";
}
dnf += var_name[j];
dnf += " ∧ ";
}
dnf.pop_back(); // 去掉最后的 " ∧ "
dnf.pop_back();
dnf.pop_back();
main_DNF += "(" + dnf + ") ∨ ";
} else { // 主合取范式
string cnf;
for (int j = 0; j < n; j++) {
if (truth_table[i][j]) {
cnf += var_name[j];
cnf += " ∨ ";
} else {
cnf += "¬";
cnf += var_name[j];
cnf += " ∨ ";
}
}
cnf.pop_back(); // 去掉最后的 " ∨ "
cnf.pop_back();
cnf.pop_back();
main_CNF += "(" + cnf + ") ∧ ";
}
}
main_DNF.pop_back(); // 去掉最后的 " ∨ "
main_CNF.pop_back(); // 去掉最后的 " ∧ "
```
完整代码如下:
阅读全文