Цель
Моя цель - работать в теории, в которой у меня есть доступ и я могу рассуждать о целых числах, а также есть известная функция bar
.
Я хочу иметь возможность решать уравнения, подобные этим:
bar(bar(x)) == bar(y) Solution: y = bar(x), bar is unknown
2 + bar(2) == bar(x) Solution: x is unknown, bar is unknown
Проблема в том, что строка в конечном итоге вычислима, но не может быть закодирована в целочисленной арифметике, поэтому я пытаюсь сопоставить ее с «неизвестной» функцией.
Конкретный пример
В z3
я работаю со следующим пользовательским типом данных.
import pytest
from z3 import Datatype, IntSort
def test_stackoverflow():
FooBar = Datatype('FooBar')
FooBar.declare('foo', ('unfoo', IntSort()))
FooBar.declare('bar', ('unbar', FooBar))
FooBar = FooBar.create()
foo = FooBar.foo
unfoo = FooBar.unfoo
bar = FooBar.bar
unbar = FooBar.unbar
Можно ли перегрузить *Оператор 1021 * для работы с foo
значениями, такими как:
Forall([x, y], foo(x) + foo(y) == foo(x + y))
Есть ли способ сделать это, не жертвуя разрешимостью?