MCPcopy Create free account
hub / github.com/Z3Prover/z3 / get_array_interp_core

Method get_array_interp_core

src/model/func_interp.cpp:399–449  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

397}
398
399expr_ref func_interp::get_array_interp_core(func_decl * f) const {
400 expr_ref r(m());
401 if (m_else == nullptr)
402 return r;
403 ptr_vector<sort> domain;
404 for (sort* s : *f)
405 domain.push_back(s);
406
407 bool ground = is_ground(m_else);
408 for (func_entry * curr : m_entries) {
409 ground &= is_ground(curr->get_result());
410 for (unsigned i = 0; i < m_arity; ++i)
411 ground &= is_ground(curr->get_arg(i));
412 }
413 if (!ground) {
414 r = get_interp();
415 if (!r) return r;
416 sort_ref_vector sorts(m());
417 expr_ref_vector vars(m());
418 svector<symbol> var_names;
419 var_subst sub(m(), false);
420 for (unsigned i = 0; i < m_arity; ++i) {
421 var_names.push_back(symbol(i));
422 sorts.push_back(domain.get(i));
423 vars.push_back(m().mk_var(m_arity - i - 1, sorts.back()));
424 }
425 r = sub(r, vars);
426 r = m().mk_lambda(sorts.size(), sorts.data(), var_names.data(), r);
427 return r;
428 }
429
430 expr_ref_vector args(m());
431 array_util autil(m());
432 sort_ref A(autil.mk_array_sort(domain.size(), domain.data(), m_else->get_sort()), m());
433 r = autil.mk_const_array(A, m_else);
434 for (func_entry * curr : m_entries) {
435 expr * res = curr->get_result();
436
437 if (m_else == res) {
438 continue;
439 }
440 args.reset();
441 args.push_back(r);
442 for (unsigned i = 0; i < m_arity; ++i) {
443 args.push_back(curr->get_arg(i));
444 }
445 args.push_back(res);
446 r = autil.mk_store(args);
447 }
448 return r;
449}
450
451
452expr * func_interp::get_interp() const {

Callers

nothing calls this directly

Calls 15

is_groundFunction · 0.85
mk_lambdaMethod · 0.80
mk_const_arrayMethod · 0.80
getMethod · 0.65
sizeMethod · 0.65
resetMethod · 0.65
symbolClass · 0.50
subFunction · 0.50
push_backMethod · 0.45
get_resultMethod · 0.45
get_argMethod · 0.45
mk_varMethod · 0.45

Tested by

no test coverage detected