logic.py 33,1 ko
Newer Older
MircoT's avatar
MircoT a validé
    args = list(map(simp, x.args))
    u, op, v = args[0], x.op, args[-1]
withal's avatar
withal a validé
    if op == '+':
Peter Norvig's avatar
Peter Norvig a validé
        if v == 0:
MircoT's avatar
MircoT a validé
            return u
Peter Norvig's avatar
Peter Norvig a validé
        if u == 0:
MircoT's avatar
MircoT a validé
            return v
        if u == v:
Peter Norvig's avatar
Peter Norvig a validé
            return 2 * u
MircoT's avatar
MircoT a validé
        if u == -v or v == -u:
Peter Norvig's avatar
Peter Norvig a validé
            return 0
withal's avatar
withal a validé
    elif op == '-' and len(args) == 1:
MircoT's avatar
MircoT a validé
        if u.op == '-' and len(u.args) == 1:
            return u.args[0]  # --y ==> y
withal's avatar
withal a validé
    elif op == '-':
Peter Norvig's avatar
Peter Norvig a validé
        if v == 0:
MircoT's avatar
MircoT a validé
            return u
Peter Norvig's avatar
Peter Norvig a validé
        if u == 0:
MircoT's avatar
MircoT a validé
            return -v
        if u == v:
Peter Norvig's avatar
Peter Norvig a validé
            return 0
MircoT's avatar
MircoT a validé
        if u == -v or v == -u:
Peter Norvig's avatar
Peter Norvig a validé
            return 0
withal's avatar
withal a validé
    elif op == '*':
Peter Norvig's avatar
Peter Norvig a validé
        if u == 0 or v == 0:
            return 0
        if u == 1:
MircoT's avatar
MircoT a validé
            return v
Peter Norvig's avatar
Peter Norvig a validé
        if v == 1:
MircoT's avatar
MircoT a validé
            return u
        if u == v:
            return u ** 2
withal's avatar
withal a validé
    elif op == '/':
Peter Norvig's avatar
Peter Norvig a validé
        if u == 0:
            return 0
        if v == 0:
MircoT's avatar
MircoT a validé
            return Expr('Undefined')
        if u == v:
Peter Norvig's avatar
Peter Norvig a validé
            return 1
MircoT's avatar
MircoT a validé
        if u == -v or v == -u:
Peter Norvig's avatar
Peter Norvig a validé
            return 0
withal's avatar
withal a validé
    elif op == '**':
Peter Norvig's avatar
Peter Norvig a validé
        if u == 0:
            return 0
        if v == 0:
            return 1
        if u == 1:
            return 1
        if v == 1:
MircoT's avatar
MircoT a validé
            return u
withal's avatar
withal a validé
    elif op == 'log':
Peter Norvig's avatar
Peter Norvig a validé
        if u == 1:
            return 0
MircoT's avatar
MircoT a validé
    else:
        raise ValueError("Unknown op: " + op)
    # If we fall through to here, we can not simplify further
    """Differentiate and then simplify."""
withal's avatar
withal a validé
    return simp(diff(y, x))