C语言实现命题逻辑真值表生成器 - 逻辑联结词、永真式、不可满足式
C语言实现命题逻辑真值表生成器
本代码使用C语言实现了五个常用的逻辑联结词(与、或、非、蕴含、等价)的基本功能,并能根据用户输入的命题公式输出真值表和判断该命题公式的类型(永真式、不可满足式、可满足式)。
#include <stdio.h>
// 定义逻辑联结词的函数
int logicalAnd(int p, int q) {
return p && q;
}
int logicalOr(int p, int q) {
return p || q;
}
int logicalNot(int p) {
return !p;
}
int logicalImplication(int p, int q) {
return !p || q;
}
int logicalEquivalence(int p, int q) {
return p == q;
}
// 输出真值表
void printTruthTable(int (*logicFunc)(int, int), int p[], int q[], int r[], int size) {
printf(" P | Q | R | Result\n");
printf("---+---+---+--------\n");
for (int i = 0; i < size; i++) {
printf(" %d | %d | %d | %d\n", p[i], q[i], r[i], logicFunc(p[i], q[i]));
}
}
// 判断命题公式类型
void checkFormulaType(int (*logicFunc)(int, int), int p[], int q[], int r[], int size) {
int result[size];
for (int i = 0; i < size; i++) {
result[i] = logicFunc(p[i], q[i]);
}
int isTautology = 1; // 永真式
int isUnsatisfiable = 1; // 不可满足式
for (int i = 0; i < size; i++) {
if (result[i] == 0) {
isTautology = 0;
} else {
isUnsatisfiable = 0;
}
}
if (isTautology) {
printf("The formula is a tautology.\n");
} else if (isUnsatisfiable) {
printf("The formula is unsatisfiable.\n");
} else {
printf("The formula is satisfiable.\n");
}
}
int main() {
int p[] = {1, 1, 1, 1, 0, 0, 0, 0};
int q[] = {1, 1, 0, 0, 1, 1, 0, 0};
int r[] = {1, 0, 1, 0, 1, 0, 1, 0};
int size = sizeof(p) / sizeof(p[0]);
int choice = 0;
do {
printf("Please choose a logic function:\n");
printf("1. AND\n");
printf("2. OR\n");
printf("3. NOT\n");
printf("4. IMPLICATION\n");
printf("5. EQUIVALENCE\n");
printf("6. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Truth Table for AND:\n");
printTruthTable(logicalAnd, p, q, r, size);
checkFormulaType(logicalAnd, p, q, r, size);
break;
case 2:
printf("Truth Table for OR:\n");
printTruthTable(logicalOr, p, q, r, size);
checkFormulaType(logicalOr, p, q, r, size);
break;
case 3:
printf("Truth Table for NOT:\n");
printf(" P | Result\n");
printf("---+-------\n");
for (int i = 0; i < size; i++) {
printf(" %d | %d\n", p[i], logicalNot(p[i]));
}
printf("The formula is satisfiable.\n");
break;
case 4:
printf("Truth Table for IMPLICATION:\n");
printTruthTable(logicalImplication, p, q, r, size);
checkFormulaType(logicalImplication, p, q, r, size);
break;
case 5:
printf("Truth Table for EQUIVALENCE:\n");
printTruthTable(logicalEquivalence, p, q, r, size);
checkFormulaType(logicalEquivalence, p, q, r, size);
break;
case 6:
printf("Exit.\n");
break;
default:
printf("Invalid choice. Please try again.\n");
break;
}
printf("\n");
} while (choice != 6);
return 0;
}
代码功能:
- 定义逻辑联结词函数: 代码中定义了五个常用逻辑联结词的函数:
logicalAnd(与)、logicalOr(或)、logicalNot(非)、logicalImplication(蕴含)、logicalEquivalence(等价)。 - 输出真值表:
printTruthTable函数根据用户选择的逻辑联结词和输入的命题变元值(p, q, r),输出对应的真值表。 - 判断命题公式类型:
checkFormulaType函数根据逻辑联结词函数和真值表结果,判断命题公式的类型:永真式、不可满足式、可满足式。 - 用户交互:
main函数提供用户交互界面,让用户选择逻辑联结词,并根据选择输出真值表和判断命题公式类型。
代码改进建议:
- 增加输入命题公式的功能: 可以增加用户输入命题公式的功能,而不是直接使用预定义的命题变元值。
- 实现更复杂的逻辑运算: 可以扩展代码,实现其他逻辑联结词(如异或、条件否定等),以及更复杂的命题逻辑运算。
- 错误处理: 可以增加对用户输入的错误处理,例如防止输入非法的数字。
使用示例:
- 运行程序。
- 选择逻辑联结词,例如选择“1. AND”。
- 程序会输出 “AND” 运算的真值表。
- 程序会判断该命题公式的类型,例如判断为“The formula is satisfiable.”。
- 可以继续选择其他逻辑联结词,或选择“6. Exit”退出程序。
总结:
这段代码提供了一个简单的命题逻辑真值表生成器,帮助用户理解和学习命题逻辑的基本概念。通过改进和扩展代码,可以实现更强大的功能,例如处理更复杂的逻辑公式和进行逻辑推演。
注意: 代码中使用 scanf 函数进行用户输入,可能存在安全风险。建议使用更安全的输入函数,例如 fgets 函数。
原文地址: http://www.cveoy.top/t/topic/gPI 著作权归作者所有。请勿转载和采集!