Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.78 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h> /* for all the new-fangled string functions */
  3. #include <stdlib.h> /* malloc, free, rand */
  4.  
  5.  
  6. const int Fsize=50;
  7. int no_edges;
  8. int no_nodes;
  9. int i;
  10. const int cases=10;
  11.  
  12.  
  13. int evalAtomic(char *nm, int edges[no_edges][2], int size, int V[3]);
  14. int flip(int i);
  15. int evalBin(char *nm, int edges[no_edges][2], int size, int V[3]);
  16. int evalExist(char *nm, int edges[no_edges][2], int size, int V[3]);
  17. int evalUni(char *nm, int edges[no_edges][2], int size, int V[3]);
  18. int varToNum(char *nm);
  19.  
  20. int parse(char *g){
  21. /* return 1 if atomic, 2 if neg, 3 if binary, 4 if exists, 5 if for all, ow 0*/
  22. char *temp = g;
  23. switch (*g) {
  24. case 'X':
  25. //Atomic
  26. temp++;
  27. if(!(*temp=='[')) {
  28. return 0;
  29. }
  30. temp++;
  31. if(!(*temp=='x' || *temp=='y' || *temp=='z')) {
  32. return 0;
  33. }
  34. temp++;
  35. if(!(*temp=='x' || *temp=='y' || *temp=='z')) {
  36. return 0;
  37. }
  38. temp++;
  39. if(!(*temp==']')) {
  40. return 0;
  41. }
  42. return 1;
  43. break;
  44. case '-':
  45. //Negated
  46. temp++;
  47. if(*temp != '\n') {
  48. if(parse(temp)!=0) {
  49. return 2;
  50. }
  51. }
  52. break;
  53. case '(':
  54. //Binary connective
  55. temp++;
  56. if(*temp!='\n') {
  57. if(parse(temp)!=0) {
  58. // find the > v or ^
  59. while(*temp!='^' && *temp != '>' && *temp != 'v') {
  60. temp++;
  61. if(*temp == ')' || *temp == '\n') {
  62. return 0;
  63. }
  64. }
  65. //binary connector here
  66. temp++;
  67. if(parse(temp)!=0) {
  68. //find the end bracket
  69. while(*temp!=')') {
  70. temp++;
  71. if(*temp=='\n') {
  72. return 0;
  73. }
  74. }
  75. //valid here
  76. return 3;
  77. }
  78. }
  79. }
  80. break;
  81. case 'E':
  82. // Existential
  83. temp++;
  84. if(*temp != '\n') {
  85. if(*temp == 'x' || *temp == 'y' || *temp == 'z') {
  86. temp++;
  87. if(*temp != '\n') {
  88. if(parse(temp)!=0) {
  89. return 4;
  90. }
  91. }
  92. }
  93. }
  94. break;
  95. case 'A':
  96. //Universal
  97. temp++;
  98. if(*temp!='\n') {
  99. if((*temp=='x' || *temp=='y' || *temp=='z')) {
  100. temp++;
  101. if(parse(temp)!=0) {
  102. return 5;
  103. }
  104. }
  105. }
  106. break;
  107. default:
  108. return 0;
  109. }
  110. return 0;
  111. }
  112.  
  113. int eval(char *nm, int edges[no_edges][2], int size, int V[3]){
  114. /* returns 1 if formla nm evaluates to true in graph with 'size' nodes, no_edges edges, edges stored in 'edges', variable assignment V. Otherwise returns 0.*/
  115. switch(parse(nm)) {
  116. case 1:
  117. //Atomic
  118. nm +=2;
  119. return evalAtomic(nm, edges, size, V);
  120. case 2:
  121. //Negated
  122. nm++;
  123. return flip( eval(nm, edges, size, V));
  124. case 3:
  125. //Binary Connective
  126. nm++;
  127. return evalBin(nm, edges, size, V);
  128. case 4:
  129. //Existential
  130. nm++;
  131. return evalExist(nm, edges, size, V);
  132. case 5:
  133. //Universal
  134. nm++;
  135. return evalUni(nm, edges, size, V);
  136. }
  137. return 0;
  138. }
  139.  
  140. int evalAtomic(char *nm, int edges[no_edges][2], int size, int V[3] ){
  141. int firstNode = -1;
  142. int secondNode = -1;
  143.  
  144. firstNode = varToNum(nm);
  145. secondNode = varToNum(++nm);
  146.  
  147. if(firstNode == -1 || secondNode ==-1) {
  148. return 0;
  149. }
  150. for(i = 0; i<no_edges; i++) {
  151. if( edges[i][0]==V[firstNode] ) {
  152. if(edges[i][1]==V[secondNode]) {
  153. return 1;
  154. }
  155. }
  156. }
  157. return 0;
  158. }
  159.  
  160. int flip(int i){
  161. if(i==0) {
  162. return 1;
  163. }else{
  164. return 0;
  165. }
  166. }
  167.  
  168. int evalBin(char *nm, int edges[no_edges][2], int size, int V[3]){
  169. int firstPart;
  170. int secondPart;
  171. char binCon;
  172.  
  173. firstPart = eval(nm, edges, size, V);
  174.  
  175. while(*nm!='^' && *nm != '>' && *nm != 'v') {
  176. nm++;
  177. }
  178. binCon = *(nm++);
  179.  
  180. secondPart = eval(nm, edges, size, V);
  181. switch(binCon) {
  182. case 'v':
  183. //OR
  184. return (firstPart || secondPart);
  185. case '^':
  186. //AND
  187. return (firstPart && secondPart);
  188. case '>':
  189. //IMPLIES
  190. return ((!firstPart) || secondPart);
  191. }
  192. return 0;
  193. }
  194.  
  195. int evalExist(char *nm, int edges[no_edges][2], int size, int V[3] ){
  196. int boundVar = varToNum(nm);
  197. int i;
  198. nm++;
  199. for(i = 0; i<no_edges; i++) {
  200. V[boundVar] = i;
  201. if(eval( nm, edges, size, V)==1) {
  202. return 1;
  203. }
  204. }
  205. return 0;
  206. }
  207.  
  208. int evalUni(char *nm, int edges[no_edges][2], int size, int V[3] ){
  209. int boundVar = varToNum(nm);
  210. int i;
  211. nm++;
  212. for(i = 0; i<size; i++) {
  213. V[boundVar] = i;
  214. if(eval( nm, edges, size, V)==0) {
  215. return 0;
  216. }
  217. }
  218. return 1;
  219. }
  220.  
  221. int varToNum(char *nm){
  222. if(*nm == 'x') {
  223. return 0;
  224. } else if(*nm == 'y') {
  225. return 1;
  226. } else if(*nm == 'z' ) {
  227. return 2;
  228. }
  229. return -1;
  230. }
  231.  
  232. int main()
  233. {
  234. char *name=malloc(Fsize); /*create space for the formula*/
  235. FILE *fp, *fpout;
  236.  
  237. /* reads from input.txt, writes to output.txt*/
  238. if (( fp=fopen("input.txt","r"))==NULL){printf("Error opening file");exit(1);}
  239. if (( fpout=fopen("output.txt","w"))==NULL){printf("Error opening file");exit(1);}
  240.  
  241. int j;
  242. for(j=0;j<cases;j++)
  243. {
  244. fscanf(fp, "%s %d %d",name,&no_nodes,&no_edges);/*read number of nodes, number of edges*/
  245. int edges[no_edges][2]; /*Store edges in 2D array*/
  246. for(i=0;i<no_edges;i++) fscanf(fp, "%d%d", &edges[i][0], &edges[i][1]);/*read all the edges*/
  247.  
  248. /*Assign variables x, y, z to nodes */
  249. int W[3];
  250. /*Store variable values in array
  251. value of x in V[0]
  252. value of y in V[1]
  253. value of z in V[2] */
  254. for(i=0;i<3;i++) fscanf(fp, "%d", &W[i]);
  255. int p=parse(name);
  256. switch(p)
  257. {case 0:fprintf(fpout,"%s is not a formula. ", name);break;
  258. case 1: fprintf(fpout,"%s is an atomic formula. ",name);break;
  259. case 2: fprintf(fpout,"%s is a negated formula. ",name);break;
  260. case 3: fprintf(fpout,"%s is a binary connective formula. ", name);break;
  261. case 4: fprintf(fpout,"%s is an existential formula. ",name);break;
  262. case 5: fprintf(fpout,"%s is a universal formula. ",name);break;
  263. default: fprintf(fpout,"%s is not a formula. ",name);break;
  264. }
  265.  
  266. /*Now check if formula is true in the graph with given variable assignment. */
  267. if (parse(name)!=0){
  268. if (eval(name, edges, no_nodes, W)==1) fprintf(fpout,"The formula %s is true in G under W\n", name);
  269. else fprintf(fpout,"The formula %s is false in G under W\n", name);
  270. }
  271. }
  272.  
  273.  
  274.  
  275. fclose(fp);
  276. fclose(fpout);
  277. free(name);
  278. return(0);
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement