我正在尝试为z3编写自定义字符串理论。我遇到的一个问题是z3中的内部化概念。
如果在将表达式(或文字)添加为公理之前未对其进行内部化,则有时会出现异常,但有时不会。
例如,在以下来自theory_seq.cpp的代码中
VERIFY(m_util.str.is_index(i, t, s) ||
m_util.str.is_index(i, t, s, offset));
expr_ref minus_one(m_autil.mk_int(-1), m);
literal cnt = mk_literal(m_util.str.mk_contains(t, s));
literal i_eq_m1 = mk_eq(i, minus_one, false);
add_axiom(cnt, i_eq_m1);
它没有将i_eq_m1内部化,并且似乎工作正常。
但是如果我不对任何表达式进行内部化(例如,删除对ctx.internalize(e,false)的所有调用),我将得到一些例外。
从现有表达式创建新表达式时,有什么原则可遵循?