Пример #1
0
  BoolExpr::NNF*
  BoolExpr::NNF::nnf(Region& r, Node* n, bool neg) {
    switch (n->t) {
    case NT_VAR: case NT_RLIN: case NT_MISC:
#ifdef GECODE_HAS_SET_VARS
    case NT_RSET:
#endif
      {
        NNF* x = new (r) NNF;
        x->t = n->t; x->u.a.neg = neg; x->u.a.x = n;
        if (neg) {
          x->p = 0; x->n = 1;
        } else {
          x->p = 1; x->n = 0;
        }
        return x;
      }
    case NT_NOT:
      return nnf(r,n->l,!neg);
    case NT_AND: case NT_OR:
      {
        NodeType t = ((n->t == NT_AND) == neg) ? NT_OR : NT_AND;
        NNF* x = new (r) NNF;
        x->t = t;
        x->u.b.l = nnf(r,n->l,neg);
        x->u.b.r = nnf(r,n->r,neg);
        int p_l, n_l;
        if ((x->u.b.l->t == t) || (x->u.b.l->t == NT_VAR)) {
          p_l=x->u.b.l->p; n_l=x->u.b.l->n;
        } else {
          p_l=1; n_l=0;
        }
        int p_r, n_r;
        if ((x->u.b.r->t == t) || (x->u.b.r->t == NT_VAR)) {
          p_r=x->u.b.r->p; n_r=x->u.b.r->n;
        } else {
          p_r=1; n_r=0;
        }
        x->p = p_l+p_r;
        x->n = n_l+n_r;
        return x;
      }
    case NT_EQV:
      {
        NNF* x = new (r) NNF;
        x->t = NT_EQV;
        x->u.b.l = nnf(r,n->l,neg);
        x->u.b.r = nnf(r,n->r,false);
        x->p = 2; x->n = 0;
        return x;
      }
    default:
      GECODE_NEVER;
    }
    GECODE_NEVER;
    return NULL;
  }
Пример #2
0
int main(int argc,char ** argv){
	formula *current,*old;
	parserResult *result;
	wwb* wwb,* oldWwb;
	wwbList* list;
	wwbListIterator it;
	char *out;
	int verifiable=0,carry=0;
	char *example="((A0*A1*-A2)+(A0*A3*-A1*A2)+(A0*-A0*A3*A2)+(A0*-A3*A2)+(A0*A4*-A5))";//"(A0*(A0>(A1+A3))*((A0*A3)>A1)*(-A1+A2)*(-A1+-A2))";

	if( argc == 1 ){
		printf("Benutzung: %s <formel>\n",argv[0]);
		result=string_to_formula_parser(example);
	}else{
		// testen des ersten Arguments
		result=string_to_formula_parser(argv[1]);
	}
	if( result->error || *(result->rest) != 0 ){
		// es ist keine Formel!
		int pos=result->rest-argv[1];
		printf("Nein, falsches Zeichen an Position %d: %s\n",pos,result->rest);
		free(result);
		return 1;
	}
	// es ist eine Formel
	printf("Ja!\n");

	old=result->formula;

	current=remove_abbreviations(old);
	free(old);
	printf("Ohne Abkürzungen: ");
	print_format(current);
	printf("\n");
	old=current;

	current=nnf(old);
	printf("NNF: ");
	print_format(current);
	printf("\n");
	free_formula(current);

/*	current=dnf(old);
	printf("DNF: ");
	print_format(current);
	printf("\n");
	free_formula(current);

	current=knf(old);
	printf("KNF: ");
	print_format(current);
	printf("\n");
	free_formula(current);*/

	wwb=wwb_from_formula(old);

	list=is_verifiable_bf(old,wwb);
	it=wwb_list_iterator_get(list);

	out=(char *) malloc(sizeof(char)*100);
	wwb_to_row_head_string(wwb,out);
	printf("\n%s\n",out);
	free(out);

	while( wwb_list_iterator_valid(it) ){
		out=(char *) malloc(sizeof(char)*100);
		wwb_to_row_string(wwb_list_iterator_wbb(it),out);
		printf("%s\n",out);
		free(out);
		it=wwb_list_iterator_next(it);
	}

	wwb=new_wwb();

	verifiable=formula_is_verifiable_dpll(old,wwb);
	if( verifiable ){
		printf("Wahr für:\n");
		print_wwb(wwb);
	}else{
		printf("Widerspruch\n");
	}

	oldWwb=wwb;
	wwb=wwb_from_formula(old);
	wwb_copy_to(oldWwb,wwb);

	out=(char *) malloc(sizeof(char)*100);
	wwb_to_row_head_string(wwb,out);
	printf("\n%s\n",out);
	free(out);

	while( !carry ){
		oldWwb=wwb;
		if( formula_evaluate(old,wwb) ){
			out=(char *) malloc(sizeof(char)*100);
			wwb_to_row_string(wwb,out);
			printf("%s\n",out);
			free(out);
		}
		wwb=wwb_successor(oldWwb,&carry);
		free_wwb(oldWwb);
	}
	free_wwb(wwb);

	free(result);

	return 0;
}
Пример #3
0
bool Qualify0(ScopeInfo& nf, const String& type, const String& usings, String& qt)
{ // Qualify single type based on scoping information
	const Vector<String>& nd = nf.GetScopes(usings);
	if(nd.GetCount()) {
		LTIMING("First test");
		qt = nd[0] + type;
		if(nf.base.Find(qt) >= 0)
			return true;
	}
	if(nf.GetScope() >= 0) {
		int q = type.ReverseFind(':');
		if(q > 0) {
			LTIMING("Qualifying qualification");
			ScopeInfo hnf(nf);
			hnf.NoBases();
			String qn;
			String qs = type.Mid(0, q - 1);
			if(IsDigit(*qs)) {
				qt = type;
				return true;
			}
			if(DoQualify(hnf, qs, usings, qn)) {
				String tp = type.Mid(q + 1);
				if(nf.base.Find(qn) >= 0) {
					qt = qn + "::" + tp;
					return true;
				}
				int scopei = nf.base.Find(qn);
				if(scopei >= 0) {
					ScopeInfo nnf(nf.base, scopei);
					const Vector<String>& bs = nnf.GetBases();
					for(int i = 0; i < bs.GetCount(); i++) {
						qt = bs[i] + tp;
						if(nf.base.Find(qt) >= 0)
							return true;
					}
				}
			}
			if(nf.base.Find(qs) >= 0) {
				qt = qs;
				return true;
			}
			qt = type;
			if(nf.base.Find(qt) >= 0) // e.g. std::string
				return true;
			qt = type.Mid(q + 1);
			return true;
		}
		else {
			LTIMING("Bases");
			const Vector<String>& bs = nf.GetBases();
			for(int i = 0; i < bs.GetCount(); i++) {
				qt = bs[i] + type;
				if(nf.base.Find(qt) >= 0)
					return true;
			}
		}
	}
	if(type[0] != ':') {
		LTIMING("Testing scopes");
		for(int i = 1; i < nd.GetCount(); i++) {
			qt = nd[i] + type;
			if(nf.base.Find(qt) >= 0)
				return true;
		}
	}
	int q = type.Find(':');
	if(q < 0)
		return false;
	return Qualify0(nf, type.Mid(q + 1), usings, qt);
}
Пример #4
0
void invariant_sett::strengthen(const exprt &expr)
{
  exprt tmp(expr);
  nnf(tmp);
  strengthen_rec(tmp);
}