#include #include #include #define LOGIX 3 #define FALSCH 0 #define UNDEF 1 #define WAHR 2 char *names[3] = { "FALSCH", "UNDEF", "WAHR" }; typedef struct { int x, y; int values[LOGIX]; } table; static table und_t[3*3] = { { UNDEF, UNDEF, { UNDEF, UNDEF, UNDEF }}, { UNDEF, FALSCH, { UNDEF, UNDEF, FALSCH }}, { UNDEF, WAHR, { UNDEF, UNDEF, UNDEF }}, { FALSCH, UNDEF, { UNDEF, FALSCH, FALSCH }}, { FALSCH, FALSCH, { FALSCH, FALSCH, FALSCH }}, { FALSCH, WAHR, { FALSCH, FALSCH, FALSCH }}, { WAHR, UNDEF, { UNDEF, UNDEF, UNDEF }}, { WAHR, FALSCH, { FALSCH, FALSCH, FALSCH }}, { WAHR, WAHR, { WAHR, WAHR, WAHR }} }; static table oder_t[3*3] = { { UNDEF, UNDEF, { UNDEF, UNDEF, UNDEF }}, { UNDEF, FALSCH, { UNDEF, UNDEF, UNDEF }}, { UNDEF, WAHR, { UNDEF, UNDEF, WAHR }}, { FALSCH, UNDEF, { UNDEF, UNDEF, UNDEF }}, { FALSCH, FALSCH, { FALSCH, FALSCH, FALSCH }}, { FALSCH, WAHR, { WAHR, WAHR, WAHR }}, { WAHR, UNDEF, { UNDEF, WAHR, WAHR }}, { WAHR, FALSCH, { WAHR, WAHR, WAHR }}, { WAHR, WAHR, { WAHR, WAHR, WAHR }} }; static table imp_t[3*3] = { { UNDEF, UNDEF, { UNDEF, UNDEF, UNDEF }}, { UNDEF, FALSCH, { UNDEF, UNDEF, UNDEF }}, { UNDEF, WAHR, { UNDEF, UNDEF, WAHR }}, { FALSCH, UNDEF, { UNDEF, WAHR, WAHR }}, { FALSCH, FALSCH, { WAHR, WAHR, WAHR }}, { FALSCH, WAHR, { WAHR, WAHR, WAHR }}, { WAHR, UNDEF, { UNDEF, UNDEF, UNDEF }}, { WAHR, FALSCH, { FALSCH, FALSCH, FALSCH }}, { WAHR, WAHR, { WAHR, WAHR, WAHR }} }; static table not_t[3*3] = { { UNDEF, UNDEF, { UNDEF, UNDEF, UNDEF }}, { UNDEF, FALSCH, { UNDEF, UNDEF, UNDEF }}, { UNDEF, WAHR, { UNDEF, UNDEF, UNDEF }}, { FALSCH, UNDEF, { WAHR, WAHR, WAHR }}, { FALSCH, FALSCH, { WAHR, WAHR, WAHR }}, { FALSCH, WAHR, { WAHR, WAHR, WAHR }}, { WAHR, UNDEF, { FALSCH, FALSCH, FALSCH }}, { WAHR, FALSCH, { FALSCH, FALSCH, FALSCH }}, { WAHR, WAHR, { FALSCH, FALSCH, FALSCH }} }; int calc (table *tptr, int x, int y, int logix) { int i; for (i=0; i<3*3; i++) if (tptr->x == x && tptr->y == y) return (tptr->values)[logix]; else tptr++; printf ("Error! Value not defined for %d %d\n", x, y); return UNDEF; } #define ERROR(t) {printf("Error at %s\n",t);while(*t)t++;return UNDEF;} int eval (char *string, char **rpr, int x, int y, int z, int logix) { int left, right, op, res, nflag=0; char *ptr; while (*string == ' ') string++; if (*string == 'n') { nflag = 1; while (isalpha(*string)) string++; while (*string == ' ') string++; } else nflag = 0; if (*string == '(') { left = eval (string+1, &ptr, x, y, z, logix); string = ptr; } else { if (*string == 'x') left = x; else if (*string == 'y') left = y; else if (*string == 'z') left = z; else if (*string == 't') left = WAHR; else if (*string == 'w') left = WAHR; else if (*string == 'f') left = FALSCH; else ERROR(string); while (isalpha (*string)) string++; } while (*string == ' ') string++; if (nflag) { left = calc (not_t, left, left, logix); nflag = 0; } if (*string == ')') { string++; while (*string == ' ') string++; *rpr = string; return left; } else if (*string == '\0') { *rpr = string; return left; } op = *string++; while (isalpha(*string)) string++; while (*string == ' ') string++; if (*string == 'n') { nflag = 1; while (isalpha(*string)) string++; while (*string == ' ') string++; } else nflag = 0; if (*string == '(') { right = eval (string+1, &ptr, x, y, z, logix); string = ptr; } else { if (*string == 'x') right = x; else if (*string == 'y') right = y; else if (*string == 'z') right = z; else if (*string == 't') right = WAHR; else if (*string == 'w') right = WAHR; else if (*string == 'f') right = FALSCH; else ERROR(string); while (isalpha (*string)) string++; } while (*string == ' ') string++; if (nflag) { right = calc (not_t, right, right, logix); nflag = 0; } switch (op) { case 'u': res = calc (und_t, left, right, logix); break; case 'o': res = calc (oder_t, left, right, logix); break; case '>': res = calc (imp_t, left, right, logix); break; default: printf ("ERROR: Unknown operator %c\n", op); res=UNDEF; break; } if (*string == ')') { string++; while (*string == ' ') string++; } *rpr = string; return res; } void checkx (char *form1, char *form2) { int left, right, vals[LOGIX], x, i; char *dummy; printf ("\tL: %s\n\tR: %s\n", form1, form2); for (i=0; i