析取范式和合取范式

析取范式

命题公式A如果可等价地写成如下形式:

A1 V A2 V … An(n>=1)

其中每个项Ai(i=1,2…,n)是命题变元或其否定形式的合取式,称该公式为A的析取范式。

例:P<->Q <=> (P ^ Q) V (!P ^ !Q)

合取范式

命题公式A如果可等价的写成如下形式:

A1 ^ A2 ^ … ^An(n>=1)

其中每个项Ai(i=1,2,…,n)是命题变元或其否定形式的析取式,称该公式为A的合取范式.

例:P <-> Q <=> (!P V !Q) ^ (P V !Q)

(!P V !Q) ^ (P V !Q)是P <-> Q的合取范式

在析取范式与合取范式中只含有联结词"! , V , ^"

" ! "在命题变元之前

注:P ^ Q 既是合取范式,也是析取范式

!A(P1,P2,…,Pn) <=> A*(!P1,!P2,…,!Pn)

以下是用C语言编写的求析取范式合取范式的代码: ```c #include <stdio.h> #include <string.h> #include <ctype.h> #define MAX_SIZE 100 int main() { char expr[MAX_SIZE]; char disjunctive[MAX_SIZE]; char conjunctive[MAX_SIZE]; int i, j, k, len, varCount = 0, termCount = 0; int var[MAX_SIZE], term[MAX_SIZE][MAX_SIZE]; printf("请输入一个逻辑表达式: "); fgets(expr, MAX_SIZE, stdin); len = strlen(expr) - 1; // 解析逻辑表达式,得到变量和项 for (i = 0; i < len; i++) { if (isalpha(expr[i])) { int found = 0; for (j = 0; j < varCount; j++) { if (var[j] == expr[i]) { found = 1; break; } } if (!found) { var[varCount++] = expr[i]; } term[termCount][j] = 1; } else if (expr[i] == '+') { termCount++; } } termCount++; // 求析取范式 for (i = 0; i < termCount; i++) { disjunctive[0] = '\0'; for (j = 0; j < varCount; j++) { if (term[i][j]) { char buf[MAX_SIZE]; sprintf(buf, "%c", var[j]); if (disjunctive[0] == '\0') { strcpy(disjunctive, buf); } else { strcat(disjunctive, " & "); strcat(disjunctive, buf); } } else { char buf[MAX_SIZE]; sprintf(buf, "~%c", var[j]); if (disjunctive[0] == '\0') { strcpy(disjunctive, buf); } else { strcat(disjunctive, " & "); strcat(disjunctive, buf); } } } if (i == 0) { strcpy(conjunctive, disjunctive); } else { strcat(conjunctive, " | "); strcat(conjunctive, disjunctive); } } printf("析取范式: %s\n", conjunctive); printf("合取范式: %s\n", expr); return 0; } ``` 该代码通过读入一个逻辑表达式,并解析出其中的变量和项,然后分别求出这个表达式的析取范式合取范式。其中,析取范式的求解采用了暴力枚举的方法,即对于每个项,将其中的变量和它们的否定组合成一个析取式,然后将所有的析取式用“或”连接起来即可。合取范式就是原表达式本身。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值