void gen_assert_discr_fun(z3_wrapper *z3, const clone *clone, const pred *pred, int fun_arity) { gen_header(z3); /* the basis of the clone */ struct pred *pred_list; uint64_t num_preds; clone_get_predicates(clone, &pred_list, &num_preds); /* write a definition for all predicates */ Z3_func_decl preds[num_preds]; for(int i = 0; i < num_preds; ++i) { char name[8]; sprintf(name, "p%d", i); preds[i] = gen_pred(z3, name, &pred_list[i]); } Z3_func_decl p = gen_pred(z3, "p", pred); /* declare a discriminating function */ Z3_func_decl f = gen_fun(z3, "f", fun_arity); z3->fun = f; /* write assertions about function preservation */ for(int i = 0; i < num_preds; ++i) { gen_preserve(z3, 0, f, fun_arity, preds[i], pred_list[i].arity); } gen_preserve(z3, 1, f, fun_arity, p, pred->arity); free(pred_list); }
gen_code (struct pred_list *programme, struct put_fnct *put) { sprintf (buf, "/* C program translated from Prolog code */\n"); sput (put, buf); sput (put, "#include \"coroutin.h\"\n"); sput (put, "#include \"expr.h\"\n"); /* sput (put, "#define MAX_NEW_CONS 50\n"); sput (put, "#define UNDEF 0x7FFD\n");*/ sput (put, "#include \"prolog.h\"\n"); for ( ; programme != NULL; programme = programme->next) gen_pred (programme, put); sprintf (buf, "\n/* End of translation */\n"); sput (put, buf); }