В настоящее время я пытаюсь использовать Z3 для кодирования простой программной логики для нетипизированного языка с полиморфными списками.
Насколько я понимаю, из учебника Z3 Моуры и Бьорнера, это не возможно «вкладывать рекурсивные определения типов данных в другие типы, такие как массивы».
Итак, предположим, у меня есть следующий тип OCaml:
type value =
| Num of float
| String of string
| List of value list
В идеале я хотел бы закодировать этот тип в Z3, используя встроенный тип Z3List, но я думаю, что это невозможно, потому что Z3 не поддерживает взаимную рекурсию между рекурсивными типами данных и другими типами . Может кто-нибудь подтвердить, что это так?
Если это так, я думаю, что единственный возможный способ для меня - определить мой собственный тип для списка значений, скажем my_list, и для типов my_list и value, чтобы они были взаимно рекурсивными. В OCaml:
type value =
| Num of float
| String of string
| List of my_list
and my_list =
| Cons of value * my_list
| nil
Но это означает, что я не смогу использовать встроенную инфраструктуру рассуждений, которую Z3 поддерживает для Z3Lists. Есть лучший способ сделать это?