C语言实现命题逻辑公式真值表计算与类型判断
#include <stdio.h>
// 定义逻辑联结词的枚举类型
enum LogicOperator {
AND, OR, NOT, IMPLY, EQUIV
};
// 逻辑联结词的基本功能函数
int andFunc(int p, int q) {
return p && q;
}
int orFunc(int p, int q) {
return p || q;
}
int notFunc(int p) {
return !p;
}
int implyFunc(int p, int q) {
return !p || q;
}
int equivFunc(int p, int q) {
return p == q;
}
// 输出真值表
void printTruthTable(int p[], int q[], int r[], int result[], int n) {
printf("P\tQ\tR\tResult\n");
for (int i = 0; i < n; i++) {
printf("%d\t%d\t%d\t%d\n", p[i], q[i], r[i], result[i]);
}
}
// 判断命题公式的类型
void judgeFormulaType(int result[], int n) {
int isTautology = 1;
int isContradiction = 1;
for (int i = 0; i < n; i++) {
if (result[i] != 1) {
isTautology = 0;
}
if (result[i] != 0) {
isContradiction = 0;
}
}
if (isTautology) {
printf("The formula is a tautology.\n");
} else if (isContradiction) {
printf("The formula is a contradiction.\n");
} else {
printf("The formula is satisfiable.\n");
}
}
int main() {
// 用户输入命题公式
int p[12], q[12], r[12];
int result[12];
int n = 12;
printf("Please enter the truth values of P, Q, R (0 or 1):\n");
for (int i = 0; i < n; i++) {
scanf("%d %d %d", &p[i], &q[i], &r[i]);
}
// 用户输入逻辑联结词
int operatorCount;
printf("Please enter the number of logic operators in the formula: ");
scanf("%d", &operatorCount);
int operators[operatorCount];
printf("Please enter the logic operators (0: AND, 1: OR, 2: NOT, 3: IMPLY, 4: EQUIV):\n");
for (int i = 0; i < operatorCount; i++) {
scanf("%d", &operators[i]);
}
// 计算命题公式的真值表
for (int i = 0; i < n; i++) {
int currP = p[i];
int currQ = q[i];
int currR = r[i];
for (int j = 0; j < operatorCount; j++) {
int currOperator = operators[j];
switch (currOperator) {
case AND:
currP = andFunc(currP, currQ);
break;
case OR:
currP = orFunc(currP, currQ);
break;
case NOT:
currP = notFunc(currP);
break;
case IMPLY:
currP = implyFunc(currP, currQ);
break;
case EQUIV:
currP = equivFunc(currP, currQ);
break;
default:
printf("Invalid operator!\n");
return 0;
}
}
result[i] = currP;
}
// 输出真值表和判断命题公式类型
printTruthTable(p, q, r, result, n);
judgeFormulaType(result, n);
return 0;
}
该代码实现了用户输入命题公式的功能,并根据用户输入的命题公式计算真值表和判断命题公式的类型(永真式、不可满足式、可满足式)。用户需要输入12个命题变元P、Q、R的真值,然后输入命题公式中逻辑联结词的数量和具体的逻辑联结词(使用0-4分别表示AND、OR、NOT、IMPLY、EQUIV),最后输出真值表和命题公式的类型。
原文地址: https://www.cveoy.top/t/topic/gSb 著作权归作者所有。请勿转载和采集!