Ejemplo n.º 1
0
    def exportation(sen):
        if type(sen) is not Sentence or sen.get_negations() != 0:
            return sen

        if sen.oper is not '$':
            return sen

        sen = copy.deepcopy(sen)

        if type(
                sen.right_sen
        ) is Sentence and sen.right_sen.oper is '$' and sen.right_sen.get_negations(
        ) == 0:

            new_sen = Sentence(
                Sentence(sen.left_sen, sen.right_sen.left_sen, '&'),
                sen.right_sen.right_sen, '$', sen.get_negations(),
                sen.get_steps())
            new_sen.add_step('EXPOR')
        elif type(
                sen.left_sen
        ) is Sentence and sen.left_sen.oper is '&' and sen.left_sen.get_negations(
        ) == 0:
            new_sen = Sentence(
                sen.left_sen.left_sen,
                Sentence(sen.left_sen.right_sen, sen.right_sen, '$'), '$',
                sen.get_negations(), sen.get_steps())
            new_sen.add_step('EXPOR')

        return sen
Ejemplo n.º 2
0
def recurseRunAll(sen, max_steps):
    if sen.get_step_count() > max_steps:
        return [sen]

    if type(sen) is Atom:
        return_val = runAll(sen)
        return return_val

    sentences = [sen]
    sen = copy.deepcopy(sen)

    left_sens = recurseRunAll(sen.left_sen, max_steps)
    right_sens = recurseRunAll(sen.right_sen, max_steps)

    for left_sen in left_sens:
        for right_sen in right_sens:
            new_sen = Sentence(left_sen, right_sen,
                               sen.oper, sen.get_negations(), sen.get_steps())

            if new_sen not in sentences and new_sen.get_step_count() <= max_steps:
                sentences.append(new_sen)

            new_sens = runAll(new_sen)

            for sentence in new_sens:
                if sentence.get_step_count() <= max_steps:
                    sentences.append(sentence)

    return sentences
Ejemplo n.º 3
0
    def association(sen):
        if type(sen) is not Sentence:
            return sen

        if sen.oper is '&' or sen.oper is '|':
            if type(sen.left_sen
                    ) is Sentence and sen.left_sen.oper is sen.oper:
                sen = copy.deepcopy(sen)
                new_sen = Sentence(
                    sen.left_sen.left_sen,
                    Sentence(sen.left_sen.right_sen, sen.right_sen, sen.oper),
                    sen.oper, sen.get_negations(), sen.get_steps())
                new_sen.add_step('ASSOC')
                return new_sen
            elif type(sen.right_sen
                      ) is Sentence and sen.right_sen.oper is sen.oper:
                sen = copy.deepcopy(sen)
                new_sen = Sentence(
                    Sentence(sen.left_sen, sen.right_sen.left_sen, sen.oper),
                    sen.right_sen.right_sen, sen.oper, sen.get_negations(),
                    sen.get_steps())
                new_sen.add_step('ASSOC')
                return new_sen

        return sen
Ejemplo n.º 4
0
    def commutation(sen):
        if type(sen) is not Sentence:
            return sen

        if sen.oper is '&' or sen.oper is '|':
            sen = copy.deepcopy(sen)

            new_sen = Sentence(sen.right_sen, sen.left_sen, sen.oper,
                               sen.get_negations(), sen.get_steps())
            new_sen.add_step('COMMU')
            return new_sen

        return sen
Ejemplo n.º 5
0
    def contrapostion(sen):
        if type(sen) is not Sentence or sen.get_negations() != 0:
            return sen

        if sen.oper is not '$':
            return sen

        left_new = copy.deepcopy(sen.right_sen)
        left_new.negate()

        right_new = copy.deepcopy(sen.left_sen)
        right_new.negate()

        new_sen = Sentence(left_new, right_new, '$', sen.get_negations(),
                           sen.get_steps())
        new_sen.add_step('CONTR')
        return new_sen
Ejemplo n.º 6
0
    def idempotence(sen):
        if type(sen) is Atom:
            left_new = copy.deepcopy(sen)
            right_new = copy.deepcopy(sen)
            left_new.negate()

            new_sen = Sentence(left_new, right_new, '$', sen.get_negations(),
                               sen.get_steps())

            new_sen.add_step('IDEMP')

            return new_sen
        elif sen.oper is '$' and sen.get_negations() == 0:
            if sen.left_sen.trueVal() == sen.right_sen.trueVal() \
                    and sen.left_sen.get_negations() % 2 != sen.right_sen.get_negations() % 2:
                sen = copy.deepcopy(sen.left_sen)
                sen.negate()
                sen.add_step('IDEMP')
                return sen

        return sen
Ejemplo n.º 7
0
    def _createSentences(self, input_list):
        if type(input_list) is not list:
            return Atom(input_list)

        negations = 0
        i = 0

        while input_list[i] == '~':
            negations += 1
            i += 1

        left_sen = self._createSentences(input_list[i])
        if left_sen is None:
            return None

        i += 1

        while negations > 0:
            left_sen.negate()
            negations -= 1

        # If given a negated atom
        if i == len(input_list):
            return left_sen

        oper = input_list[i]
        if oper not in LogicSymbols.OP_CONVERT:
            self.forget_all()
            self.add_text('Unrecognized operator: ' + oper, 0)
            return None
        i += 1

        while input_list[i] == '~':
            negations += 1
            i += 1

        right_sen = self._createSentences(input_list[i])
        if right_sen is None:
            return None

        while negations > 0:
            right_sen.negate()
            negations -= 1

        return Sentence(left_sen, right_sen, oper)
Ejemplo n.º 8
0
    def implication(sen):
        if type(sen) is not Sentence or sen.get_negations() != 0:
            return sen

        if sen.oper is '$':
            if sen.get_negations() == 0:
                left_new = copy.deepcopy(sen.left_sen)
                left_new.negate()

                new_sen = Sentence(left_new, sen.right_sen, '|',
                                   sen.get_negations(), sen.get_steps())
                new_sen.add_step('IMPLI')
                return new_sen
            else:
                right_new = copy.deepcopy(sen.right_sen)
                right_new.negate()

                new_sen = Sentence(sen.left_sen, right_new, '&',
                                   sen.get_negations(), sen.get_steps())
                new_sen.add_step('IMPLI')
                return new_sen
        elif sen.oper is '|':
            if sen.get_negations() == 0:
                left_new = copy.deepcopy(sen.left_sen)
                left_new.negate()

                new_sen = Sentence(left_new, sen.right_sen, '$',
                                   sen.get_negations(), sen.get_steps())
                new_sen.add_step('IMPLI')
                return new_sen
            else:
                return sen
        elif sen.oper is '&':
            if sen.get_negations() == 0:
                right_new = copy.deepcopy(sen.right_sen)
                right_new.negate()

                new_sen = Sentence(sen.left_sen, right_new, '$', 1,
                                   sen.get_steps())
                new_sen.add_step('IMPLI')
                return new_sen
            else:
                return sen
Ejemplo n.º 9
0
    def distribution(sen):
        if type(sen) is not Sentence:
            return sen

        sen = copy.deepcopy(sen)

        if sen.oper is '&':
            if type(sen.left_sen) is Sentence and sen.left_sen.oper is '|':
                new_sen = Sentence(
                    Sentence(sen.right_sen, sen.left_sen.left_sen, '&'),
                    Sentence(sen.right_sen, sen.left_sen.right_sen, '&'), '|',
                    sen.get_negations(), sen.get_steps())
                new_sen.add_step('DISTR')
                return new_sen
            elif type(sen.right_sen) is Sentence and sen.right_sen.oper is '|':
                new_sen = Sentence(
                    Sentence(sen.left_sen, sen.right_sen.left_sen, '&'),
                    Sentence(sen.left_sen, sen.right_sen.right_sen, '&'), '|',
                    sen.get_negations(), sen.get_steps())
                new_sen.add_step('DISTR')
                return new_sen
        elif sen.oper is '|':
            if type(sen.left_sen) is Sentence and sen.left_sen.oper is '&':
                new_sen = Sentence(
                    Sentence(sen.right_sen, sen.left_sen.left_sen, '|'),
                    Sentence(sen.right_sen, sen.left_sen.right_sen, '|'), '&',
                    sen.get_negations(), sen.get_steps())
                new_sen.add_step('DISTR')
                return new_sen
            elif type(sen.right_sen) is Sentence and sen.right_sen.oper is '&':
                new_sen = Sentence(
                    Sentence(sen.left_sen, sen.right_sen.left_sen, '&'),
                    Sentence(sen.left_sen, sen.right_sen.right_sen, '|'), '&',
                    sen.get_negations(), sen.get_steps())
                new_sen.add_step('DISTR')
                return new_sen

        return sen
Ejemplo n.º 10
0
    def reduction(sen):
        if type(sen) is not Sentence or sen.get_negations() != 0:
            return sen

        if sen.oper is '&':
            if type(sen.left_sen) is Sentence \
                    and sen.left_sen.oper is '$' and sen.left_sen.get_negations() == 0:

                if sen.right_sen == sen.left_sen.left_sen:

                    sen = copy.deepcopy(sen)

                    new_sen = Sentence(sen.right_sen,
                                       sen.left_sen.right_sen, '&',
                                       sen.get_negations(), sen.get_steps())
                    new_sen.add_step('REDUC')
                    return new_sen

                elif sen.right_sen.trueVal() == sen.left_sen.right_sen.trueVal() \
                        and sen.right_sen.get_negations() % 2 != sen.left_sen.right_sen.get_negations() % 2:
                    sen = copy.deepcopy(sen)

                    sen.left_sen.left_sen.negate()

                    new_sen = Sentence(sen.right_sen,
                                       sen.left_sen.left_sen, '&',
                                       sen.get_negations(), sen.get_steps())
                    new_sen.add_step('REDUC')
                    return new_sen

            elif type(sen.right_sen) is Sentence \
                    and sen.right_sen.oper is '$' and sen.right_sen.get_negations() == 0:

                if sen.left_sen == sen.right_sen.left_sen:

                    sen = copy.deepcopy(sen)

                    new_sen = Sentence(sen.left_sen,
                                       sen.right_sen.right_sen, '&',
                                       sen.get_negations(), sen.get_steps())
                    new_sen.add_step('REDUC')
                    return new_sen

                elif sen.left_sen.trueVal() == sen.right_sen.right_sen.trueVal() \
                        and sen.left_sen.get_negations() % 2 != sen.right_sen.right_sen.get_negations() % 2:

                    sen = copy.deepcopy(sen)

                    sen.right_sen.left_sen.negate()
                    sen.right_sen.left_sen.clean()

                    new_sen = Sentence(sen.left_sen,
                                       sen.right_sen.left_sen, '&',
                                       sen.get_negations(), sen.get_steps())
                    new_sen.add_step('REDUC')
                    return new_sen

        return sen
Ejemplo n.º 11
0
    def distribution(sen):
        if type(sen) is not Sentence or sen.get_negations() != 0:
            return sen

        sen = copy.deepcopy(sen)
        if sen.oper is '$':
            if type(sen.right_sen) is Sentence and sen.right_sen.get_negations(
            ) == 0:
                if sen.right_sen.oper is '&':
                    left_new = Sentence(sen.left_sen, sen.right_sen.left_sen,
                                        '$')
                    right_new = Sentence(sen.left_sen, sen.right_sen.right_sen,
                                         '$')

                    new_sen = Sentence(left_new, right_new, '&',
                                       sen.get_negations(), sen.get_steps())
                    new_sen.add_step('DISTR')
                    return new_sen

                elif sen.right_sen.oper is '|':
                    left_new = Sentence(sen.left_sen, sen.right_sen.left_sen,
                                        '$')

                    right_new = Sentence(sen.left_sen, sen.right_sen.right_sen,
                                         '$')

                    new_sen = Sentence(left_new, right_new, '|',
                                       sen.get_negations(), sen.get_steps())
                    new_sen.add_step('DISTR')
                    return new_sen

            elif type(sen.left_sen) is Sentence and sen.left_sen.get_negations(
            ) == 0:
                if sen.left_sen.oper is '&':
                    left_new = Sentence(sen.left_sen.left_sen, sen.right_sen,
                                        '$')
                    right_new = Sentence(sen.left_sen.right_sen, sen.right_sen,
                                         '$')

                    new_sen = Sentence(left_new, right_new, '|',
                                       sen.get_negations(), sen.get_steps())
                    new_sen.add_step('DISTR')
                    return new_sen

                elif sen.left_sen.oper is '|':
                    left_new = Sentence(sen.left_sen.left_sen, sen.right_sen,
                                        '$')
                    right_new = Sentence(sen.left_sen.right_sen, sen.right_sen,
                                         '$')

                    new_sen = Sentence(left_new, right_new, '&',
                                       sen.get_negations(), sen.get_steps())
                    new_sen.add_step('DISTR')
                    return new_sen

        return sen