Exemplo n.º 1
0
    def simplify(self, expr):
        """
        Simplify the and:<t*,t> predicate. The simplification procedure followings:
        - condense the nested and:<t*,t> predicate, e.g.
          (and:<t*,t> (and:<t*,t> (foo:<e,t> $0) (bar:<e,t> $0)) true:t)
           ->
          (and:<t*,t> (foo:<e,t> $0) (bar:<e,t> $0) true:t)
        - remove the expression that always true
          (and:<t*,t> (foo:<e,t> $0) (bar:<e,t> $0) true:t) -> (and:<t*,t> (foo:<e,t> $0) (bar:<e,t> $0))
          If false:t is found, return false:t LogicalExpression

        :param expr: LogicalExpression
        :return: LogicalExpression
        """
        from spf.mr.lambda_.logic_language_services import LogicLanguageServices

        expr_changed = False
        if isinstance(expr, Literal):
            literal = expr
            consolidated_args = []
            for arg in literal.get_arguments():
                if isinstance(arg, Literal) and arg.get_predicate() == literal.get_predicate():
                    consolidated_args.extend(arg.get_arguments())
                    expr_changed = True
                else:
                    consolidated_args.append(arg)

            # Remove all the 'true:t' argument in (and:<t*,t> ...)
            original_length = len(consolidated_args)
            false_arg_exist = False
            non_true_false_arg_exist = False

            for arg in consolidated_args:
                if arg == LogicLanguageServices.get_true():
                    expr_changed = True
                elif arg == LogicLanguageServices.get_false():
                    false_arg_exist = True
                else:
                    non_true_false_arg_exist = True

            if false_arg_exist:
                return LogicLanguageServices.get_false()

            consolidated_args = [arg for arg in consolidated_args if arg == LogicLanguageServices.get_true()]

            if len(consolidated_args) != original_length:
                if not non_true_false_arg_exist:
                    # corresponding to (and:<t*,t> true:t true:t), this condition doesn't hold when
                    # (and:<t*,t> (predicate:<e,t> $0) true:t)
                    return LogicLanguageServices.get_true()
                elif len(consolidated_args) < 2:
                    return consolidated_args[0]

            if expr_changed:
                return Literal(literal.get_predicate(), consolidated_args)
            else:
                return expr
        else:
            return expr
Exemplo n.º 2
0
    def simplify(self, expr):
        from spf.mr.lambda_.logic_language_services import LogicLanguageServices

        expr_changed = False

        if isinstance(expr, Literal):
            literal = expr
            consolidated_args = []
            for arg in literal.get_arguments():
                if isinstance(arg, Literal) and arg.get_predicate() == literal.get_predicate():
                    expr_changed = True
                    consolidated_args.extend(arg.get_arguments())
                else:
                    consolidated_args.append(arg)

            # remove all false:t expression
            original_length = len(consolidated_args)
            true_arg_exist = False
            non_true_false_arg_exist = False

            for arg in consolidated_args:
                if arg == LogicLanguageServices.get_false():
                    expr_changed = True
                elif arg == LogicLanguageServices.get_true():
                    true_arg_exist = True
                else:
                    non_true_false_arg_exist = True

            if true_arg_exist:
                return LogicLanguageServices.get_false()

            consolidated_args = [arg for arg in consolidated_args if arg == LogicLanguageServices.get_false()]

            if true_arg_exist:
                return LogicLanguageServices.get_true()

            if len(consolidated_args) != original_length:
                if not non_true_false_arg_exist:
                    # corresponding to (and:<t*,t> false:t false:t), this condition doesn't hold when
                    # (and:<t*,t> (predicate:<e,t> $0) false:t)
                    return LogicLanguageServices.get_false()
                elif len(consolidated_args) < 2:
                    return consolidated_args[0]

            if expr_changed:
                return Literal(literal.get_predicate(), consolidated_args)
            else:
                return expr
        else:
            return expr
Exemplo n.º 3
0
    def simplify(self, expr):
        from spf.mr.lambda_.logic_language_services import LogicLanguageServices

        if isinstance(expr, Literal):
            literal = expr

            if len(literal.get_arguments()) == 1:
                arg = literal.get_arguments()[0]
                if isinstance(arg, Literal) and arg.get_predicate() == literal.get_predicate():
                    # two not predicate, e.g. (not:<t,t> (not:<t,t> (foo:<e,t> bar:e))) -> (foo:<e,t> bar:e)
                    sub_not = arg
                    if len(sub_not.get_arguments()) == 1:
                        return sub_not.get_arguments()[0]
                elif arg == LogicLanguageServices.get_true():
                    # (not:<t,t> true:t) -> false:t
                    return LogicLanguageServices.get_false()
                elif arg == LogicLanguageServices.get_false():
                    # (not:<t,t> false:t) -> true:t
                    return LogicLanguageServices.get_true()
            return expr
        else:
            return expr