예제 #1
0
def _extract_all_facts(assump, exprs):
    """
    Extract all relevant assumptions from *assump* with respect to given *exprs*.

    Parameters
    ==========

    assump : sympy.assumptions.cnf.CNF

    exprs : tuple of expressions

    Returns
    =======

    sympy.assumptions.cnf.CNF

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.cnf import CNF
    >>> from sympy.assumptions.ask import _extract_all_facts
    >>> from sympy.abc import x, y
    >>> assump = CNF.from_prop(Q.positive(x) & Q.integer(y))
    >>> exprs = (x,)
    >>> cnf = _extract_all_facts(assump, exprs)
    >>> cnf.clauses
    {frozenset({Literal(Q.positive, False)})}

    """
    facts = set()
    if len(exprs) == 1 and isinstance(exprs[0], Relational):
        rel = exprs[0]
        exprs = (rel, rel.reversed)

    for clause in assump.clauses:
        args = []
        for literal in clause:
            if isinstance(literal.lit, AppliedPredicate) and len(
                    literal.lit.arguments) == 1:
                if literal.lit.arg in exprs:
                    # Add literal if it has matching in it
                    args.append(Literal(literal.lit.function, literal.is_Not))
                else:
                    # If any of the literals doesn't have matching expr don't add the whole clause.
                    break
        else:
            if args:
                facts.add(frozenset(args))
    return CNF(facts)
예제 #2
0
def _extract_all_facts(expr, symbol):
    facts = set()
    if isinstance(symbol, Relational):
        symbols = (symbol, symbol.reversed)
    else:
        symbols = (symbol,)
    for clause in expr.clauses:
        args = []
        for literal in clause:
            if isinstance(literal.lit, AppliedPredicate):
                if literal.lit.arg in symbols:
                    # Add literal if it has 'symbol' in it
                    args.append(Literal(literal.lit.func, literal.is_Not))
                else:
                    # If any of the literals doesn't have 'symbol' don't add the whole clause.
                    break
        else:
            if args:
                facts.add(frozenset(args))
    return CNF(facts)
예제 #3
0
def get_all_known_facts():
    return {
        frozenset((Literal(Q.algebraic, False), Literal(Q.complex, True),
                   Literal(Q.finite, True), Literal(Q.transcendental, False))),
        frozenset((Literal(Q.algebraic, False), Literal(Q.rational, True))),
        frozenset((Literal(Q.algebraic, True), Literal(Q.complex, False))),
        frozenset((Literal(Q.algebraic, True), Literal(Q.finite, False))),
        frozenset((Literal(Q.algebraic, True), Literal(Q.transcendental,
                                                       True))),
        frozenset((Literal(Q.antihermitian, False), Literal(Q.imaginary,
                                                            True))),
        frozenset((Literal(Q.antihermitian, True), Literal(Q.hermitian,
                                                           True))),
        frozenset((Literal(Q.complex, False), Literal(Q.imaginary, True))),
        frozenset((Literal(Q.complex, False), Literal(Q.real, True))),
        frozenset((Literal(Q.complex, False), Literal(Q.transcendental,
                                                      True))),
        frozenset((Literal(Q.complex_elements,
                           False), Literal(Q.real_elements, True))),
        frozenset((Literal(Q.composite, True), Literal(Q.prime, True))),
        frozenset((Literal(Q.diagonal, False), Literal(Q.lower_triangular,
                                                       True),
                   Literal(Q.upper_triangular, True))),
        frozenset((Literal(Q.diagonal, True), Literal(Q.lower_triangular,
                                                      False))),
        frozenset((Literal(Q.diagonal, True), Literal(Q.normal, False))),
        frozenset((Literal(Q.diagonal, True), Literal(Q.symmetric, False))),
        frozenset((Literal(Q.diagonal, True), Literal(Q.upper_triangular,
                                                      False))),
        frozenset((Literal(Q.even,
                           False), Literal(Q.integer,
                                           True), Literal(Q.odd, False))),
        frozenset((Literal(Q.even, False), Literal(Q.zero, True))),
        frozenset((Literal(Q.even, True), Literal(Q.integer, False))),
        frozenset((Literal(Q.even, True), Literal(Q.odd, True))),
        frozenset((Literal(Q.extended_real, False), Literal(Q.infinite,
                                                            True))),
        frozenset((Literal(Q.extended_real, False), Literal(Q.real, True))),
        frozenset((Literal(Q.extended_real,
                           True), Literal(Q.infinite,
                                          False), Literal(Q.real, False))),
        frozenset((Literal(Q.finite, False), Literal(Q.irrational, True))),
        frozenset((Literal(Q.finite, False), Literal(Q.rational, True))),
        frozenset((Literal(Q.finite, False), Literal(Q.transcendental, True))),
        frozenset((Literal(Q.finite, True), Literal(Q.infinite, True))),
        frozenset((Literal(Q.finite, True), Literal(Q.irrational, False),
                   Literal(Q.rational, False), Literal(Q.real, True))),
        frozenset((Literal(Q.fullrank, False), Literal(Q.invertible, True))),
        frozenset((Literal(Q.fullrank,
                           True), Literal(Q.invertible,
                                          False), Literal(Q.square, True))),
        frozenset((Literal(Q.hermitian, False), Literal(Q.real, True))),
        frozenset((Literal(Q.imaginary, True), Literal(Q.real, True))),
        frozenset((Literal(Q.integer, False), Literal(Q.odd, True))),
        frozenset((Literal(Q.integer, False), Literal(Q.prime, True))),
        frozenset((Literal(Q.integer, True), Literal(Q.rational, False))),
        frozenset((Literal(Q.integer_elements,
                           True), Literal(Q.real_elements, False))),
        frozenset((Literal(Q.invertible,
                           False), Literal(Q.positive_definite, True))),
        frozenset((Literal(Q.invertible, False), Literal(Q.singular, False))),
        frozenset((Literal(Q.invertible, False), Literal(Q.unitary, True))),
        frozenset((Literal(Q.invertible, True), Literal(Q.singular, True))),
        frozenset((Literal(Q.invertible, True), Literal(Q.square, False))),
        frozenset((Literal(Q.irrational, True), Literal(Q.rational, True))),
        frozenset((Literal(Q.irrational, True), Literal(Q.real, False))),
        frozenset((Literal(Q.lower_triangular,
                           False), Literal(Q.triangular, True),
                   Literal(Q.upper_triangular, False))),
        frozenset((Literal(Q.lower_triangular,
                           True), Literal(Q.triangular, False))),
        frozenset((Literal(Q.negative,
                           False), Literal(Q.nonpositive,
                                           True), Literal(Q.zero, False))),
        frozenset((Literal(Q.negative,
                           False), Literal(Q.nonzero,
                                           True), Literal(Q.positive, False))),
        frozenset((Literal(Q.negative, False), Literal(Q.positive, False),
                   Literal(Q.real, True), Literal(Q.zero, False))),
        frozenset((Literal(Q.negative, True), Literal(Q.nonpositive, False))),
        frozenset((Literal(Q.negative, True), Literal(Q.nonzero, False))),
        frozenset((Literal(Q.negative, True), Literal(Q.positive, True))),
        frozenset((Literal(Q.negative, True), Literal(Q.real, False))),
        frozenset((Literal(Q.negative, True), Literal(Q.zero, True))),
        frozenset((Literal(Q.nonnegative, False), Literal(Q.positive, True))),
        frozenset((Literal(Q.nonnegative, False), Literal(Q.zero, True))),
        frozenset((Literal(Q.nonnegative,
                           True), Literal(Q.positive,
                                          False), Literal(Q.zero, False))),
        frozenset((Literal(Q.nonpositive, False), Literal(Q.zero, True))),
        frozenset((Literal(Q.nonzero, False), Literal(Q.positive, True))),
        frozenset((Literal(Q.normal, False), Literal(Q.unitary, True))),
        frozenset((Literal(Q.normal, True), Literal(Q.square, False))),
        frozenset((Literal(Q.orthogonal,
                           False), Literal(Q.real,
                                           True), Literal(Q.unitary, True))),
        frozenset((Literal(Q.orthogonal,
                           True), Literal(Q.positive_definite, False))),
        frozenset((Literal(Q.orthogonal, True), Literal(Q.unitary, False))),
        frozenset((Literal(Q.positive, False), Literal(Q.prime, True))),
        frozenset((Literal(Q.positive, True), Literal(Q.real, False))),
        frozenset((Literal(Q.positive, True), Literal(Q.zero, True))),
        frozenset((Literal(Q.rational, True), Literal(Q.real, False))),
        frozenset((Literal(Q.real, False), Literal(Q.zero, True))),
        frozenset((Literal(Q.square, False), Literal(Q.symmetric, True))),
        frozenset((Literal(Q.triangular,
                           False), Literal(Q.unit_triangular, True))),
        frozenset((Literal(Q.triangular,
                           False), Literal(Q.upper_triangular, True)))
    }
예제 #4
0
def generate_code():
    from textwrap import dedent, wrap

    LINE = ",\n        "
    HANG = ' ' * 8
    code_string = dedent('''\
    """
    Do NOT manually edit this file.
    Instead, run ./bin/ask_update.py.
    """

    from sympy.assumptions.ask import Q
    from sympy.assumptions.cnf import Literal
    from sympy.core.cache import cacheit

    @cacheit
    def get_all_known_facts():
        """
        Known facts between unary predicates as CNF clauses.
        """
        return {
            %s
        }

    @cacheit
    def get_known_facts_dict():
        """
        Logical relations between unary predicates as dictionary.

        Each key is a predicate, and item is two groups of predicates.
        First group contains the predicates which are implied by the key, and
        second group contains the predicates which are rejected by the key.

        """
        return {
            %s
        }
    ''')

    x = Symbol('x')
    fact = get_known_facts(x)

    # Generate CNF of facts between known unary predicates
    cnf = CNF.to_CNF(fact)
    p = LINE.join(
        sorted([
            'frozenset((' + ', '.join(
                str(Literal(lit.arg.function, lit.is_Not))
                for lit in sorted(clause, key=str)) + '))'
            for clause in cnf.clauses
        ]))

    # Generate dictionary of facts between known unary predicates
    keys = [pred(x) for pred in get_known_facts_keys()]
    mapping = generate_known_facts_dict(keys, fact)
    items = sorted(mapping.items(), key=str)
    keys = [str(i[0]) for i in items]
    values = [
        '(set(%s), set(%s))' %
        (sorted(i[1][0], key=str), sorted(i[1][1], key=str)) for i in items
    ]
    m = LINE.join([
        '\n'.join(
            wrap("{}: {}".format(k, v),
                 subsequent_indent=HANG,
                 break_long_words=False)) for k, v in zip(keys, values)
    ]) + ','

    return code_string % (p, m)
예제 #5
0
def test_get_relevant_clsfacts():
    exprs = {Abs(x*y)}
    exprs, facts = get_relevant_clsfacts(exprs)
    assert exprs == {x*y}
    assert facts.clauses == \
        {frozenset({Literal(Q.odd(Abs(x*y)), False), Literal(Q.odd(x*y), True)}),
        frozenset({Literal(Q.zero(Abs(x*y)), False), Literal(Q.zero(x*y), True)}),
        frozenset({Literal(Q.even(Abs(x*y)), False), Literal(Q.even(x*y), True)}),
        frozenset({Literal(Q.zero(Abs(x*y)), True), Literal(Q.zero(x*y), False)}),
        frozenset({Literal(Q.even(Abs(x*y)), False),
                    Literal(Q.odd(Abs(x*y)), False),
                    Literal(Q.odd(x*y), True)}),
        frozenset({Literal(Q.even(Abs(x*y)), False),
                    Literal(Q.even(x*y), True),
                    Literal(Q.odd(Abs(x*y)), False)}),
        frozenset({Literal(Q.positive(Abs(x*y)), False),
                    Literal(Q.zero(Abs(x*y)), False)})}