用c语言写个离散数学中一阶逻辑的代码
时间: 2024-02-12 17:04:07 浏览: 117
离散数学一阶逻辑
以下是一个简单的用C语言实现一阶逻辑的例子代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 100
typedef struct {
char var; // 变量
int value; // 变量的真值
} Assign;
typedef struct {
char *expr; // 逻辑表达式
Assign *assign; // 变量赋值
int n; // 变量数量
} Formula;
int find_var(Formula *f, char var) {
for (int i = 0; i < f->n; i++) {
if (f->assign[i].var == var) {
return i;
}
}
return -1;
}
int eval(Formula *f) {
char *p = f->expr;
int optr[MAX_LEN], opnd[MAX_LEN];
int top_optr = -1, top_opnd = -1;
while (*p != '\0') {
if (*p >= 'a' && *p <= 'z') {
int i = find_var(f, *p);
if (i >= 0) {
opnd[++top_opnd] = f->assign[i].value;
}
else {
printf("Unknown variable: %c\n", *p);
return -1;
}
p++;
}
else if (*p == '(') {
optr[++top_optr] = *p;
p++;
}
else if (*p == ')') {
while (optr[top_optr] != '(') {
int b = opnd[top_opnd--];
int a = opnd[top_opnd--];
switch (optr[top_optr--]) {
case '&': opnd[++top_opnd] = a && b; break;
case '|': opnd[++top_opnd] = a || b; break;
case '-': opnd[++top_opnd] = !a || b; break;
case '>': opnd[++top_opnd] = !a || b; break;
default: break;
}
}
top_optr--;
p++;
}
else if (*p == '&' || *p == '|' || *p == '-' || *p == '>') {
while (top_optr >= 0 && optr[top_optr] != '(' &&
((*p == '&' || *p == '|') && (optr[top_optr] == '&' || optr[top_optr] == '|' || optr[top_optr] == '-' || optr[top_optr] == '>') ||
((*p == '-' || *p == '>') && (optr[top_optr] == '-' || optr[top_optr] == '>')))) {
int b = opnd[top_opnd--];
int a = opnd[top_opnd--];
switch (optr[top_optr--]) {
case '&': opnd[++top_opnd] = a && b; break;
case '|': opnd[++top_opnd] = a || b; break;
case '-': opnd[++top_opnd] = !a || b; break;
case '>': opnd[++top_opnd] = !a || b; break;
default: break;
}
}
optr[++top_optr] = *p;
p++;
}
else {
p++;
}
}
while (top_optr >= 0) {
int b = opnd[top_opnd--];
int a = opnd[top_opnd--];
switch (optr[top_optr--]) {
case '&': opnd[++top_opnd] = a && b; break;
case '|': opnd[++top_opnd] = a || b; break;
case '-': opnd[++top_opnd] = !a || b; break;
case '>': opnd[++top_opnd] = !a || b; break;
default: break;
}
}
return opnd[0];
}
int main() {
Formula f;
char expr[MAX_LEN];
printf("Enter the logical expression: ");
scanf("%s", expr);
f.expr = strdup(expr);
f.n = 0;
f.assign = (Assign *)malloc(sizeof(Assign) * MAX_LEN);
char *p = expr;
while (*p != '\0') {
if (*p >= 'a' && *p <= 'z') {
if (find_var(&f, *p) < 0) {
f.assign[f.n].var = *p;
printf("Enter the truth value of %c (1 or 0): ", *p);
scanf("%d", &f.assign[f.n].value);
f.n++;
}
p++;
}
else {
p++;
}
}
int result = eval(&f);
if (result >= 0) {
printf("The result is %d\n", result);
}
free(f.expr);
free(f.assign);
return 0;
}
```
这个程序可以读入一个逻辑表达式,并且要求用户输入每个变量的真值,然后计算出整个表达式的真值。它支持逻辑运算符:& (and)、| (or)、- (not)、> (implies)。注意,这个程序只是一个简单的示例,可能存在一些漏洞和限制。
阅读全文