Exemplo n.º 1
0
def model_facts(h, ignore, clauses1, upclose=False):
    # define the universe for each sort:
    uc = [fact for s in h.sorts() for fact in model_universe_facts(h, s, upclose)]
    # values of constants in formula
    temp = [
        [(ivy_logic.Constant(c), get_model_constant(h.model, ivy_logic.Constant(c)))]
        for c in used_constants_clauses(clauses1)
        if not ignore(c) and c not in ivy_logic.sig.constructors
    ]
    #    print "temp = {}".format(temp)
    vc = [
        [ivy_logic._eq_lit(ivy_logic.Constant(c), get_model_constant(h.model, ivy_logic.Constant(c)))]
        for c in used_constants_clauses(clauses1)
        if not ignore(c) and c not in ivy_logic.sig.constructors
    ]
    #    print "model_facts vc = {}".format(vc)
    # values of relations in formula
    #    print "used_relations_clauses = {}".format(used_relations_clauses(clauses1))
    urc = dict((ivy_logic.normalize_symbol(r), n) for r, n in used_relations_clauses(clauses1).iteritems())
    vr = [[l] for (r, n) in urc.iteritems() if not ignore(r) for l in relation_model_to_clauses(h, r, n)]
    # values of functions in formula
    fns = set(f for (f, arity) in functions_clauses(clauses1) if not ignore(f) and arity >= 1)
    vf = [[l] for f in fns for l in function_model_to_clauses(h, f)]
    res = uc + vc + vr + vf
    return Clauses(res)
Exemplo n.º 2
0
def model_facts(h, ignore, clauses1, upclose=False):
    # define the universe for each sort:
    uc = [
        fact for s in h.sorts()
        for fact in model_universe_facts(h, s, upclose)
    ]
    # values of constants in formula
    temp = [[(ivy_logic.Constant(c),
              get_model_constant(h.model, ivy_logic.Constant(c)))]
            for c in used_constants_clauses(clauses1)
            if not ignore(c) and c not in ivy_logic.sig.constructors]
    #    print "temp = {}".format(temp)
    vc = [[
        ivy_logic._eq_lit(ivy_logic.Constant(c),
                          get_model_constant(h.model, ivy_logic.Constant(c)))
    ] for c in used_constants_clauses(clauses1)
          if not ignore(c) and c not in ivy_logic.sig.constructors]
    #    print "model_facts vc = {}".format(vc)
    # values of relations in formula
    #    print "used_relations_clauses = {}".format(used_relations_clauses(clauses1))
    vr = [[l] for (r, n) in used_relations_clauses(clauses1).iteritems()
          if not ignore(r) for l in relation_model_to_clauses(h, r, n)]
    # values of functions in formula
    fns = set(f for (f, arity) in functions_clauses(clauses1)
              if not ignore(f) and arity >= 1)
    vf = [[l] for f in fns for l in function_model_to_clauses(h, f)]
    res = uc + vc + vr + vf
    return Clauses(res)
Exemplo n.º 3
0
def clauses_model_to_diagram(clauses1,ignore = None, implied = None,model = None,axioms=None,weaken=True,numerals=True):
    """ Return a diagram of a model of clauses1 or None.  The function "ignore", if
    provided, returns true for symbols that should be ignored in the
    diagram.
    """
#    print "clauses_model_to_diagram clauses1 = {}".format(clauses1)
    if axioms == None:
        axioms = true_clauses()
    h = model_if_none(and_clauses(clauses1,axioms),implied,model)
    ignore = ignore if ignore != None else lambda x: False
    res = model_facts(h,(lambda x: False),clauses1,upclose=True) # why not pass axioms?
#    print "clauses_model_to_diagram res = {}".format(res)
    # find representative elements
    # find representatives of universe elements
    if numerals:
        reps = numeral_assign(res,h)
    else:
        reps = dict()
        for c in used_constants_clauses(clauses1):
    #        print "constant: {}".format(c)
            mc = get_model_constant(h.model,ivy_logic.Constant(c))
    #        print "value: {}".format(mc)
            if mc.rep not in reps or reps[mc.rep].rep.is_skolem() and not c.is_skolem():
                reps[mc.rep] = ivy_logic.Constant(c)
        for s in h.sorts():
            for e in h.sort_universe(s):
                if e.rep not in reps:
                    reps[e.rep] = e.rep.skolem()()
#    print "clauses_model_to_diagram reps = {}".format(reps)
    # filter out clauses using universe elements without reps
#    res = [cls for cls in res if all(c in reps for c in used_constants_clause(cls))]
    # replace universe elements with their reps
#    print "clauses_model_to_diagram res = {}".format(res)
    res = substitute_constants_clauses(res,reps)
    # filter defined skolems
    # this caused a bug in the leader example. the generated diagram did not satisfy clauses1
    res.fmlas = [f for f in res.fmlas if not any((x.is_skolem() and x in clauses1.defidx) for x in used_symbols_ast(f))]
#    print "clauses_model_to_diagram res = {}".format(res)
    uc = Clauses([[ivy_logic._eq_lit(ivy_logic.Variable('X',c.get_sort()),reps[c.rep])
                   for c in h.sort_universe(s)] for s in h.sorts()])
#    print "clauses_model_to_diagram uc = {}".format(uc)

    #    uc = true_clauses()
    if weaken:
        res = unsat_core(res,and_clauses(uc,axioms),clauses1) # implied not used here
#    print "clauses_model_to_diagram res = {}".format(res)

#    print "foo = {}".format(unsat_core(and_clauses(uc,axioms),true_clauses(),clauses1))

    # filter out non-rep skolems
    repset = set(c.rep for e,c in reps.iteritems())
#    print "clauses_model_to_diagram repset = {}".format(repset)
    ign = lambda x,ignore=ignore: (ignore(x) and not x in repset)
    res = Clauses([cl for cl in res.fmlas if not any(ign(c) for c in used_symbols_ast(cl))])
#    print "clauses_model_to_diagram res = {}".format(res)
    return res
Exemplo n.º 4
0
def model_universe_facts(h,sort,upclose):
    # get universe elements
    elems = h.sort_universe(sort)
    # constraint defining universe
    uc = []
    if not upclose:
        uc = [[ivy_logic._eq_lit(ivy_logic.Variable('X',c.sort),c) for c in elems]]
    # universe elements are distinct
    dc = [[ivy_logic._neq_lit(c1,c2)]
          for (c1,c2) in ivy_utils.distinct_unordered_pairs(elems)]
    return uc+dc
Exemplo n.º 5
0
def model_universe_facts(h,sort,upclose):
    if ivy_logic.is_interpreted_sort(sort):
        return []
    # get universe elements
    elems = h.sort_universe(sort)
    # constraint defining universe
    uc = []
    if not upclose:
        uc = [[ivy_logic._eq_lit(ivy_logic.Variable('X',c.sort),c) for c in elems]]
    # universe elements are distinct
    dc = [[ivy_logic._neq_lit(c1,c2)]
          for (c1,c2) in iu.distinct_unordered_pairs(elems)]
    return uc+dc
Exemplo n.º 6
0
def function_model_to_clauses(h, f):
    sort = f.sort
    rng = sort.rng
    res = []
    fterm = fun_inst(f)
    if isinstance(rng, ivy_logic.EnumeratedSort) and not use_z3_enums:
        for c in rng.defines():
            eq = ivy_logic._eq_lit(fterm, ivy_logic.Constant(ivy_logic.Symbol(c, rng)))
            #            print "function_model_to_clauses: {}".format(eq)
            get_lit_facts(h, eq, res)
    # non-enumerated function types
    else:
        lit = ivy_logic.Literal(1, fun_eq_inst(f))
        get_lit_facts(h, lit, res)
    #        print "fun facts: {}".format([str(r) for r in res])
    return res
Exemplo n.º 7
0
def function_model_to_clauses(h,f):
    sort = f.sort
    rng = sort.rng
    res = []
    fterm = fun_inst(f)
    if isinstance(rng,ivy_logic.EnumeratedSort) and not use_z3_enums:
        for c in rng.defines():
            eq = ivy_logic._eq_lit(fterm,ivy_logic.Constant(ivy_logic.Symbol(c,rng)))
#            print "function_model_to_clauses: {}".format(eq)
            get_lit_facts(h,eq,res) 
    # non-enumerated function types
    else:
        lit = ivy_logic.Literal(1,fun_eq_inst(f))
        get_lit_facts(h,lit,res)
#        print "fun facts: {}".format([str(r) for r in res])
    return res
Exemplo n.º 8
0
def clauses_model_to_diagram(clauses1,
                             ignore=None,
                             implied=None,
                             model=None,
                             axioms=None,
                             weaken=True):
    """ Return a diagram of a model of clauses1 or None.  The function "ignore", if
    provided, returns true for symbols that should be ignored in the
    diagram.
    """
    print "clauses_model_to_diagram clauses1 = {}".format(clauses1)
    if axioms == None:
        axioms = true_clauses
    h = model_if_none(and_clauses(clauses1, axioms), implied, model)
    ignore = ignore if ignore != None else lambda x: False
    res = model_facts(h, (lambda x: False), clauses1,
                      upclose=True)  # why not pass axioms?
    print "clauses_model_to_diagram res = {}".format(res)
    # find representative elements
    # find representatives of universe elements
    reps = dict()
    for c in used_constants_clauses(clauses1):
        #        print "constant: {}".format(c)
        mc = get_model_constant(h.model, ivy_logic.Constant(c))
        #        print "value: {}".format(mc)
        if mc.rep not in reps or reps[
                mc.rep].rep.is_skolem() and not c.is_skolem():
            reps[mc.rep] = ivy_logic.Constant(c)
    for s in h.sorts():
        for e in h.sort_universe(s):
            if e.rep not in reps:
                reps[e.rep] = e.rep.skolem()()
    print "clauses_model_to_diagram reps = {}".format(reps)
    # filter out clauses using universe elements without reps
    #    res = [cls for cls in res if all(c in reps for c in used_constants_clause(cls))]
    # replace universe elements with their reps
    print "clauses_model_to_diagram res = {}".format(res)
    res = substitute_constants_clauses(res, reps)
    # filter defined skolems
    # this caused a bug in the leader example. the generated diagram did not satisfy clauses1
    res.fmlas = [
        f for f in res.fmlas
        if not any((x.is_skolem() and x in clauses1.defidx)
                   for x in used_symbols_ast(f))
    ]
    print "clauses_model_to_diagram res = {}".format(res)
    uc = Clauses([[
        ivy_logic._eq_lit(ivy_logic.Variable('X', c.get_sort()), reps[c.rep])
        for c in h.sort_universe(s)
    ] for s in h.sorts()])
    print "clauses_model_to_diagram uc = {}".format(uc)

    #    uc = true_clauses()
    if weaken:
        res = unsat_core(res, and_clauses(uc, axioms),
                         clauses1)  # implied not used here
    print "clauses_model_to_diagram res = {}".format(res)

    #    print "foo = {}".format(unsat_core(and_clauses(uc,axioms),true_clauses(),clauses1))

    # filter out non-rep skolems
    repset = set(c.rep for e, c in reps.iteritems())
    print "clauses_model_to_diagram repset = {}".format(repset)
    ign = lambda x, ignore=ignore: (ignore(x) and not x in repset)
    res = Clauses([
        cl for cl in res.fmlas
        if not any(ign(c) for c in used_symbols_ast(cl))
    ])
    print "clauses_model_to_diagram res = {}".format(res)
    return res