コード例 #1
0
ファイル: truth_table.c プロジェクト: RandomOS/truthtable-c
/*
 * 主合取范式 或与表达式 大项合取而成
 */
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);
}
コード例 #2
0
ファイル: pi.c プロジェクト: abfeldman/lydia
/* 
 * 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;
}
コード例 #3
0
ファイル: pi.c プロジェクト: abfeldman/lydia
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;
}