int wff2obdd(const_serializable input, serializable *output, const int brute_force) { register unsigned int ix; tv_wff_expr e; start_stopwatch("compilation time"); if (input->tag == TAGtv_wff_flat_kb) { tv_wff input_wff = to_tv_wff(to_tv_wff_flat_kb(input)->constraints); *output = to_serializable(new_obdd_flat_kb(to_tv_wff_flat_kb(input)->name, to_kb(new_obdd(rdup_values_set_list(input_wff->domains), rdup_variable_list(input_wff->variables), rdup_variable_list(input_wff->encoded_variables), rdup_constant_list(input_wff->constants), input_wff->encoding, new_obdd_node_list(), -1)))); e = flatten_expr_list(input_wff->e); to_obdd(to_obdd_flat_kb(*output)->constraints)->root = tv_wff_expr_to_obdd(input_wff->variables, e, to_obdd(to_obdd_flat_kb(*output)->constraints)->nodes, brute_force); rfre_tv_wff_expr(e); } else if (input->tag == TAGtv_wff_hierarchy) { node_list nodes = new_node_list(); *output = to_serializable(new_obdd_hierarchy(nodes)); for (ix = 0; ix < to_hierarchy(input)->nodes->sz; ix++) { tv_wff node_input = to_tv_wff(to_hierarchy(input)->nodes->arr[ix]->constraints); obdd node_output = new_obdd(rdup_values_set_list(node_input->domains), rdup_variable_list(node_input->variables), rdup_variable_list(node_input->encoded_variables), rdup_constant_list(node_input->constants), node_input->encoding, new_obdd_node_list(), -1); node result; e = flatten_expr_list(node_input->e); node_output->root = tv_wff_expr_to_obdd(node_input->variables, e, node_output->nodes, brute_force); rfre_tv_wff_expr(e); result = new_node(rdup_lydia_symbol(to_hierarchy(input)->nodes->arr[ix]->type), rdup_edge_list(to_hierarchy(input)->nodes->arr[ix]->edges), to_kb(node_output)); append_node_list(nodes, result); } } else { assert(0); abort(); } stop_stopwatch("compilation time"); return 1; }
ERROR add_node_list(node_list* list, node* node){ TRY(new_node_list(&(list->next), node)); }
int main(int argc, char **argv) { print_state st; tv_wff_hierarchy input = tv_wff_hierarchyNIL; tv_nnf_hierarchy output; unsigned int i, j; int c; extern int optind; while ((c = getopt(argc, argv, "h?v")) != -1) { switch (c) { case 0: break; case '?': case 'h': usage(stdout); return EXIT_SUCCESS; case 'v': version(stdout); return EXIT_SUCCESS; default: fprintf(stderr, "Try `wff2nnf -h' for more information.\n"); return EXIT_FAILURE; } } infile = stdin; outfile = stdout; if (optind < argc) { infilename = strdup(argv[optind++]); } if (optind < argc) { outfilename = strdup(argv[optind++]); } if (infilename != NULL && 0 != strcmp(infilename, "-")) { infile = ckfopen(infilename, "r"); } if (outfilename != NULL) { outfile = ckfopen(outfilename, "w"); } st = set_print(outfile, 1, 75, 8); init_symtbl(); if (!fscan_tv_wff_hierarchy(infile, &input)) { fprintf(stderr, "wff2nnf: %d: %s\n", lineno, errmsg); return EXIT_FAILURE; } output = new_tv_nnf_hierarchy(new_node_list()); for (i = 0; i < input->nodes->sz; i++) { tv_wff node_input = to_tv_wff(input->nodes->arr[i]->constraints); tv_nnf node_output = new_tv_nnf(rdup_values_set_list(node_input->domains), rdup_variable_list(node_input->variables), rdup_variable_list(node_input->encoded_variables), rdup_constant_list(node_input->constants), node_input->encoding, new_tv_nnf_expr_list()); node result; for (j = 0; j < node_input->e->sz; j++) { tv_nnf_expr nnf = convert_nnf(&(node_input->e->arr[j])); append_tv_nnf_expr_list(node_output->e, nnf); } result = new_node(rdup_lydia_symbol(input->nodes->arr[i]->type), rdup_edge_list(input->nodes->arr[i]->edges), to_kb(node_output)); output->nodes = append_node_list(output->nodes, result); } fprint_tv_nnf_hierarchy(st, output); rfre_tv_nnf_hierarchy(output); rfre_tv_wff_hierarchy(input); end_print(st); destroy_symtbl(); return EXIT_SUCCESS; }