#java #optimization #z3
#java #оптимизация #z3
Вопрос:
Я учусь запускать аналогичные коды в соответствующем случае, который предназначен для сопоставления грузовиков для транспортировки (https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/nbjorner-nuz.pdf ) в JAVA API. Существует код для определения функции max:
(define-fun imax ((a Int) (b Int)) Int (if (> a b) a b))
Я перевожу это на Java:
public static ArithExpr maxFunc(ArithExpr a, ArithExpr b)
{
Context ctx = new Context();
ArithExpr result = (ArithExpr) ctx.mkITE(ctx.mkGe(a, b), a, b);
return resu<
}
И попробуйте использовать ее таким же образом (ниже приведена только демонстрация)
ArithExpr per1 = maxFunc(X0101, maxFunc(X0201, maxFunc(X0301, maxFunc(X0401, X0501))));
BoolExpr minPer1 = ctx.mkEq(per1, constant0);
o.AssertSoft(minPer1,1 , "a");
Для приведенных выше кодов есть ошибки:
Exception in thread "main" com.microsoft.z3.Z3Exception: Context mismatch
Ошибка относится к телу функции:
ArithExpr result = (ArithExpr) ctx.mkITE(ctx.mkGe(a, b), a, b);
У меня определенно есть сомнения в построении функции z3 на JAVA. Существует ли специальная форма функции для Z3 Java API? Как исправить функцию?
Ответ №1:
«Несоответствие контекста» означает, что вы пытаетесь использовать выражения из нескольких контекстов вместе, что не поддерживается. Вместо Context ctx = new Context();
убедитесь, что вы используете тот же контекст, что и в остальной части вашей программы.