int parse(char *g) /* returns 0 for non-formulas, 1 for atoms, 2 for negations, 3 for binary connective fmlas, 4 for existential and 5 for universal formulas.*/ { //0:check for number of brackets int counter = 0; int i; int length = strlen(g); for(i = 0 ; i < length ; i++){ if(g[i] == '('){ counter++; } else if(g[i] == ')'){ counter--; } } // case where it is an atomic formula if(g[0] == 'X'){ if(g[1] == '['){ if(g[2] == 'x' || g[2] == 'y' || g[2] == 'z'){ if(g[3] == 'y' || g[3] == 'z' || g[3] == 'x'){ if(g[4] == ']'){ if(g[5] == '\0'){ return 1; } } } } } } //2:case of negation else if(g[0] == '-'){ if(g[1] != '\0'){ if(parse(g+1)>0){ return 2; } } } //4:case of Existential formula else if(g[0] == 'E'){ if(g[1] == 'x' || g[1] == 'y' || g[1] == 'z'){ if(g[2] != '\0' && parse(g+2)>0){ return 4; } } } //5:case of Universal formula else if(g[0] == 'A'){ if(g[1] == 'x' || g[1] == 'y' || g[1] == 'z'){ if(g[2] != '\0' && parse(g+2)>0){ return 5; } } } //3:case of Binary connective formula else if(g[0] == '('){ // puts("in binary connective"); if(counter == 0){ // puts("counter check passed"); // printf("part one is: %s\n", partone(g)); // printf("part two is: %s\n", parttwo(g)); // printf("part one parse result: %d\n", parse(partone(g))); // printf("part two parse result: %d\n", parse(parttwo(g))); if(parse(partone(g)) > 0 && parse(parttwo(g)) > 0){ // puts("is binary connective"); return 3; } } } //A fail case to catch all the failures return 0; }
int main() { /*Input a string and check if its a formula*/ char *name=malloc(Fsize); printf("Enter a formula:"); scanf("%s", name); int p=parse(name); switch(p) {case 0: printf("Not a formula");break; case 1: printf("An atomic formula");break; case 2: printf("A negated formula");break; case 3: printf("A binary connective formula");break; case 4: printf("An existential formula");break; case 5: printf("A universal formula");break; default: printf("Not a formula");break; } if (p==3) {printf("The first part is %s, the binary connective is %c, the second part is %s", partone(name), bin(name), parttwo(name)); return(1); }
int eval(char *nm, int edges[no_edges][2], int size, int V[3]) /*this method takes a formula, the list of edges of a graph, the number of vertices and a variable assignment. It then evaluates the formula and returns 1 or 0 as appropriate. */ { int i, first, second; char bin = nm[getConnectiveIndex(nm)]; char *before = partone(nm); char *after = parttwo(nm); switch(parse(nm)) { case(1)://Atomic formula first = getVariable(nm[2],V); second = getVariable(nm[3],V); if(is_edge(first,second,edges) == 1){ return 1; } else return 0; break; case(2)://negation formula if(eval(nm+1,edges,size,V) == 0){ return 1; } else return 0; break; case(3)://Binary connective formula switch(bin){ case 'v' :if(eval(before,edges,size,V) == 1 || eval(after,edges,size,V) == 1){ return 1; } else return 0; case '^' :if(eval(before,edges,size,V) == 1 && eval(after,edges,size,V) == 1){ return 1; } else return 0; case '>' :if(eval(before,edges,size,V) == 1){ if(eval(after,edges,size,V) == 1){ // puts("second part passed"); return 1; } else return 0; } else return 1; } break; case(4)://Existential formula for(i = 0 ; i < no_nodes ; i++){ switch(nm[1]){ case 'x': V[0] = i; break; case 'y': V[1] = i; break; case 'z': V[2] = i; break; default: return -1; } if(eval(nm+2,edges,size,V) == 1){ return 1; } } return 0; break; case(5)://Universal formula for(i = 0 ; i < no_nodes ; i++){ switch(nm[1]){ case 'x': V[0] = i; break; case 'y': V[1] = i; break; case 'z': V[2] = i; break; default: return -1; } if(eval(nm+2,edges,size,V) == 0){ return 0; } } return 1; break; default: return -1; } }