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;
}

代码功能:

  1. 定义逻辑联结词函数: 代码中定义了五个常用逻辑联结词的函数:logicalAnd(与)、logicalOr(或)、logicalNot(非)、logicalImplication(蕴含)、logicalEquivalence(等价)。
  2. 输出真值表: printTruthTable 函数根据用户选择的逻辑联结词和输入的命题变元值(p, q, r),输出对应的真值表。
  3. 判断命题公式类型: checkFormulaType 函数根据逻辑联结词函数和真值表结果,判断命题公式的类型:永真式、不可满足式、可满足式。
  4. 用户交互: main 函数提供用户交互界面,让用户选择逻辑联结词,并根据选择输出真值表和判断命题公式类型。

代码改进建议:

  1. 增加输入命题公式的功能: 可以增加用户输入命题公式的功能,而不是直接使用预定义的命题变元值。
  2. 实现更复杂的逻辑运算: 可以扩展代码,实现其他逻辑联结词(如异或、条件否定等),以及更复杂的命题逻辑运算。
  3. 错误处理: 可以增加对用户输入的错误处理,例如防止输入非法的数字。

使用示例:

  1. 运行程序。
  2. 选择逻辑联结词,例如选择“1. AND”。
  3. 程序会输出 “AND” 运算的真值表。
  4. 程序会判断该命题公式的类型,例如判断为“The formula is satisfiable.”。
  5. 可以继续选择其他逻辑联结词,或选择“6. Exit”退出程序。

总结:

这段代码提供了一个简单的命题逻辑真值表生成器,帮助用户理解和学习命题逻辑的基本概念。通过改进和扩展代码,可以实现更强大的功能,例如处理更复杂的逻辑公式和进行逻辑推演。

注意: 代码中使用 scanf 函数进行用户输入,可能存在安全风险。建议使用更安全的输入函数,例如 fgets 函数。

C语言实现命题逻辑真值表生成器 - 逻辑联结词、永真式、不可满足式

原文地址: http://www.cveoy.top/t/topic/gPI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录