用C++代码写输入公式,例如(pVq)→r,输出该公式的真值表及其主析取、合 取范式。真,假用1,0表示。
时间: 2024-12-20 09:29:30 浏览: 7
vins论文公式推导
好的,以下是一个用C++编写的示例代码,用于输入公式 \((p \vee q) \rightarrow r\) 并输出该公式的真值表及其主析取范式和主合取范式:
```cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 计算逻辑运算的结果
bool evaluateFormula(bool p, bool q, bool r) {
return !(p || q) || r;
}
// 生成真值表
void generateTruthTable() {
vector<vector<int>> truthTable(8, vector<int>(4));
int index = 0;
for (int p = 0; p <= 1; ++p) {
for (int q = 0; q <= 1; ++q) {
for (int r = 0; r <= 1; ++r) {
truthTable[index][0] = p;
truthTable[index][1] = q;
truthTable[index][2] = r;
truthTable[index][3] = evaluateFormula(p, q, r);
index++;
}
}
}
// 输出真值表
cout << "p\tq\tr\t(p ∨ q) → r" << endl;
for (const auto &row : truthTable) {
for (int val : row) {
cout << val << "\t";
}
cout << endl;
}
return truthTable;
}
// 生成主析取范式
string generateDNF(const vector<vector<int>>& truthTable) {
string dnf = "";
for (const auto &row : truthTable) {
if (row[3] == 1) { // 如果公式为真
dnf += "(";
if (row[0] == 1) {
dnf += "p";
} else {
dnf += "!p";
}
dnf += " ∧ ";
if (row[1] == 1) {
dnf += "q";
} else {
dnf += "!q";
}
dnf += " ∧ ";
if (row[2] == 1) {
dnf += "r";
} else {
dnf += "!r";
}
dnf += ") ∨ ";
}
}
if (!dnf.empty()) {
dnf.pop_back(); // 去掉最后一个多余的 '∨'
dnf.pop_back();
}
return dnf;
}
// 生成主合取范式
string generateCNF(const vector<vector<int>>& truthTable) {
string cnf = "";
for (const auto &row : truthTable) {
if (row[3] == 0) { // 如果公式为假
cnf += "(";
if (row[0] == 1) {
cnf += "!p";
} else {
cnf += "p";
}
cnf += " ∨ ";
if (row[1] == 1) {
cnf += "!q";
} else {
cnf += "q";
}
cnf += " ∨ ";
if (row[2] == 1) {
cnf += "!r";
} else {
cnf += "r";
}
cnf += ") ∧ ";
}
}
if (!cnf.empty()) {
cnf.pop_back(); // 去掉最后一个多余的 '∧'
cnf.pop_back();
}
return cnf;
}
int main() {
vector<vector<int>> truthTable = generateTruthTable();
string dnf = generateDNF(truthTable);
string cnf = generateCNF(truthTable);
cout << "主析取范式: " << dnf << endl;
cout << "主合取范式: " << cnf << endl;
return 0;
}
```
### 解释
1. **evaluateFormula**: 这个函数计算给定 \(p\), \(q\), \(r\) 下公式 \((p \vee q) \rightarrow r\) 的真假值。
2. **generateTruthTable**: 生成并输出公式 \((p \vee q) \rightarrow r\) 的真值表。
3. **generateDNF**: 根据真值表生成主析取范式。
4. **generateCNF**: 根据真值表生成主合取范式。
5. **main**: 主函数调用上述函数,并输出结果。
运行这个程序会生成并显示公式的真值表、主析取范式和主合取范式。希望这对你有帮助!
阅读全文