Вы ищете неинтерпретированные функции.
Поиск термина "неинтерпретированные функции" в http://ericpony.github.io/z3py-tutorial/advanced-examples.htm
Ваш вопрос, кажется, делает некоторые предположения о том, как можно использовать решатели SMT;которые не совсем отражают текущее состояние дел.Хороший ресурс, чтобы прочитать об использовании решателей SMT: https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/nbjorner-smt-application-chapter.pdf Было бы неплохо потратить время на то, чтобы ознакомиться с его применением на практике.
Некоторые общие замечания:
Z3py
Z3py - это , а не система рассуждений о программах на Python.Z3py - это коллекция библиотек, поэтому вы можете писать сценарии для Z3 гораздо более понятным и простым способом.Есть много таких привязок из многих языков: C / C ++ / Java / Haskell / Scala, вы называете это.Преимущество Z3py в том, что его легче изучать и использовать.Но вы не должны думать об этом как о системе, которая рассуждает о самом Python.Это всего лишь способ написания сценариев Z3 в упрощенной форме.
Логики решателя
Решатели SMT по существу работают над разрешимыми фрагментами (в основном без квантификаторов) многих сортированных логик различных теорий.Вы можете найти их подробно по адресу: http://smtlib.cs.uiowa.edu/logics.shtml
SMTLib
Большинство решателей принимают ввод в так называемом формате SMT-Lib, подробно здесь: http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf
Обратите внимание, что любое «связывание» на уровне C / Python / Java и т. Д. - просто удобство для программистов.Хотя многие решатели также предоставляют расширенные возможности, вам следует подумать о языке SMTLib.В вашем конкретном случае неинтерпретированные функции хорошо описаны в приведенном выше документе.
Типы
SMTLib понимает набор типов: целые числа, вещественные числа, бит-векторы (целые числа машин), числа с плавающей запятойи т. д. Он также допускает составные типы, такие как алгебраические типы данных, которые могут быть даже рекурсивными.(Хотя поддержка решателей различается.) Вам необходимо «сопоставить» типы внешних функций с этими типами: Надеюсь, что-то достаточно близко.Если нет, не стесняйтесь задавать конкретные вопросы о типах, которые вас интересуют.
«Импорт» функций
невозможно импортировать функции, написанные на других языках (Python/ C / C ++ и т. Д.) В SMTLib и рассуждать о них.Механизма для этого нет, и никогда не будет.Это не цель решения SMT.Если вы хотите рассуждать о программах, написанных на определенном языке, вам следует искать инструменты, специально предназначенные для работы на этих языках.(Например, Dafny для общих императивных программ, программы Klee / CBMC для C, программы LiquidHaskell для Haskell и т. Д.) Эти инструменты различаются по своим возможностям и тому, что они позволяют вам указывать и доказывать.Обратите внимание, что сами эти инструменты могут использовать SMT-решатели внизу для выполнения своих задач - и они часто делают это, а не наоборот.
Придерживаясь SMTLib
Если других инструментов нетдоступны (и, к сожалению, это, вероятно, имеет место для большинства языков, особенно устаревших), вы по сути застряли с тем, что обеспечивает язык SMTLib.В вашем случае, лучший способ моделирования таких «внешних» функций с использованием SMTLib - это использовать неинтерпретированные функции вместе с аксиомами.В общем, вам нужны аксиомы, чтобы ограничить поведение самих неинтерпретированных функций, моделировать ваши внешние функции.С другой стороны, если аксиомы определены количественно (как правило, они будут), решатель может вернуть unknown
.
Сводка
Хотя решатели SMT являются отличными инструментами, вы должны всегдаимейте в виду, что язык, на котором они работают, это SMTLib, а не Python / C или что-то еще.Эти привязки являются просто средством доступа к решателю, поскольку вы можете включить его в более крупный проект.Я надеюсь, что это очищает ожидаемый вариант использования.
Задавать конкретные вопросы о том, что вы пытались и чего пытаетесь достичь (примеры кода), - это лучший способ получить выгоду от этого форума!