析取范式与合取范式

析取范式与合取范式
定义2.2 命题变项及其否定统称作文字。 仅由有限个文字构成的析取式称为简单析取式。
仅由有限个文字构成的合取式称为简单合取式。
例如,文字:p,┐q,r,q.
简单析取式: p,q,p∨q,p∨┐p∨r,┐p∨q∨┐r.
简单合取式: p,┐r,┐p∧r,┐p∧q∧r,p∧q∧┐r.
定理2.1(1)一个简单析取式是重言式当且仅当它同时含某个命题变项及它的否定。
(2)一个简单合取式是矛盾式当且仅当它同时含某个命题变项及它的否定。
定义2.3(1)由有限个简单合取式构成的析取式称为析取范式。
(2)由有限个简单析取式构成的合取式称为合取范式。
(3)析取范式与合取范式统称为范式。
例如,析取范式:(p┐∧q)∨r, ┐p∨q∨r, p∨┐q∨r.
合取范式:(p∨q∨r)∧(┐q∨r), ┐p∧q∧r, p∧┐q∧r.
定理2.2(1)一个析取范式是矛盾式当且仅当它的每个简单合取式都是矛盾式。
(2)一个合取范式是重言式当且仅当它的每个简单析取式都是重言式。
范式的特点:
(1) 范式中不出现联结词→、←;,求范式时可消去:
A→B↔┐A∨B
A←B↔(┐A∨B)∧(A∨┐B)
(2)范式中不出现如下形式的公式:
┐┐A, ┐(A∧B), ┐(A∨B)
因为:┐┐A↔A
┐(A∧B)↔┐A∨┐B
┐(A∨B)↔┐A∧┐B
(3)在析取范式中不出现如下形式的公式:
A∧(B∨C)
在合取范式中不出现如下形式的公式:
A∨(B∧C)
因为:A∧(B∨C)↔(A∧B)∨(A∧C)
A∨(B∧C)↔(A∨B)∧(A∨C)
定理2.3 (范式存在定理)任一命题公式都存在着与之等值的析取范式与合取范式。
求范式的步骤:
1.消去联结词→、←;
2.利用德·摩根率将否定符号┐直接移到各个命题变元之前;
3.利用分配律。
命题公式的析取范式与合取范式都不是唯一的。
例2.7 求公式(p→q)↔r的析取范式与合取范式。
解: (1)合取范式:
(p→q)↔r=(┐p∨q)↔ r
= ((┐p∨q)→ r)∧(r→(┐p∨q))
=(┐(┐p∨q)∨r)∧(┐r∨(┐p∨q))
= ((p∧┐q)∨r)∧(┐p∨q∨┐r)
= (p∨r)∧(┐q∨r)∧(┐p∨q∨┐r)
(2) 析取范式
(p→q)↔r=((p∧┐q)∨r)∧(┐p∨q∨┐r)
= (p∧┐q∧┐p)∨(p∧┐q∧q)∨(p∧┐q∧┐r)∨(r∧┐p)∨(r∧q)∨(r∧┐r)
=(p∧┐q∧┐r)∨(┐p∧r)∨(q∧r)
下面介绍命题公式的唯一规范化形式的范式:主析取范式与主合取范式。

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用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、付费专栏及课程。

余额充值