Edycja: teraz jest w 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
Starsza odpowiedź, która pokazuje inną pracę
Po dłuższej analizie to właśnie znalazłem.
Aktualna odpowiedź na moje konkretne pytanie brzmi: „Nie, nie ma obecnego systemu, który mógłby odpowiedzieć na to pytanie”. Jest jednak kilka rzeczy, które wydają się zbliżać.
Po pierwsze, Matt Knepley i Lagerbaer wskazali na prace Diego Fabregata i Paolo Bientinesi . Ta praca pokazuje zarówno potencjalne znaczenie, jak i wykonalność tego problemu. To dobra lektura. Niestety nie jestem pewien, jak dokładnie działa jego system ani do czego jest on zdolny (jeśli ktoś zna inne publiczne materiały na ten temat, daj mi znać).
Po drugie, istnieje biblioteka algebry tensorowej napisana dla Mathematica o nazwie xAct, która obsługuje symetrie i takie symbolicznie. Robi niektóre rzeczy bardzo dobrze, ale nie jest dostosowany do specjalnego przypadku algebry liniowej.
Po trzecie, reguły te są formalnie zapisane w kilku bibliotekach dla Coq , zautomatyzowanego asystenta dowodzenia twierdzeń (Google szuka algebry liniowej / macierzowej coq, aby znaleźć kilka). To potężny system, który niestety wydaje się wymagać interakcji człowieka.
Po rozmowie z niektórymi ludźmi dowodzącymi twierdzeniami sugerują przyjrzenie się programowaniu logicznemu (tj. Prologowi, który również sugerował Lagerbaer) dla tego rodzaju rzeczy. O ile mi wiadomo, nie zostało to jeszcze zrobione - mogę się z tym bawić w przyszłości.
Aktualizacja: Zaimplementowałem to za pomocą systemu Maude . Mój kod jest hostowany na github