def proofll(ifthen, reductors, redsb=True, prot=True): if prot and (not ifthen.supposedToBeValid): print "THIS THEOREM IS NOT SUPPOSED TO BE VALID" ip_pre = ifthen.ifpart ip = [] for p in ip_pre: p = Polynomial(p) if p.is_zero(): continue li = list(p.lead().variables()) if len(li) == 1 and (not (li[0] in list(Polynomial(reductors).lead(). variables()))): assert not Polynomial(reductors).is_zero() lead_index = li[0] if redsb: p = ll_red_nf_redsb(p, reductors) reductors = ll_red_nf_redsb(Polynomial(reductors), BooleSet(p. set())) p_nav = p.navigation() reductors = recursively_insert(p_nav.else_branch(), p_nav.value(), reductors) else: ip.append(p) it = ifthen.thenpart if prot: print "proofing:", ifthen ip = logicaland(ip) for c in it: if prot: print "proofing part:", c c = logicalor([BooleConstant(1) + ip, c]) if c.is_zero(): if prot: print "TRUE (trivial)" return True else: c_orig = c if redsb: c = ll_red_nf_redsb(c, reductors) else: c = ll_red_nf_noredsb(c, reductors) if c.is_zero(): if prot: print "TRUE" return True else: if prot: print "FAILED" print "can construct COUNTER EXAMPLE with:", find_one(c) return False
def proofll(ifthen, reductors, redsb=True, prot=True): if prot and (not ifthen.supposedToBeValid): print "THIS THEOREM IS NOT SUPPOSED TO BE VALID" ip_pre = ifthen.ifpart ip = [] for p in ip_pre: p = Polynomial(p) if p.is_zero(): continue li = list(p.lead().variables()) if len(li) == 1 and (not (li[0] in list( Polynomial(reductors).lead().variables()))): assert not Polynomial(reductors).is_zero() lead_index = li[0] if redsb: p = ll_red_nf_redsb(p, reductors) reductors = ll_red_nf_redsb(Polynomial(reductors), BooleSet(p.set())) p_nav = p.navigation() reductors = recursively_insert(p_nav.else_branch(), p_nav.value(), reductors) else: ip.append(p) it = ifthen.thenpart if prot: print "proofing:", ifthen ip = logicaland(ip) for c in it: if prot: print "proofing part:", c c = logicalor([BooleConstant(1) + ip, c]) if c.is_zero(): if prot: print "TRUE (trivial)" return True else: c_orig = c if redsb: c = ll_red_nf_redsb(c, reductors) else: c = ll_red_nf_noredsb(c, reductors) if c.is_zero(): if prot: print "TRUE" return True else: if prot: print "FAILED" print "can construct COUNTER EXAMPLE with:", find_one(c) return False
def plot(p, filename, colored=True, format="png", highlight_monomial=None, fontsize=14, template_engine='jinja', landscape=False): """plots ZDD structure to <filename> in format <format> EXAMPLES: >>> r=Ring(1000) >>> x = r.variable >>> plot(x(1)+x(0),"/dev/null", colored=True) >>> plot(x(1)+x(0),"/dev/null", colored=False) """ THICK_PEN = 5 highlight_path = dict() if highlight_monomial: highlight_path = monomial_path_in_zdd(highlight_monomial, p) def display_monomial(m): return unicode(m).replace("*", u"⋅") def penwidth_else(n): if n in highlight_path and highlight_path[n] == ELSE: return THICK_PEN return 1 def penwidth_then(n): if n in highlight_path and highlight_path[n] == THEN: return THICK_PEN return 1 if not colored: color_then = "black" color_else = "black" else: color_then = "red" color_else = "blue" def find_navs(nav): if not nav in nodes: nodes.add(nav) if not nav.constant(): find_navs(nav.then_branch()) find_navs(nav.else_branch()) p = Polynomial(p) nodes = set() nav = p.navigation() find_navs(nav) non_constant_nodes = [n for n in nodes if not n.constant()] node_to_int = dict([(n, i) for (i, n) in enumerate(nodes)]) r = p.ring() def identifier(n): return "n" + str(node_to_int[n]) def label(n): if n.constant(): if n.terminal_one(): return "1" else: return "0" else: return str(r.variable(n.value())) def shape(n): if n.constant(): return "box" else: return "ellipse" renderers = dict(genshi=render_genshi, jinja=render_jinja) dot_input = renderers[template_engine](locals()) if isinstance(dot_input, unicode): dot_input = dot_input.encode('utf-8') process = Popen(["dot", "-T" + format, "-o", filename], stdin=PIPE, stdout=PIPE) process.stdin.write(dot_input) process.stdin.close() process.wait()
def plot(p, filename, colored=True, format="png", highlight_monomial=None, fontsize=14, template_engine='jinja', landscape=False ): """plots ZDD structure to <filename> in format <format> EXAMPLES: >>> r=Ring(1000) >>> x = r.variable >>> plot(x(1)+x(0),"/dev/null", colored=True) >>> plot(x(1)+x(0),"/dev/null", colored=False) """ THICK_PEN = 5 highlight_path = dict() if highlight_monomial: highlight_path = monomial_path_in_zdd(highlight_monomial, p) def display_monomial(m): return unicode(m).replace("*", u"⋅") def penwidth_else(n): if n in highlight_path and highlight_path[n] == ELSE: return THICK_PEN return 1 def penwidth_then(n): if n in highlight_path and highlight_path[n] == THEN: return THICK_PEN return 1 if not colored: color_then = "black" color_else = "black" else: color_then = "red" color_else = "blue" def find_navs(nav): if not nav in nodes: nodes.add(nav) if not nav.constant(): find_navs(nav.then_branch()) find_navs(nav.else_branch()) p = Polynomial(p) nodes = set() nav = p.navigation() find_navs(nav) non_constant_nodes = [n for n in nodes if not n.constant()] node_to_int = dict([(n, i) for (i, n) in enumerate(nodes)]) r = p.ring() def identifier(n): return "n" + str(node_to_int[n]) def label(n): if n.constant(): if n.terminal_one(): return "1" else: return "0" else: return str(r.variable(n.value())) def shape(n): if n.constant(): return "box" else: return "ellipse" renderers = dict(genshi=render_genshi, jinja=render_jinja) dot_input = renderers[template_engine](locals()) if isinstance(dot_input, unicode): dot_input = dot_input.encode('utf-8') process = Popen(["dot", "-T" + format, "-o", filename], stdin=PIPE, stdout=PIPE) process.stdin.write(dot_input) process.stdin.close() process.wait()