示例#1
0
def get_contrapositives(seq):
    """Given multiple antecedents and succedents, return a set of sequents with
    various antecedents or succedents negated such that each result sequent
    corresponds has a succedent set corresponding to exactly one of the
    original antecedents or succedents. For example.

        A, B |- C, D

    yields the set

        B, ~C, ~D |- ~A
        A, ~C, ~D |- ~B
        A, B, ~D |- C
        A, B, ~C |- D

    """
    ante_succ_pairs = []
    for succedent in map(weaken_sequent, seq.succedents):
        try:
            antecedents = try_get_negated(succedent)
        except NotNegatable:
            antecedents = set()
        ante_succ_pairs.append((antecedents, set([succedent])))
    for antecedent in map(weaken_sequent, seq.antecedents):
        try:
            succedents = try_get_negated(antecedent)
        except NotNegatable:
            succedents = set()
        ante_succ_pairs.append((set([antecedent]), succedents))
    result = set()
    for _, succedents in ante_succ_pairs:
        if succedents:
            succedent = iter(succedents).next()
            antecedents_product = []
            for other_antecedents, other_succedents in ante_succ_pairs:
                if other_succedents != succedents:
                    antecedents_product.append(other_antecedents)
            for antecedents in itertools.product(*antecedents_product):
                if succedent in antecedents:
                    continue
                try:
                    antecedents = try_simplify_antecedents(set(antecedents))
                except Inconsistent:
                    continue
                result.add(Sequent(antecedents, succedents))
    return result
示例#2
0
def get_pointed(seq):
    """Return a set of sequents each with a single succedent."""
    result = set()
    if len(seq.succedents) == 1:
        for succedent in seq.succedents:
            if succedent.name != 'OPTIONALLY':
                result.add(seq)
    elif len(seq.succedents) > 1:
        for succedent in seq.succedents:
            remaining = set_without(seq.succedents, succedent)
            try:
                neg_remaining = map(try_get_negated, remaining)
            except NotNegatable:
                continue
            for negated in itertools.product(*neg_remaining):
                try:
                    antecedents = try_simplify_antecedents(
                        set(negated) | seq.antecedents)
                except Inconsistent:
                    continue
                result.add(Sequent(antecedents, set([succedent])))
    else:
        raise ValueError('get_contrapositives never returns empty succedents')
    return result