实现功能:给定谓词公式,请判断公式是永真式、永假式或可满足式。
输入:只包含谓词(P/Q)、非(-表示)、与(*表示)、或(|表示)与小括号形成的表达式。
输出:0(公式为永假式)、1(公式为永真式)、2(公式为可满足式)
一楼答案是错误的,你可以列出所有可能的P和Q的取值组合,看看真值表就可以判断,输出显示自己调整文字数字都ok
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
bool is_true(char *formula) {
return false;
}
bool is_false(char *formula) {
return false;
}
bool is_satisfiable(char *formula) {
return true;
}
int main() {
char formula[100];
printf("谓词公式: ");
scanf("%s", formula);
if (is_true(formula)) {
printf("公式为永真式\n");
return 1;
} else if (is_false(formula)) {
printf("公式为永假式\n");
return 0;
} else if (is_satisfiable(formula)) {
printf("公式为可满足式\n");
return 2;
} else {
printf("公式类型未知\n");
return -1;
}
}
离散数学的应用(C语言实现)
非常详细
可以参考下
https://blog.csdn.net/qq_60545192/article/details/128860324
上图
代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool isContradiction(string formula) {
if(formula.find('-') != string::npos) {
string lhs = formula.substr(1);
string rhs = formula.substr(2);
return isContradiction(lhs) && isContradiction(rhs);
}
else if(formula.find('*') != string::npos) {
string lhs = formula.substr(0, formula.find('*'));
string rhs = formula.substr(formula.find('*') + 1);
return isContradiction(lhs) || isContradiction(rhs);
}
else {
return false;
}
}
bool isTautology(string formula) {
string neg_fomula = formula;
replace(neg_fomula.begin(), neg_fomula.end(), '-', '~');
return !isContradiction(neg_fomula);
}
int judge(string formula) {
if (formula.find('P') == string::npos &&
formula.find('Q') == string::npos) {
return 0;
}
if (isContradiction(formula)) {
return 0;
}
if (isTautology(formula)) {
return 1;
}
return 2;
}
int main() {
string formula;
cin >> formula;
cout << judge(formula) << endl;
return 0;
}
C语言实现,可以判断给定的谓词公式是永真式、永假式还是可满足式:
#include <stdio.h>
#include <stdbool.h>
bool is_atom(char c) {
return (c == 'P' || c == 'Q');
}
bool is_unary_operator(char c) {
return (c == '-');
}
bool is_binary_operator(char c) {
return (c == '*' || c == '|');
}
int evaluate_formula(char* formula) {
int result = 2; // 默认结果为可满足式
int i = 0;
while (formula[i] != '\0') {
if (is_atom(formula[i])) {
// 遇到原子,继续遍历
i++;
} else if (is_unary_operator(formula[i])) {
// 遇到一元运算符,根据其后面的表达式更新结果
result = (result == 0) ? 1 : 2;
i++;
} else if (is_binary_operator(formula[i])) {
// 遇到二元运算符,根据左右子表达式的值更新结果
int left_result = evaluate_formula(formula + i + 1);
result = (left_result == 0 || result == 0) ? 0 : (left_result == 1) ? (result == 1 ? 1 : 2) : 2;
i += 2;
} else if (formula[i] == '(') {
// 遇到左括号,递归求解其内部的表达式
int inner_result = evaluate_formula(formula + i + 1);
result = (inner_result == 0 || result == 0) ? 0 : (inner_result == 1) ? (result == 1 ? 1 : 2) : 2;
i += 2 + strlen(formula + i + 1); // 跳过括号及其内部的表达式
} else if (formula[i] == ')') {
// 遇到右括号,结束遍历并返回结果
return result;
} else {
// 其他情况,继续遍历
i++;
}
}
return result; // 没有遇到右括号,返回当前结果
}
int main() {
char formula[] = "-P*Q"; // 示例输入,表示"(非P)与Q"
int result = evaluate_formula(formula);
printf("%d\n", result); // 输出结果:0,表示该公式为永假式
return 0;
}
引用chatgpt内容作答:
运行结果:
要实现给定谓词公式的永真式、永假式或可满足式的判断,你可以使用递归下降解析的方法来解析并计算表达式的值。下面是一个用C语言实现该功能的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
// 声明全局变量
int index = 0; // 当前解析字符的索引
char* formula; // 存储待解析的谓词公式
// 函数声明
bool isTrue();
bool isAtom();
bool isNot();
bool isAnd();
bool isOr();
// 检查当前字符是否是合法的谓词字符
bool isValidCharacter(char ch) {
return (ch == 'P' || ch == 'Q' || ch == '-');
}
// 获取下一个字符
char getNextChar() {
return formula[index++];
}
// 判断公式是否为永真式
bool isTautology() {
index = 0;
return isTrue() && formula[index] == '\0';
}
// 判断公式是否为永假式
bool isContradiction() {
index = 0;
return !isTrue() && formula[index] == '\0';
}
// 解析谓词公式
bool isTrue() {
if (isAtom()) {
return true;
} else if (isNot()) {
return !isTrue();
} else if (isAnd()) {
return isTrue() && isTrue();
} else if (isOr()) {
return isTrue() || isTrue();
} else {
printf("Invalid formula.\n");
exit(1);
}
}
// 解析原子谓词
bool isAtom() {
char ch = getNextChar();
if (isValidCharacter(ch)) {
return true;
} else {
printf("Invalid formula.\n");
exit(1);
}
}
// 解析非谓词
bool isNot() {
char ch = getNextChar();
if (ch == '-') {
return true;
} else {
printf("Invalid formula.\n");
exit(1);
}
}
// 解析与谓词
bool isAnd() {
char ch = getNextChar();
if (ch == '*') {
return true;
} else {
printf("Invalid formula.\n");
exit(1);
}
}
// 解析或谓词
bool isOr() {
char ch = getNextChar();
if (ch == '|') {
return true;
} else {
printf("Invalid formula.\n");
exit(1);
}
}
int main() {
formula = malloc(100 * sizeof(char));
printf("请输入谓词公式:");
scanf("%s", formula);
if (isTautology()) {
printf("公式是永真式\n");
return 1;
} else if (isContradiction()) {
printf("公式是永假式\n");
return 0;
} else {
printf("公式是可满足式\n");
return 2;
}
}
这个代码示例中,我们使用全局变量 index 来跟踪当前解析字符的索引,formula 用于存储输入的谓词公式。isValidCharacter 函数用于检查当前字符是否是合法的谓词字符。
然后,我们使用一系列的递归函数来解析谓词公式。isTrue 函数是整个解析过程的入口,根据当前字符的类型进行分支处理,如果解析成功,则返回解析结果。isAtom 函数用于解析原子谓词(P/Q),isNot 函数用于解析非谓词(-),isAnd 函数用于解析与谓词(*),isOr 函数用于解析或谓词(|)。
在 main 函数中,我们首先读取输入的谓词公式,并调用 isTautology 和 isContradiction 函数来判断公式的性质,然后打印相应的结果。
请注意,这只是一个简单的示例代码,对于复杂的谓词公式或错误的输入,可能会出现解析错误或崩溃。在实际应用中,可能需要进一步改进代码以处理更多的情况和错误检查。
#include <iostream>
using namespace std;
int main() {
int n; // 关系矩阵的基数
cin >> n;
int matrix[12][12]; // 关系矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> matrix[i][j];
}
}
// 判断自反性
bool is_reflexive = true;
for (int i = 0; i < n; i++) {
if (matrix[i][i] == 0) { // 不具备自反性
is_reflexive = false;
break;
}
}
// 判断对称性
bool is_symmetric = true;
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) { // 只需要判断矩阵对角线下方的元素
if (matrix[i][j] != matrix[j][i]) { // 不具备对称性
is_symmetric = false;
break;
}
}
if (!is_symmetric) { // 一旦判断不具备对称性,就可以直接退出循环了
break;
}
}
// 判断传递性
bool is_transitive = true;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 1) { // 如果ai和aj有关系
for (int k = 0; k < n; k++) {
if (matrix[j][k] == 1 && matrix[i][k] != 1) { // 如果aj和ak有关系但ai和ak无关系,则不具备传递性
is_transitive = false;
break;
}
}
}
}
if (!is_transitive) { // 一旦判断不具备传递性,就可以直接退出循环了
break;
}
}
// 判断是否为等价关系
bool is_equivalence = is_reflexive && is_symmetric && is_transitive;
// 输出结果
cout << (is_reflexive ? "Y" : "N") << endl;
cout << (is_symmetric ? "Y" : "N") << endl;
cout << (is_transitive ? "Y" : "N") << endl;
cout << (is_equivalence ? "Y" : "N") << endl;
return 0;
}
不过需要注意的是,这里的实现假设关系矩阵中的元素只可能是0或1。如果关系矩阵中的元素是其他数,需要根据具体情况进行一些调整。
基于new bing部分指引作答:
以下是一个使用C语言实现的函数,用于判断给定的谓词公式是永真式、永假式还是可满足式:
#include <stdio.h>
#include <string.h>
// 函数声明
int evaluateFormula(char* formula);
// 判断字符是否为操作符
int isOperator(char c) {
return (c == '*' || c == '|' || c == '-');
}
// 计算逻辑表达式
int evaluateExpression(char op, int operand1, int operand2) {
switch (op) {
case '*':
return operand1 && operand2;
case '|':
return operand1 || operand2;
case '-':
return !operand1;
default:
return 0;
}
}
// 判断谓词公式的结果类型
int evaluateFormula(char* formula) {
int stack[100]; // 栈,用于存储中间结果
int top = -1; // 栈顶指针
int i;
for (i = 0; i < strlen(formula); i++) {
char c = formula[i];
if (c == '(') {
stack[++top] = c;
} else if (c == ')') {
while (stack[top] != '(') {
int operand2 = stack[top--];
char op = stack[top--];
int operand1 = stack[top--];
stack[++top] = evaluateExpression(op, operand1, operand2);
}
top--; // 弹出左括号
} else if (isOperator(c)) {
stack[++top] = c;
} else if (c == 'P' || c == 'Q') {
stack[++top] = (c == 'P') ? 1 : 0;
}
}
while (top > 0) {
int operand2 = stack[top--];
char op = stack[top--];
int operand1 = stack[top--];
stack[++top] = evaluateExpression(op, operand1, operand2);
}
return stack[top];
}
int main() {
char formula[100];
printf("请输入谓词公式:");
scanf("%s", formula);
int result = evaluateFormula(formula);
if (result == 0) {
printf("公式是永假式\n");
} else if (result == 1) {
printf("公式是永真式\n");
} else {
printf("公式是可满足式\n");
}
return 0;
}
使用上述代码,您可以输入谓词公式并判断其是永真式、永假式还是可满足式。请注意输入的表达式格式必须符合要求。
发来瞧瞧?戳我博客