예제 #1
0
파일: wff2obdd.c 프로젝트: abfeldman/lydia
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;
}
예제 #2
0
ERROR add_node_list(node_list* list, node* node){
    TRY(new_node_list(&(list->next), node));
}
예제 #3
0
파일: wff2nnf.c 프로젝트: abfeldman/lydia
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;
}