You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
smt: add [smt_inline] operator tag to δ/β-reduce at use sites
Higher-order combinators whose body builds a lambda from their own
parameters (e.g. `right_loop inv o = forall y, cancel (fun x => o x y)
...`) are translated once, polymorphically, into a why3 predicate. The
inner lambdas become polymorphic `unamed_lambda` symbols, forcing why3's
polymorphism encoding (the `uni`/`sort`/`t2tb` bridges). Discharging a
fully-ground goal like `right_loop idfun (^)` then requires the prover to
chain several trigger-less higher-order `@`-apply axioms across that
encoding before it can even case-split — which older SMT solvers fail to
do within the time limit, even though the goal is trivial.
Add a per-operator `[smt_inline]` tag (mirroring `[smt_opaque]`): a
fully-applied tagged operator/predicate is δ/β-reduced into the goal
before translation, so its lambdas are created at the call's concrete
instantiation and stay monomorphic — no `uni`/`t2tb` detour. Unmarked
definitions are translated exactly as before. The tag is threaded through
the parser, parsetree (`pp_tags`), scope, and `op_opaque.inline`, and
consulted by `EcSmt.try_inline`.
Tag the eight `*_loop*` combinators in Logic.ec.
0 commit comments