用C++代码写输入公式,例如(pVq)→→r,输出该公式的真值表及其主析取、合 取范式。
时间: 2024-12-20 18:29:19 浏览: 12
主析取范式
以下是一个使用C++编写的程序,可以实现输入公式(如 `(p V q) → r`),并输出该公式的真值表及其主析取范式和主合取范式:
```cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 计算逻辑表达式的值
bool evaluateExpression(bool p, bool q, bool r, const string& formula) {
if (formula == "p") return p;
if (formula == "q") return q;
if (formula == "r") return r;
if (formula == "!p") return !p;
if (formula == "!q") return !q;
if (formula == "!r") return !r;
int depth = 0;
for (int i = 0; i < formula.length(); ++i) {
if (formula[i] == '(') depth++;
else if (formula[i] == ')') depth--;
else if ((formula[i] == 'V' || formula[i] == '^' || formula[i] == '>') && depth == 0) {
string left = formula.substr(0, i);
string right = formula.substr(i + 1);
bool leftValue = evaluateExpression(p, q, r, left);
bool rightValue = evaluateExpression(p, q, r, right);
if (formula[i] == 'V') return leftValue || rightValue;
if (formula[i] == '^') return leftValue && rightValue;
if (formula[i] == '>') return !leftValue || rightValue;
}
}
return false; // 如果解析失败,默认返回false
}
// 打印真值表
void printTruthTable(const string& formula) {
cout << "p\tq\tr\t" << formula << endl;
vector<vector<bool>> truthValues;
for (int p = 0; p <= 1; ++p) {
for (int q = 0; q <= 1; ++q) {
for (int r = 0; r <= 1; ++r) {
bool result = evaluateExpression(p, q, r, formula);
cout << p << "\t" << q << "\t" << r << "\t" << result << endl;
truthValues.push_back({p, q, r, result});
}
}
}
// 主析取范式
cout << "主析取范式: ";
for (const auto& row : truthValues) {
if (row[3]) { // 只考虑结果为真的行
cout << "(";
cout << (row[0] ? "p" : "!p");
cout << " ^ ";
cout << (row[1] ? "q" : "!q");
cout << " ^ ";
cout << (row[2] ? "r" : "!r");
cout << ") ";
}
}
cout << endl;
// 主合取范式
cout << "主合取范式: ";
for (const auto& row : truthValues) {
if (!row[3]) { // 只考虑结果为假的行
cout << "(";
cout << (row[0] ? "!p" : "p");
cout << " V ";
cout << (row[1] ? "!q" : "q");
cout << " V ";
cout << (row[2] ? "!r" : "r");
cout << ") ";
}
}
cout << endl;
}
int main() {
string formula;
cout << "请输入公式 (例如 (p V q) -> r): ";
cin >> formula;
printTruthTable(formula);
return 0;
}
```
### 说明
1. **evaluateExpression** 函数用于计算给定命题变量 `p`, `q`, `r` 下的逻辑表达式的值。
2. **printTruthTable** 函数生成并打印真值表,并计算主析取范式和主合取范式。
3. **main** 函数读取用户输入的公式,并调用 `printTruthTable` 函数进行处理。
### 使用方法
1. 编译并运行程序。
2. 输入逻辑公式,例如 `(p V q) -> r`。
3. 程序将输出该公式的真值表及其主析取范式和主合取范式。
希望这个示例对你有帮助!如果有任何问题或需要进一步的帮助,请随时告诉我。
阅读全文