Несмотря на то, что SMT-Lib2 достаточно выразителен, он не самый простой язык для программирования. Если у вас нет жестких требований к тому, что вам придется кодировать непосредственно в SMTLib2, я бы порекомендовал поискать другие языки с высокоуровневыми привязками кSMT решатели.Например, и в Haskell, и в Scala есть библиотеки, которые позволяют создавать сценарии для SMT-решателей на более высоком уровне.Вот как решить вашу проблему с помощью Haskell, например: https://gist.github.com/1701881.
Идея состоит в том, что эти библиотеки позволяют вам кодировать на гораздо более высоком уровне, а затем выполнять необходимый перевод и запросы SMT-решателя.для вас за кадром.(Если вам действительно нужно разобраться с кодировкой SMTLib вашей проблемы, вы также можете использовать эти библиотеки, поскольку они обычно поставляются с необходимым API для создания дампов SMTLib, которые они генерируют перед запросом решателя.)
Хотя эти библиотеки могут не предлагать все, что Z3 дает вам доступ через SMTLib, их гораздо проще использовать для решения большинства практических задач.