У меня есть аналогичный вопрос: How to print a Z3 Set object? , из которого я не мог понять, как печатать значения набора в модели. У меня есть одно перечисление рода (код в Java):Значения набора в модели, найденной Z3
- EnumSort rSort = ctx.mkEnumSort (ctx.mkSymbol ("Рес"), ctx.mkSymbol ("res1"));
, из которого я создаю множество рода:
- SetSort RSet = ctx.mkSetSort (rSort)
С помощью этого набора то, я создаю Z3 постоянной Rid и определим простое выражение членство:
- BoolExpr c1 = (BoolExpr) ctx.mkSetMembership (rSort.getConsts() [0], РИД);
Когда c1 выполнимо, я хотел бы увидеть одно возможное значение для rID в модели. Если я попытаюсь интерпретировать константу (т. Е. M.getConstInterp (e), где e - это FuncDecl из модели), я получаю: «Функции ненулевой функции arity и функции массивов имеют функции Functionterterretretations в качестве модели. Используйте FuncInterp.».
Когда я пытаюсь интерпретировать func (т. Е. M.getFuncInterp (e)), я получаю «Аргумент не был константой массива». Я здесь что-то не так? Невозможно ли напечатать значения заданного объекта? Альтернативно, есть ли лучший способ представления переменной, которая может содержать несколько значений из сортировки?
Это работает, спасибо! Я понял, что если я установлю решатель явно на QF_LIA, я получу эту ошибку. Я не задумывался о том, почему, но я полагаю, что переменные набора не работают в LIA. – fturkmen
Другой вопрос, связанный с наборами обработки, есть ли реализация ограничений мощности на множествах? Здесь (https://github.com/psuter/bapa-z3) я вижу, что есть реализация Scala, но я не уверен, есть ли в других реализациях Z3. – fturkmen