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);
}
Пример #2
0
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);
}