Exemplo n.º 1
0
    def __init__(self, predicate, arguments, *args):
        """

        :param predicate:
        :param arguments:
        :param args:
        :return:
        """
        super(Literal, self).__init__()
        self.predicate = predicate
        self.arguments = tuple(arguments)

        if len(args) == 0:
            from spf.mr.lambda_.logic_language_services import LogicLanguageServices

            type_comparator = LogicLanguageServices.get_type_comparator()
            type_repository = LogicLanguageServices.get_type_repository()
        elif len(args) == 2:
            type_comparator = args[0]
            type_repository = args[1]
        else:
            raise RuntimeError("Wrong number of arguments")

        if not predicate.get_type().is_complex():
            raise LogicalExpressionRuntimeError("Predicate must have a complex type, not %s" % predicate.get_type())

        literal_typing = Literal.compute_literal_typing(
            self.predicate.get_type(), [arg.get_type() for arg in self.arguments], type_comparator, type_repository
        )
        self.type_ = None if literal_typing is None else literal_typing[0]
Exemplo n.º 2
0
    def __init__(self, argument, body, type_repository=None):
        super(Lambda, self).__init__()
        if type_repository is None:
            from spf.mr.lambda_.logic_language_services import LogicLanguageServices
            type_repository = LogicLanguageServices.get_type_repository()

        self.argument = argument
        self.body = body
        self.type_ = type_repository.get_type_create_if_needed(self.body.get_type(), self.argument.get_type())
Exemplo n.º 3
0
    def read(string, type_repository=None):
        if type_repository is None:
            from spf.mr.lambda_.logic_language_services import LogicLanguageServices
            type_repository = LogicLanguageServices.get_type_repository()

        split = string.split(Term.TYPE_SEPARATOR)
        if len(split) != 2:
            raise LogicalExpressionRuntimeError('Constant syntax error: %s' % string)
        type_ = type_repository.get_type(split[1])
        if type_ is None:
            type_ = type_repository.get_type_create_if_needed(split[1])
        if type_ is None:
            raise LogicalExpressionRuntimeError('Unknown type for: %s' % string)
        return LogicalConstant.create(string, type_)
Exemplo n.º 4
0
    def read(cls, string, mapping=None, type_repository=None, type_comparator=None):
        if mapping is None:
            mapping = {}
        if type_repository is None:
            type_repository = LogicLanguageServices.get_type_repository()
        if type_comparator is None:
            type_comparator = LogicLanguageServices.get_type_comparator()

        flat_string = cls.WHITE_SPACE.sub(string, " ")
        try:
            for reader in cls.readers:
                if reader.is_valid(flat_string):
                    return reader.read(flat_string, mapping, type_repository, type_comparator, cls)
            raise AttributeError("Invalid logical expression syntax: %s" % string)
        except Exception, e:
            cls.LOG.error("Logic expression syntax error: %s" % flat_string)
            raise e
Exemplo n.º 5
0
 def verify_arg_type(self, signature_type, arg_type):
     return arg_type.is_extending_or_extended_by(
         LogicLanguageServices.get_type_repository().generalize_type(signature_type))
Exemplo n.º 6
0
 def do_is_factorable(cls, constant):
     return not LogicLanguageServices.is_coordination_predicate(constant) and \
            not LogicLanguageServices.is_array_index_predicate(constant) and \
            not LogicLanguageServices.is_array_sub_predicate(constant) and \
            LogicLanguageServices.get_type_repository().get_index_type() != constant.get_type() and \
            constant not in cls.unfactored_constants
Exemplo n.º 7
0
 def is_valid_name(cls, name):
     from spf.mr.lambda_.logic_language_services import LogicLanguageServices
     split = name.split(':', 2)
     type_repository = LogicLanguageServices.get_type_repository()
     return cls.REGEXP_NAME_PATTERN.match(split[0]) is not None and \
            type_repository.get_type_create_if_needed(split[1]) is not None
Exemplo n.º 8
0
 def get_signature(constants):
     return [LogicLanguageServices.get_type_repository().generalize_type(constant.get_type())
             for constant in constants]