Пример #1
0
 def string_to_concept(self,text):
     # set up the signature with symbols in graph so
     # we can parse the formula.
     sig = il.sig.copy()
     with sig:
         for c in ilu.used_constants_clauses(self.state):
             if not isinstance(c.sort,il.EnumeratedSort) and not c.is_numeral():
                 il.add_symbol(str(c),c.sort)
         for c in ilu.used_constants_clauses(self.constraints) and not c.is_numeral():
             if not isinstance(c.sort,il.EnumeratedSort):
                 il.add_symbol(str(c),c.sort)
         return concept_from_formula(ilu.to_formula(text))
Пример #2
0
 def string_to_concept(self, text):
     # set up the signature with symbols in graph so
     # we can parse the formula.
     sig = il.sig.copy()
     with sig:
         for c in ilu.used_constants_clauses(self.state):
             if not isinstance(c.sort,
                               il.EnumeratedSort) and not c.is_numeral():
                 il.add_symbol(str(c), c.sort)
         for c in ilu.used_constants_clauses(
                 self.constraints) and not c.is_numeral():
             if not isinstance(c.sort, il.EnumeratedSort):
                 il.add_symbol(str(c), c.sort)
         return concept_from_formula(ilu.to_formula(text))
Пример #3
0
def strip_action(ast, strip_map, strip_binding):
    if isinstance(ast, ia.CallAction):
        name = canon_act(ast.args[0].rep)
        args = [
            strip_action(arg, strip_map, strip_binding)
            for arg in ast.args[0].args
        ]
        strip_params = get_strip_params(name, ast.args[0].args, strip_map,
                                        strip_binding, ast)
        call = ast.args[0].clone(args[len(strip_params):])
        return ast.clone([call] + [
            strip_action(arg, strip_map, strip_binding) for arg in ast.args[1:]
        ])
    if isinstance(ast, ia.AssignAction):
        if ast.args[0].rep.name in ivy_logic.sig.symbols:
            lhs_params = strip_map_lookup(ast.args[0].rep.name, strip_map)
            if len(lhs_params) != num_isolate_params:
                raise iu.IvyError(ast, "assignment may be interfering")
    if (ivy_logic.is_constant(ast)
            or ivy_logic.is_variable(ast)) and ast in strip_binding:
        sname = strip_binding[ast]
        if sname not in ivy_logic.sig.symbols:
            ivy_logic.add_symbol(sname, ast.sort)
            strip_added_symbols.append(ivy_logic.Symbol(sname, ast.sort))
        return ivy_logic.Symbol(sname, ast.sort)
    args = [strip_action(arg, strip_map, strip_binding) for arg in ast.args]
    if ivy_logic.is_app(ast):
        name = ast.rep.name
        strip_params = get_strip_params(name, ast.args, strip_map,
                                        strip_binding, ast)
        if strip_params:
            new_sort = strip_sort(ast.rep.sort, strip_params)
            new_args = args[len(strip_params):]
            new_symbol = ivy_logic.Symbol(name, new_sort)
            return new_symbol(*new_args)
    if isinstance(ast, ivy_ast.Atom):
        name = ast.rep
        strip_params = get_strip_params(name, ast.args, strip_map,
                                        strip_binding, ast)
        if strip_params:
            new_args = args[len(strip_params):]
            return ast.clone(new_args)
    return ast.clone(args)
Пример #4
0
def compile_local(self):
    sig = ivy_logic.sig.copy()
    with sig:
        ls = self.args[0:-1]
        if len(ls) == 1 and isinstance(ls[0], AssignAction):
            v = ls[0]
            lhs = v.args[0]
            rhs = v.args[1]
            # temporarily rename lhs symbol in case it clashes with an existing symbol
            #            tmp_lhs = lhs.prefix('__var_tmp:')
            tmp_lhs = lhs
            code = []
            local_syms = []
            with ExprContext(code, local_syms):
                with alpha_sort_as_default():
                    sym = compile_const(tmp_lhs, sig)
                    ctmp_lhs = tmp_lhs.compile()
                    crhs = rhs.compile()
            with ASTContext(self):
                teq = sort_infer(Equals(ctmp_lhs, crhs))
            clhs, crhs = list(teq.args)
            #            clhs = clhs.drop_prefix('__var_tmp:')
            asgn = v.clone([clhs, crhs])
            ivy_logic.remove_symbol(sym)
            if clhs.rep.name in sig.symbols:
                del sig.symbols[clhs.rep.name]  # shadow the existing symbol
            ivy_logic.add_symbol(clhs.rep.name, clhs.rep.sort)
            body = sortify(self.args[-1])
            lines = body.args if isinstance(body, Sequence) else [body]
            body = Sequence(*([asgn] + lines))
            code.append(LocalAction(clhs.rep, body))
            for c in code:
                c.lineno = self.lineno
            if len(code) == 1:
                return code[0]
            res = LocalAction(*(local_syms + [Sequence(*code)]))
            res.lineno = self.lineno
            return res
        cls = [compile_const(v, sig) for v in ls]
        body = sortify(self.args[-1])
        res = LocalAction(*(cls + [body]))
        res.lineno = self.lineno
        return res
Пример #5
0
    def add_rel_lit(self,dlg,entry):
        with uu.RunContext(self):
#            with ivy_logic.UnsortedContext():
#                lit = to_literal(entry.get())
            sig = ivy_logic.sig.copy()
            with sig:
                for c in used_constants_clauses(self.g.state):
                    if not isinstance(c.sort,ivy_logic.EnumeratedSort):
#                        print "found constant {!r}".format(c)
                        ivy_logic.add_symbol(str(c),c.sort)
                for c in used_constants_clauses(self.g.constraints):
                    if not isinstance(c.sort,ivy_logic.EnumeratedSort):
#                        print "found constant {!r}".format(c)
                        ivy_logic.add_symbol(str(c),c.sort)
                lit = to_literal(entry.get())
#                lit = ivy_logic.sortify(lit)
            dlg.destroy()
#            print "add_rel_lit: {}".format(lit)
            self.g.new_relation(lit)
            if self.update_callback != None:
                self.update_callback()
Пример #6
0
    def add_rel_lit(self, dlg, entry):
        with uu.RunContext(self):
            #            with ivy_logic.UnsortedContext():
            #                lit = to_literal(entry.get())
            sig = ivy_logic.sig.copy()
            with sig:
                for c in used_constants_clauses(self.g.state):
                    if not isinstance(c.sort, ivy_logic.EnumeratedSort):
                        #                        print "found constant {!r}".format(c)
                        ivy_logic.add_symbol(str(c), c.sort)
                for c in used_constants_clauses(self.g.constraints):
                    if not isinstance(c.sort, ivy_logic.EnumeratedSort):
                        #                        print "found constant {!r}".format(c)
                        ivy_logic.add_symbol(str(c), c.sort)
                lit = to_literal(entry.get())
#                lit = ivy_logic.sortify(lit)
            dlg.destroy()
            #            print "add_rel_lit: {}".format(lit)
            self.g.new_relation(lit)
            if self.update_callback != None:
                self.update_callback()
Пример #7
0
def strip_action(ast,strip_map,strip_binding):
    if isinstance(ast,ia.CallAction):
        name = ast.args[0].rep
        args = [strip_action(arg,strip_map,strip_binding) for arg in ast.args[0].args]
        strip_params = get_strip_params(name,ast.args[0].args,strip_map,strip_binding,ast)
        call = ast.args[0].clone(args[len(strip_params):])
        return ast.clone([call]+[strip_action(arg,strip_map,strip_binding) for arg in ast.args[1:]])
    if (ivy_logic.is_constant(ast) or ivy_logic.is_variable(ast)) and ast in strip_binding:
        sname = strip_binding[ast]
        if sname not in ivy_logic.sig.symbols:
            ivy_logic.add_symbol(sname,ast.sort)
        return ivy_logic.Symbol(sname,ast.sort)
    args = [strip_action(arg,strip_map,strip_binding) for arg in ast.args]
    if ivy_logic.is_app(ast):
        name = ast.rep.name
        strip_params = get_strip_params(name,ast.args,strip_map,strip_binding,ast)
        if strip_params:
            new_sort = strip_sort(ast.rep.sort,strip_params)
            new_args = args[len(strip_params):]
            new_symbol = ivy_logic.Symbol(name,new_sort)
            return new_symbol(*new_args)
    return ast.clone(args)
Пример #8
0
 def derived(self,ldf):
     try:
         label = ldf.label
         df = ldf.formula
         lhs = df.args[0]
         sym = ivy_logic.add_symbol(lhs.rep,ivy_logic.TopFunctionSort(len(lhs.args)))
         df  = compile_defn(df)
         ivy_logic.remove_symbol(sym)
         add_symbol(df.args[0].rep.name,df.args[0].rep.sort)
         self.domain.all_relations.append((sym,len(lhs.args)))
         self.domain.relations[sym] = len(lhs.args)
         self.domain.definitions.append(ldf.clone([label,df]))
         self.domain.updates.append(DerivedUpdate(df))
         self.domain.symbol_order.append(sym)
     except ValueError:
         raise IvyError(df,"definition of derived relation must be a cube")
Пример #9
0
 def derived(self, ldf):
     try:
         label = ldf.label
         df = ldf.formula
         lhs = df.args[0]
         sym = ivy_logic.add_symbol(
             lhs.rep, ivy_logic.TopFunctionSort(len(lhs.args)))
         df = compile_defn(df)
         ivy_logic.remove_symbol(sym)
         add_symbol(df.args[0].rep.name, df.args[0].rep.sort)
         self.domain.all_relations.append((sym, len(lhs.args)))
         self.domain.relations[sym] = len(lhs.args)
         self.domain.definitions.append(ldf.clone([label, df]))
         self.domain.updates.append(DerivedUpdate(df))
         self.domain.symbol_order.append(sym)
     except ValueError:
         raise IvyError(df, "definition of derived relation must be a cube")