Можно ли в z3 объявить функцию, которая принимает в качестве аргумента другую функцию? Например, это
(declare-fun foo ( ((Int) Bool) ) Int)
не совсем работает. Спасибо.
Можно ли в z3 объявить функцию, которая принимает в качестве аргумента другую функцию? Например, это
(declare-fun foo ( ((Int) Bool) ) Int)
не совсем работает. Спасибо.
Как упоминал Леонардо, SMT-Lib не поддерживает функции более высокого порядка. Это не просто синтаксическое ограничение: рассуждение с функциями более высокого порядка (как правило) выходит за рамки того, с чем могут иметь дело решатели SMT. (Хотя в некоторых особых случаях можно использовать неинтерпретируемые функции.)
Если вам нужно рассуждать с помощью функций высшего порядка, то интерактивные средства доказательства теорем — это основное оружие выбора: Изабель, HOL, Coq является одним из примеров.
Однако иногда вы хотите, чтобы функции более высокого порядка не рассуждали о них, а просто упрощали задачи программирования. Язык ввода SMT-Lib не подходит для высокоуровневого программирования, которое обычно требуется конечным пользователям в практических ситуациях. Если это ваш вариант использования, то я бы рекомендовал не использовать SMT-Lib напрямую, а работать с языком программирования, который дает вам доступ к Z3 (или другим решателям SMT). Есть несколько вариантов, в зависимости от того, какой язык хоста наиболее подходит для вашего варианта использования:
Каждая привязка имеет свой собственный набор функций, Z3Py, вероятно, является наиболее универсальным, поскольку он напрямую поддерживается людьми Z3. (Он также обеспечивает доступ к внутренним компонентам Z3, которые остаются недоступными для других вариантов, по крайней мере, на данный момент.)
map
/filter
и т. д.), это на самом деле не помогает. Попробуйте, например, доказать map f . map g = map (f . g)
, снабженное только определением map
.
- person alias; 20.11.2019
Нет, это невозможно. Однако вы можете определить функцию, которая принимает массив в качестве аргумента.
(объявить-fun foo ((Array Int Bool)) Int)
Вы можете использовать этот трюк для имитации функций высокого порядка, подобных той, что указана в вашем вопросе.
Вот пример: http://rise4fun.com/Z3/qsED
Руководство по Z3 содержит дополнительную информацию о Z3 и SMT.