Conservative nonnegativity tactic for the symmetric model #
This file provides the opt-in tactic sym_nonneg for recurring LDT goals of
shape 0 ≤ ... involving positive effects, tensor placements, and
expectation values in a symmetric model S : SymModel 𝔓 K: the counterpart of
MIPRE/Background/LIDT/MIPStarRE/LDT/Tactic/QuantumNonneg.lean in the port of
planning/c6b-plan.md (milestone M0, section "Port conventions"). The tactic intentionally
does not register any global @[positivity] extensions: callers must import this module
and invoke the tactic at the proof sites where they want the controlled automation.
The vendored tactic is called quantum_nonneg, and the port's macro has a name of its own as a
precaution. No file of M0 imports the vendored syntax (only the vendored
LDT/Preliminaries/Defs.lean imports it), but 228 of the 312 vendored LDT modules have it in
their import closure (every vendored module from Preliminaries/Defs.lean on); a later stage
that imports one of them for its classical content would see two quantum_nonneg syntaxes, the
vendored one calling the matrix lemmas, and every call would be an ambiguous parse. The macro
is the vendored one with each lemma replaced by its fully qualified MIPRE.LIDT.Co counterpart (the placement lemmas of Co/Basic/QuantumState.lean, the
submeasurement lemmas of Co/Basic/SubMeasurementCore.lean), plus one fallback, map_nonneg,
for a positive operator pushed along an order-preserving map other than the two placements
(a SubMeas.map along any ⋆-homomorphism, for instance).
The search is deliberately shallow. It tries the local wrappers used throughout
the LDT quantum layer, decomposes finite sums and nonnegative scalar multiples,
and leaves scalar side goals to positivity/nlinarith. Since S.opTensor A B is the
abbreviation S.L A * S.R B, a product S.L A * S.R B needs no rewrite before the tactic
(the vendored callers rewrite with leftTensor_mul_rightTensor_eq_opTensor first; doing so
here is harmless).
Not ported #
The vendored file declares no theorem or definition, only the syntax node quantumNonneg of
quantum_nonneg; its counterpart is the syntax node symNonneg of sym_nonneg, renamed so
that a port file may import vendored modules that have the vendored syntax in their closure
(above). The vendored example is translated below, with the call sites listed there.
sym_nonneg proves small, canonical nonnegativity goals in the LDT quantum
layer of the symmetric model.
It is meant for goals built from:
- positive expectation lemmas (
VecState.ev_adjoint_self_nonneg,VecState.ev_nonneg_of_psd), - tensor positivity (
SymModel.opTensor_nonneg,SymModel.leftTensor_nonneg,SymModel.rightTensor_nonneg, andmap_nonnegfor any other order-preserving map), - Hermitian sandwich positivity (
IsSelfAdjoint.conjugate_nonneg), - finite sums and nonnegative scalar multiples, and
- scalar leaves discharged by
positivity/nlinarith.
This is a conservative tactic macro rather than global automation; it should be used explicitly at representative proof sites and extended only after measuring performance on the affected files.
Equations
- symNonneg = Lean.ParserDescr.node `symNonneg 1024 (Lean.ParserDescr.nonReservedSymbol "sym_nonneg" false)