3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-08-14 09:45:36 +00:00
z3/src/smt
Nikolaj Bjorner 6c8a5cd853 fix HO-matcher imitation curry-order and instance-assembly ordering bugs
The higher-order matcher produced ill-typed instantiations that aborted
the solve (sort-mismatch / unbound-variable exceptions), making
smt.ho_matching=true net-negative on the TPTP THF benchmarks.

Two root causes:

1. Imitation rule (ho_matcher.cpp): the select chain 'pats' is collected
   outermost-first, i.e. in reverse application order. The imitating
   lambda must curry arguments in application order (first-applied select
   binds the outermost lambda). Reversing 'pats' before building the
   domain/argument/body vectors and the lambda-wrapping loop makes the
   constructed lambda's sort agree with the flex head variable. Fixes
   unit-test ho_matcher test6c/test6d (previously asserted at
   add_binding: v->get_sort() == t->get_sort()).

2. Instance assembly (smt_quantifier.cpp on_ho_match): the fixpoint
   binding substitution used var_subst with the default std_order=true
   while the binding vector is directly indexed (binding[k] = value for
   var k). This resolved chained HO variable references against the wrong
   slots and built ill-sorted terms (assertion at rewriter_def.h:52).
   Use direct (std_order=false) substitution to match the binding layout.

Also adds defensive guards as belt-and-suspenders: subst_sorts_match
skips sort-inconsistent substitutions, an is_ground check skips bindings
with leftover de Bruijn variables, and on_ho_match catches z3_exception
to skip an unusable heuristic instance rather than aborting the solve
(re-raising only on cancellation/resource-limit).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-06 17:14:40 -07:00
..
proto_model Remove copies (#8583) 2026-02-18 21:02:22 -08:00
tactic Parallel tactic (#9824) (#9825) 2026-06-26 10:36:15 -06:00
arith_eq_adapter.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
arith_eq_adapter.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
arith_eq_solver.cpp Fix static analysis issues: null dereferences, unsafe casts, branch clones, uninitialized members (#9424) 2026-04-29 13:37:11 -07:00
arith_eq_solver.h Remove redundant non-virtual destructors with = default (#8462) 2026-02-18 20:58:01 -08:00
CMakeLists.txt remove lattice component 2026-02-19 15:49:45 -08:00
database.h
database.smt
diff_logic.h
dyn_ack.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
dyn_ack.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
expr_context_simplifier.cpp Fix static analysis issues: null dereferences, unsafe casts, branch clones, uninitialized members (#9424) 2026-04-29 13:37:11 -07:00
expr_context_simplifier.h
fingerprints.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
fingerprints.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
mam.cpp Update used_enodes properly (#9695) 2026-06-03 13:36:37 -07:00
mam.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
old_interval.cpp
old_interval.h
qi_queue.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
qi_queue.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
seq_axioms.cpp
seq_axioms.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
seq_eq_solver.cpp tweaks to string solver 2026-06-28 17:16:52 -07:00
seq_ne_solver.cpp
seq_offset_eq.cpp
seq_offset_eq.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
seq_regex.cpp Porting seq_split to master (#9840) 2026-06-30 10:18:28 -07:00
seq_regex.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt2_extra_cmds.cpp
smt2_extra_cmds.h
smt_almost_cg_table.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_almost_cg_table.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_arith_value.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_arith_value.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_b_justification.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_bool_var_data.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_case_split_queue.cpp Update generation number of already-internalized enodes (#9628) 2026-05-26 15:08:11 -07:00
smt_case_split_queue.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_cg_table.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_cg_table.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_checker.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_checker.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_clause.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_clause.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_clause_proof.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_clause_proof.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_conflict_resolution.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_conflict_resolution.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_consequences.cpp fix crash 2026-02-18 21:02:17 -08:00
smt_context.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_context.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_context_inv.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_context_pp.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_context_stat.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_enode.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_enode.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_eq_justification.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_failure.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_farkas_util.cpp
smt_farkas_util.h
smt_for_each_relevant_expr.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_for_each_relevant_expr.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_implied_equalities.cpp
smt_implied_equalities.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_induction.cpp.disabled
smt_induction.h.disabled
smt_internalizer.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_justification.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_justification.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_kernel.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_kernel.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_literal.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_literal.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_lookahead.cpp
smt_lookahead.h
smt_model_checker.cpp fix #10039 and #10032 2026-07-04 12:43:08 -07:00
smt_model_checker.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_model_finder.cpp smt: instrument ho-matching and ho-var term-enumeration statistics 2026-07-06 17:14:39 -07:00
smt_model_finder.h smt: instrument ho-matching and ho-var term-enumeration statistics 2026-07-06 17:14:39 -07:00
smt_model_generator.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_model_generator.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_parallel.cpp [snapshot-regression-fix] smt_parallel: report unknown on theory-incomplete cubes instead of hanging (#9999) 2026-06-29 06:55:24 -07:00
smt_parallel.h [snapshot-regression-fix] smt_parallel: report unknown on theory-incomplete cubes instead of hanging (#9999) 2026-06-29 06:55:24 -07:00
smt_quantifier.cpp fix HO-matcher imitation curry-order and instance-assembly ordering bugs 2026-07-06 17:14:40 -07:00
smt_quantifier.h smt: instrument ho-matching and ho-var term-enumeration statistics 2026-07-06 17:14:39 -07:00
smt_quantifier_instances.h
smt_quick_checker.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_quick_checker.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_relevancy.cpp smt: skip m_watches probe for unwatched literals in relevancy propagator (#10035) 2026-07-03 09:53:04 -07:00
smt_relevancy.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_setup.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_setup.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_solver.cpp Parallel tactic (#9824) (#9825) 2026-06-26 10:36:15 -06:00
smt_solver.h
smt_statistics.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_statistics.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_theory.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_theory.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_types.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
smt_value_sort.cpp
smt_value_sort.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
spanning_tree.h
spanning_tree_base.h
spanning_tree_def.h
theory_arith.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_arith.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_arith_aux.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_arith_core.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_arith_def.h
theory_arith_eq.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_arith_int.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_arith_inv.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_arith_nl.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_arith_pp.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_array.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_array.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_array_base.cpp handle lambda equalities 2026-07-05 12:52:01 -07:00
theory_array_base.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_array_full.cpp handle lambda equalities 2026-07-05 12:52:01 -07:00
theory_array_full.h handle lambda equalities 2026-07-05 12:52:01 -07:00
theory_bv.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_bv.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_char.cpp
theory_char.h
theory_datatype.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_datatype.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_dense_diff_logic.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_dense_diff_logic.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_dense_diff_logic_def.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_diff_logic.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_diff_logic.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_diff_logic_def.h prepare for enodes over lambdas 2026-06-01 13:00:35 -07:00
theory_dl.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_dl.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_dummy.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_dummy.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_finite_set.cpp fix build warnings 2026-06-22 18:20:23 -07:00
theory_finite_set.h use expr based access to enodes to allow for storing first-class lambas 2026-05-30 15:13:08 -07:00
theory_finite_set_size.cpp build warnings 2026-05-29 10:17:46 -07:00
theory_finite_set_size.h
theory_fpa.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_fpa.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_intblast.cpp use expr based access to enodes to allow for storing first-class lambas 2026-05-30 15:13:08 -07:00
theory_intblast.h Fix intblast ubv_to_int bug: add bv2int axioms for compound expressions 2026-02-25 00:46:13 +00:00
theory_lra.cpp Lcube (#9858) 2026-06-14 16:25:21 -07:00
theory_lra.h use expr based access to enodes to allow for storing first-class lambas 2026-05-30 15:13:08 -07:00
theory_opt.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_opt.h
theory_pb.cpp prepare for enodes over lambdas 2026-06-01 13:00:35 -07:00
theory_pb.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_polymorphism.h Fix TPTP polymorphism crashes in final-check and model checking 2026-07-03 20:32:04 -07:00
theory_recfun.cpp use expr based access to enodes to allow for storing first-class lambas 2026-05-30 15:13:08 -07:00
theory_recfun.h use expr based access to enodes to allow for storing first-class lambas 2026-05-30 15:13:08 -07:00
theory_seq.cpp use expr based access to enodes to allow for storing first-class lambas 2026-05-30 15:13:08 -07:00
theory_seq.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_seq_empty.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_sls.cpp
theory_sls.h Eliminate unused private fields and local variables. (#9875) 2026-06-16 14:55:18 +01:00
theory_special_relations.cpp use expr based access to enodes to allow for storing first-class lambas 2026-05-30 15:13:08 -07:00
theory_special_relations.h
theory_user_propagator.cpp
theory_user_propagator.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_utvpi.cpp
theory_utvpi.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_utvpi_def.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_wmaxsat.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
theory_wmaxsat.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
uses_theory.cpp
uses_theory.h
watch_list.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
watch_list.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00