给定一个命题公式,求其主析取范式,主合取范式代码c语言
时间: 2023-12-07 21:18:10 浏览: 146
实验1-利用真值表法求取主析取范式以及主合取范式的实现1
以下是一个简单的 C 语言代码,用于将命题公式转换为主析取范式和主合取范式:
```c
#include <stdio.h>
#include <string.h>
// 将命题公式转换为主析取范式
void to_dnf(char *formula) {
char temp[100];
int i, j, k, n;
// 将或号、与号和蕴含号转换为它们对应的运算符
n = strlen(formula);
for (i = 0; i < n; i++) {
if (formula[i] == '|') {
formula[i] = '+';
} else if (formula[i] == '&') {
formula[i] = '*';
} else if (formula[i] == '-') {
formula[i] = '>';
formula[i+1] = '=';
}
}
// 将非号取出,并将其作为一种特殊的运算符
n = strlen(formula);
for (i = 0; i < n; i++) {
if (formula[i] == '~') {
temp[j++] = '!';
} else {
temp[j++] = formula[i];
}
}
// 将命题公式转换为主析取范式
n = strlen(temp);
k = 0;
for (i = 0; i < n; i++) {
if (temp[i] == '+') {
printf("(");
for (j = k; j < i; j++) {
printf("%c", temp[j]);
}
printf(")");
k = i + 1;
if (i < n - 1 && temp[i+1] != '!') {
printf("*");
}
}
}
printf("(");
for (j = k; j < n; j++) {
printf("%c", temp[j]);
}
printf(")");
}
// 将命题公式转换为主合取范式
void to_cnf(char *formula) {
char temp[100];
int i, j, k, n;
// 将或号、与号和蕴含号转换为它们对应的运算符
n = strlen(formula);
for (i = 0; i < n; i++) {
if (formula[i] == '|') {
formula[i] = '+';
} else if (formula[i] == '&') {
formula[i] = '*';
} else if (formula[i] == '-') {
formula[i] = '>';
formula[i+1] = '=';
}
}
// 将非号取出,并将其作为一种特殊的运算符
n = strlen(formula);
for (i = 0; i < n; i++) {
if (formula[i] == '~') {
temp[j++] = '!';
} else {
temp[j++] = formula[i];
}
}
// 对公式取反
printf("!(");
n = strlen(temp);
for (i = 0; i < n; i++) {
printf("%c", temp[i]);
}
printf(")");
// 将公式转换为主析取范式
printf(" -> ");
to_dnf(formula);
// 对主析取范式取反
printf(" -> ");
printf("!(");
to_dnf(formula);
printf(")");
}
// 测试代码
int main() {
char formula[100];
printf("请输入命题公式:");
fgets(formula, 100, stdin);
printf("原始命题公式:%s", formula);
printf("主析取范式:");
to_dnf(formula);
printf("\n");
printf("主合取范式:");
to_cnf(formula);
printf("\n");
return 0;
}
```
这个代码使用循环和条件语句将命题公式转换为主析取范式和主合取范式。它将或号、与号和蕴含号转换为它们对应的运算符,将非号取出,并将其作为一种特殊的运算符。主合取范式的实现方法是先将公式取反,再将其转换为主析取范式,最后再对主析取范式取反。
阅读全文