示例#1
0
文件: graph.c 项目: lmy6088/UCL-Work
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;
}
示例#2
0
文件: parser.c 项目: xnbya/comp101p
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);
}
示例#3
0
文件: graph.c 项目: lmy6088/UCL-Work
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;

	}

}