Изменить: теперь это в SymPy
$ isympy
In [1]: A = MatrixSymbol('A', n, n)
In [2]: B = MatrixSymbol('B', n, n)
In [3]: context = Q.symmetric(A) & Q.positive_definite(A) & Q.orthogonal(B)
In [4]: ask(Q.symmetric(B*A*B.T) & Q.positive_definite(B*A*B.T), context)
Out[4]: True
Старый ответ, который показывает другую работу
Поэтому, посмотрев на это некоторое время, я нашел это.
Текущий ответ на мой конкретный вопрос: «Нет, в настоящее время нет системы, которая могла бы ответить на этот вопрос». Есть, однако, несколько вещей, которые кажутся близкими.
Во-первых, Мэтт Кнепли и Лагербер указали на работы Диего Фабрегата и Паоло Биентинези . Эта работа показывает как потенциальную важность, так и выполнимость этой проблемы. Это хорошее чтение. К сожалению, я не уверен точно, как работает его система или на что она способна (если кто-нибудь знает другие публичные материалы по этой теме, дайте мне знать).
Во-вторых, есть библиотека тензорной алгебры, написанная для Mathematica под названием xAct, которая обрабатывает симметрии и тому подобное символически. Он делает некоторые вещи очень хорошо, но не приспособлен к частному случаю линейной алгебры.
В-третьих, эти правила формально записаны в паре библиотек для Coq , автоматизированного помощника по доказательству теорем (Google находит для coq линейную / матричную алгебру, чтобы найти несколько). Это мощная система, которая, к сожалению, требует взаимодействия с человеком.
После разговора с некоторыми людьми , доказывающими теорему, они предлагают изучить логику программирования (например, Пролог, который Лагербаер также предложил) для такого рода вещей. Насколько мне известно, это еще не сделано - я могу поиграть с этим в будущем.
Обновление: я реализовал это с помощью системы Мод . Мой код размещен на github