Реализация математических теорем
Это общий вопрос проектирования по реализации математических теорем. Я пытаюсь реализовать некоторые математические теоремы, из дифференциальной геометрии, в языке программирования (неважно, какой; для простоты я использую язык Python, но это не должно влиять на общие идеи.). Я могу описать вопрос лучше на примере.
Теорема. Любая прямая на поверхности класса r>= 2 является асимптотической кривой.
Как будет реализована такая теорема. Очевидно, что функция нуждается в строке в качестве аргумента и поверхности в качестве аргумента.
def theorem (line, surface): pass
Должна ли функция возвращать только истину, ложь или неразрешимость? Или функция должна возвращать "асимптотику". Если мы назовем функцию "is-асимптотической", то она должна вернуть true, false или неразрешимую.
Первое, что функция должна проверить, это прямая ли линия. Давайте не будем вдаваться в подробности. Затем следует рассчитать класс поверхности.
def theorem (line, surface):
if not straight(line, surface):
return "undecidable"
else:
if class-of(surface) >= 2:
???
Вышеуказанный подход заставляет меня возвращать истину / ложь. С другой стороны, если я реализую его как метод для класса с именем line, который запрашивает все свойства данной строки, он должен вернуть список свойств, включая "асимптотический".
Наконец, то, что я сделал выше, - это запрос свойства данной строки, нашего аргумента. Функция ничего не говорит обо всех остальных прямых.
Как бы вы рассмотрели весь проект реализации теорем?
Заранее спасибо.
PS. Чтобы дополнительно уточнить вопрос в содержании языка программирования, приведенный выше вопрос перефразируется следующим образом. Предполагая, что у меня есть экземпляр "линия" объекта "Линия". Я спрашиваю экземпляр, если он асимптотический, как в
is_asymptotic(line) # returns true/false/undecidable
или я спрашиваю его свойства и получаю список свойств, который включает асимптотическое свойство, как в
line_properties(line) # returns [..., "asymptotic", ...]
или при создании экземпляра я устанавливаю атрибут асимптотически, после проверки, является ли он прямым, как в
line = Line(surface) # sets line.asymptotic = True
1 ответ
Используйте пакет sympy.
In [153]: from sympy import *
In [154]: x = symbols('x')
In [155]: y = symbols('y')
In [156]: z = symbols('z')
In [157]: p = (x+y)**2
In [158]: p
Out[158]: (x + y)**2
In [159]: q = x**2 + 2*x*y + y**2
In [160]: p == q
Out[160]: False
In [161]: p.expand() == q
Out[161]: True
вы, вероятно, найдете https://github.com/sympy/sympy/wiki/Geometry-Module
быть полезным.
удачи!