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))
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))
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)
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
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()
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()
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)
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")
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")