在 Sympy 中定义一个新的逻辑操作

Define a new logical operation in Sympy

我一直在阅读 Sympy 的源代码,试图弄清楚我是否可以添加自己的逻辑操作。这是定义逻辑操作的地方: https://github.com/sympy/sympy/blob/master/sympy/logic/boolalg.py

是否可以不修改库本身? 我假设我需要创建一个扩展 BooleanFunction 的 class 但随后在这段代码中:

class Boolean(Basic):
    """A boolean object is an object for which logic operations make sense."""

    __slots__ = []

    def __and__(self, other):
        """Overloading for & operator"""
        return And(self, other)

    __rand__ = __and__

    def __or__(self, other):
        """Overloading for |"""
        return Or(self, other)

    __ror__ = __or__

    def __invert__(self):
        """Overloading for ~"""
        return Not(self)

    def __rshift__(self, other):
        """Overloading for >>"""
        return Implies(self, other)

    def __lshift__(self, other):
        """Overloading for <<"""
        return Implies(other, self)

    __rrshift__ = __lshift__
    __rlshift__ = __rshift__

    def __xor__(self, other):
        return Xor(self, other)

    __rxor__ = __xor__

如何在不修改 class 的情况下添加新操作?

你应该 subclass sympy.logic.boolalg.BooeanFunction (或者只是 Boolean 如果你的对象不是一个函数)。 BooleanFunction 本身是 Function 的子class,这意味着您使用与 Function 相同的行为来定义其操作,即定义 class 方法 eval 其中 returns 值当您希望对象求值,以及 None 何时应保持不求值。例如参见 [​​=14=] 的定义。

如果您的操作是格运算符(如 And 和 Or),您也可以使用 LatticeOp,这会简化它们的定义。

至于运算符本身,如果您想重载运算符,请在 class 上为它定义 __method__。 Python 只允许重载某些 specific operators,并且您不能更改它们的优先级,因此根据您的运算符是什么,可能没有您可以为其定义的合理运算符,在这种情况下,您将需要使用函数符号。