#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),最后输出真值表和命题公式的类型。

C语言实现命题逻辑公式真值表计算与类型判断

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

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