/* * 主合取范式 或与表达式 大项合取而成 */ void print_CNF(const int *result, ExpInfo *info) { char *letter; int i, j, count = 0, *a; /* 永真式没有合取范式 */ if (is_tautology(result, info)) return; letter = (char *)calloc(info->cols, sizeof(char)); a = (int *)calloc(info->rows, sizeof(int)); /* letter为存放变元的字符数组 */ for (i = j = 0; i < MAX_LETTERS; i++) { if (info->elem[i]) letter[j++] = i + 'A'; } /* a为存放真值表结果中为0的项 */ for (i = 0; i < info->rows; i++) { if (result[i] == 0) a[count++] = i; } printf("主合取范式\n"); printf("M("); for (i = 0; i < count; i++) { if (i < count - 1) printf("%d, ", a[i]); else printf("%d", a[i]); } printf(")\n"); for (i = 0; i < count; i++) { printf("("); for (j = 0; j < info->cols ; j++) { if (test_bit(a[i], info->cols - j - 1)) printf("┐%c", letter[j]); else printf("%c", letter[j]); if (j < info->cols - 1) printf("∨"); } if (i < count - 1) printf(")∧"); else printf(")\n"); } free(letter); free(a); }
/* * It turned out to be difficult to cut the branch on which you are sitting * (i.e. deleting literal_sets from the list we are looping on). I can't think of * a simple way to implement this. */ tv_nf pi_tison(const_tv_nf cf) { unsigned int i, q, x, y; tv_nf result = rdup_tv_nf(cf); tv_literal_set_list output = get_literal_sets(result); output = remove_subsumed_literal_set_list(output); for (i = 0; i < result->variables->sz; i++) { for (x = 0; x < output->sz; x++) { tv_literal_set cx = rdup_tv_literal_set(output->arr[x]); for (y = x + 1; y < output->sz; y++) { tv_literal_set r = resolve_literal(cx, output->arr[y], i); if (tv_literal_setNIL != r) { if (!is_tautology(r)) { if (is_subsumed_list(output, r)) { rfre_tv_literal_set(r); continue; } for (q = 0; q < output->sz; q++) { if (is_subsumed_literal_set(r, output->arr[q])) { output = delete_tv_literal_set_list(output, q); if (q <= x) { x -= 1; } if (q <= y) { y -= 1; } q -= 1; } } output = append_tv_literal_set_list(output, r); } else { rfre_tv_literal_set(r); } } } rfre_tv_literal_set(cx); } } set_literal_sets(result, output); return result; }
tv_nf pi_brute_force(const_tv_nf cf) { unsigned int x, y; tv_nf copy = rdup_tv_nf(cf); /* We don't want to destroy the input, do we? */ tv_nf result = truncate_copy_nf(cf); tv_literal_set_list input = get_literal_sets(copy); tv_literal_set_list output = get_literal_sets(result); set_literal_sets(copy, (input = remove_subsumed_literal_set_list(input))); for (x = 0; x < input->sz; x++) { tv_literal_set cx = input->arr[x]; if (is_subsumed_list(output, cx)) { continue; } output = remove_subsumed_list(output, cx); for (y = 0; y < output->sz; y++) { tv_literal_set r = resolve(cx, output->arr[y]); if (tv_literal_setNIL != r) { if (!is_tautology(r)) { input = append_tv_literal_set_list(input, r); } else { rfre_tv_literal_set(r); } } } output = append_tv_literal_set_list(output, rdup_tv_literal_set(cx)); } rfre_tv_nf(copy); set_literal_sets(result, output); return result; }