int main(int argc, char **argv)
{
  FILE *rule_fp;
  Topform c;
  Term t;
  int i;
  Clause_eval compiled_rule;
  Plist rules = NULL;

  init_standard_ladr();
  init_weight(NULL, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0);
  i = register_attribute("label",  STRING_ATTRIBUTE);  /* ignore these */
  i = register_attribute("answer", TERM_ATTRIBUTE);  /* ignore these */

  rule_fp = fopen(argv[1], "r");
  if (rule_fp == NULL)
    fatal_error("test_clause_eval, rule file cannot be opened for reading");

  t = read_term(rule_fp, stderr);  /* get first rule */

  while (t != NULL) {
    compiled_rule = compile_clause_eval_rule(t);
    rules = plist_append(rules, compiled_rule);
    fwrite_term_nl(stdout, t);
    zap_term(t);
    t = read_term(rule_fp, stderr);
  }
  fclose(rule_fp);

  /* Evaluate each clause on stdin. */

  c = read_clause(stdin, stderr);

  while (c != NULL && !end_of_list_clause(c)) {
    Plist p;
    c->weight = clause_weight(c->literals);
    for (p = rules; p; p = p->next) {
      Clause_eval rule = p->v;
      BOOL result = eval_clause_in_rule(c, rule);
      printf("%d  (wt=%.3f) : ", result, c->weight);
      fwrite_clause(stdout, c, CL_FORM_BARE);
    }
    printf("\n");
    
    zap_topform(c);
    c = read_clause(stdin, stderr);
  }
  
  exit(0);
}  /* main */
/* PUBLIC */
Topform clause_reader(BOOL fast)
{
  if (fast)
    return fast_read_clause(stdin, stderr);
  else
    return read_clause(stdin, stderr);
}  /* clause_reader */
/* PUBLIC */
Clist read_clause_clist(FILE *fin, FILE *fout, char *name, BOOL assign_id)
{
  Clist lst = clist_init(name);
  Topform c;

  c = read_clause(fin, fout);
  while (c != NULL && !end_of_list_clause(c)) {
    if (assign_id)
      assign_clause_id(c);
    c->justification = input_just();
    clist_append(c, lst);
    c = read_clause(fin, fout);
  }
  if (c != NULL)
    zap_topform(c);  /* end_of_list_clause */
  return lst;
}  /* read_clause_clist */
Example #4
0
bool parse_dimacs_core(Buffer & in, std::ostream& err, sat::solver & solver) {
    sat::literal_vector lits;
    try {
        while (true) {
            skip_whitespace(in);
            if (*in == EOF) {
                break;
            }
            else if (*in == 'c' || *in == 'p') {
                skip_line(in);
            }
            else {
                read_clause(in, err, solver, lits);
                solver.mk_clause(lits.size(), lits.c_ptr());
            }
        }
    }
    catch (lex_error) {
        return false;
    }
    return true;
}
Example #5
0
	virtual bool code (PrologElement * parameters, PrologResolution * resolution) {
		if (parameters -> isEarth ()) {
			delete this;
			return true;
		}
		if (! parameters -> isPair ()) return false;
		PrologElement * a = parameters -> getLeft ();
		if (! a -> isAtom ()) return false;
		parameters = parameters -> getRight ();
		PrologAtom * control_atom = a -> getAtom ();
		AREA question;
		if (control_atom == sql_atom) {
			if (! parameters -> isPair ()) return false;
			PrologElement * q = parameters -> getLeft ();
			if (! q -> isText ()) return false;
			parameters = parameters -> getRight ();
			if (mysql_query (connection, q -> getText ()) != 0) return false;
			MYSQL_RES * result = mysql_use_result (connection);
			if (result == NULL) return true;
			MYSQL_ROW row;
			int num_fields = mysql_num_fields (result);
			parameters -> setEarth ();
			while ((row = mysql_fetch_row (result)) != 0) {
				parameters -> setPair ();
				PrologElement * head = parameters -> getLeft ();
				for (int ind = 0; ind < num_fields; ind++) {
					head -> setPair ();
					if (row [ind] != NULL) {
						head -> getLeft () -> setText (row [ind]);
					}
					head = head -> getRight ();
				}
				parameters = parameters -> getRight ();
			}
			mysql_free_result (result);
			return true;
		}
		if (control_atom == dbcl_atom) {
			if (! parameters -> isPair ()) return false;
			PrologElement * e = parameters -> getLeft ();
			parameters = parameters -> getRight ();
			if (e -> isText ()) {
				if (! parameters -> isPair ()) return false;
				PrologElement * atom = parameters -> getLeft ();
				if (! atom -> isText ()) return false;
				parameters = parameters -> getRight ();
				if (parameters -> isVar ()) return read_number_of_clauses (parameters, e -> getText (), atom -> getText ());
				if (! parameters -> isPair ()) return false;
				PrologElement * ordering = parameters -> getLeft ();
				if (ordering -> isVar ()) return read_number_of_clauses (ordering, e -> getText (), atom -> getText ());
				if (! ordering -> isInteger ()) return false;
				parameters = parameters -> getRight ();
				if (parameters -> isEarth ()) return read_number_of_clauses (ordering, e -> getText (), atom -> getText ());
				return read_clause (parameters, e -> getText (), atom -> getText (), ordering -> getInteger ());
			}
			if (e -> isAtom ()) {
				PrologDirectory * dir = find_atoms_module (e -> getAtom ());
				if (dir == NULL) return false;
				if (parameters -> isVar ()) return read_number_of_clauses (parameters, dir -> name (), e -> getAtom () -> name ());
				if (! parameters -> isPair ()) return false;
				PrologElement * ordering = parameters -> getLeft ();
				if (ordering -> isVar ()) return read_number_of_clauses (ordering, dir -> name (), e -> getAtom () -> name ());
				if (! ordering -> isInteger ()) return false;
				parameters = parameters -> getRight ();
				if (parameters -> isEarth ()) return read_number_of_clauses (ordering, dir -> name (), e -> getAtom () -> name ());
				return read_clause (parameters, dir -> name (), e -> getAtom () -> name (), ordering -> getInteger ());
			}
			return false;
		}
		if (control_atom == adbcl_atom || control_atom == adbcl0_atom) {
			if (! parameters -> isPair ()) return false;
			parameters = parameters -> getLeft ();
			AREA drop;
			if (fast) root -> getValue (parameters, drop, 0);
			if (! parameters -> isPair ()) return false;
			PrologElement * head = parameters -> getLeft ();
			if (! head -> isPair ()) return false;
			PrologElement * atom = head -> getLeft ();
			if (! atom -> isAtom ()) return false;
			MYSQL_RES * result;
			MYSQL_ROW row;
			PrologDirectory * dir = find_atoms_module (atom -> getAtom ());
			// get the module_id and atom_id
			int module_id = find_or_create_module (question, dir -> name ());
			int atom_id = find_or_create_atom (question, atom -> getAtom ());
			// now get the clause ordering
			int ordering = 0;
			if (control_atom == adbcl_atom) {
				if (fast) sprintf (question, "select max(ordering) + 1 from text_clauses where module_id = %i and atom_id = %i", module_id, atom_id);
				else sprintf (question, "select max(ordering) + 1 from clauses where module_id = %i and atom_id = %i", module_id, atom_id);
				if (mysql_query (connection, question) != 0) return false;
				result = mysql_use_result (connection);
				if (result == NULL) return false;
				if (mysql_num_fields (result) < 1) FAIL
				if ((row = mysql_fetch_row (result)) == 0) FAIL
				if (row [0] != NULL) ordering = atoi (row [0]);
				mysql_free_result (result);
			} else {
				if (fast) sprintf (question, "update text_clauses set ordering = ordering + 1 where atom_id = %i", atom_id);
				else sprintf (question, "update clauses set ordering = ordering + 1 where atom_id = %i", atom_id);
				if (mysql_query (connection, question) != 0) return false;
			}
			// insert clause and get clause id
			if (fast) {
				sprintf (question, "insert into text_clauses (module_id, atom_id, ordering, text) values (%i, %i, %i, '%s')", module_id, atom_id, ordering, drop);
				if (mysql_query (connection, question) != 0) {printf ("failed at text clause\n");}
				return true;
			}
			sprintf (question, "insert into clauses (module_id, atom_id, ordering, parameters_id, body_id) values (%i, %i, %i, 0, 0)", module_id, atom_id, ordering);
			if (mysql_query (connection, question) != 0) return false;
			int clause_id = last_insert_id();
			// now insert elements
			int head_id = store_element (question, module_id, atom_id, clause_id, head -> getRight ());
			int body_id = store_element (question, module_id, atom_id, clause_id, parameters -> getRight ());
			sprintf (question, "update clauses set parameters_id = %i, body_id = %i where id = %i", head_id, body_id, clause_id);
			if (mysql_query (connection, question) != 0) return false;
			return true;
		}