Почему?
Контекст варианта использования, в котором возникает моя проблема
Я определяю 3 случайных элемента треугольника. Microsoft Z3 должен выводить:
- Удовлетворительны ли ограничения или имеются недопустимые входные значения?
- Модель для всех остальных элементов треугольника, в которой всем переменным присваиваются конкретные значения.
Чтобы ограничить элементы, мне нужно assert
равенства треугольников - я хотел начать с теоремы Пифагора ((h_c² + p² = b²) ^ (h_c² + q² = a²)
).
Эта проблема
Я знаю, что Microsoft Z3 имеет лишь ограниченные возможности для решения нелинейных арифметических задач. Но даже некоторые ручные калькуляторы могут решить очень упрощенную версию, например:
(set-option :print-success true)
(set-option :produce-proofs true)
(declare-const a Real)
(declare-const b Real)
(assert (= a 1.0))
(assert (= b 1.0))
(assert
(exists
((c Real))
(=
(+
(* a a)
(* b b)
)
(* c c)
)
)
)
(check-sat)
(get-model)
Вопрос
- Есть ли способ заставить Microsoft Z3 решить теорему Пифагора, если заданы два значения?
- Или: есть ли другое средство доказательства теорем, способное справиться с этим случаем нелинейной арифметики?
Спасибо за вашу помощь по этому поводу - если что-то неясно, пожалуйста, прокомментируйте.