Предполагаемые У меня есть два ограничения (c1, c2), и я хочу, чтобы проверить, являются ли они синтаксической идентичны:Проверка синтаксической эквивалентности двух ограничений эффективно Z3
c1: f(x)>1 && g(y)=2
c2: f(x)>1 && g(y)=2
Вариант 1: Мы могли бы превратить это в выполнимости проблема, как этот пост: Whether two boolexpr are equal
Вариант 2: Мы также могли бы превратить их в строки и сравнить равенство:
if(c1.toString().equals(c2.toString()))
///do somthing
Но оба этих варианта имеют большие накладные расходы, поскольку размер ограничений увеличивается. например вызывая метод toString() в Expr очень дорог для больших ограничений.
Два вопроса:
Как проверить, являются ли два ограничения синтаксически идентичны эффективно Z3 (Java версия)?
Если мы не имеем хорошее решение для 1, я рассматриваю писать обертку для Expr объекта и используя фабричный метод, чтобы избежать генераторной дублируется (синтаксически) объектов из Z3. Затем я должен создать свои собственные функции equal() и hashCode(). Но до сих пор я до сих пор не могу найти эффективный способ.
Большое спасибо. Я предполагал, что метод equals() AST проверяет только то, являются ли два экземпляра одинаковыми. Глупый я. –