The guard checker now recognizes uniform parameters of a fixpoint and treats their instances as constant over the recursive call


A mechanism to add user-defined rewrite rules to Coq's reduction mechanisms; see chapter :ref:`rewrite_rules`


Warnings `future-coercion-class-constructor` and `future-coercion-class-field` about `:>` in :cmd:`Class` as errors by default; replace `:>` with `::` for typeclass instances


Mutually-proved theorems with statements in different coinductive types now supported


:cmd:`CoFixpoint` supports attributes `bypass_guard`, `clearbody`, `deprecated`, and `warn`


`Program Fixpoint` with `measure` or `wf` now supports `where` clauses, `local`/`clearbody` attributes, and non-atomic conclusions


Anomaly on the absence of remaining obligations of some name is now an error


Universe polymorphic `Program` obligations are now only generalized over effectively occurring universe variables


Anomaly `assertion failed` in pattern-matching compilation with :flag:`Program Mode`


Support for `Program`-style pattern-matching on more than one argument in an inductive family


Anomaly with obligations in the binders of a `measure`- or `wf`-based `Program Fixpoint`


Incorrect registration of universe names attached to a primitive polymorphic constant


An :g:`only printing` interpretation of a notation with a specific format no longer changes printing rules of other interpretations


Levels of :cmd:`Reserved Notation` now default to levels of previous notations with longest common prefix


:warn:`closed-notation-not-level-0` and :warn:`postfix-notation-not-level-1` warnings for unusual levels


:warn:`notation-incompatible-prefix` warning when two notation definitions have incompatible prefixes


Notations for applied constants with multiple signatures of implicit arguments now correctly insert maximal implicit arguments


Support printing notations applied to extra arguments in custom entries, removing an anomaly


:g:`Z.to_euclidean_division_equations` can now do better reasoning when noticing two equations of the form x = y*q1 + … and x = y*q2 + …


The opacity/transparency of primitive projections is now attached to the projections themselves, not the compatibility constants


Tactic :g:`intro z` on an existential variable goal now defines ?P in a context where the variable is named z


Syntactic global references in `using` clauses of :tacn:`auto`-like tactics are now plain references rather than interpreted terms


Use Coqlib's :cmd:`Register` for generalized rewriting tactic, making (C)RelationClasses/(C)Morphisms independent of the `rewrite` tactic


The `clear` modifier, deprecated since 8.17


The `cutrewrite` tactic, deprecated since Coq 8.5


Non-reference hints in `using` clauses of :tacn:`auto`-like tactics


:g:`Z.to_euclidean_division_equations` can now pose equations of the form x = y*q using :g:`Z.divide`


Support for :g:`Nat.double` and :g:`Nat.div2` in :g:`zify` and :g:`lia`


:tacn:`replace` now accepts `->` / `<-` for direction of replacement


:tacn:`simpl` systematically reuses the cofixpoint’s name if globally defined


Reduction of primitive projections of cofixpoints by :tacn:`simpl`


Refolding of reduced global mutual fixpoints/cofixpoints with parameters in :tacn:`cbn`


:tacn:`cbn` left unnamable constants when refolding mutual fixpoints/cofixpoints from aliased modules


:tacn:`cbv` of primitive projections applied to a tuple now ignores `beta`


:tacn:`rewrite_strat` now supports fixpoint operator in `@rewstrategy`


:tacn:`rewrite_strat` now works inside module functors


Recursive let and nonmutable projections of syntactic values are considered syntactic


Ltac2 notations are typechecked at declaration time by default


Argument order for `List.fold_left2` / `List.fold_right2` changed to match OCaml


`Import`ing a module with a mutable Ltac2 definition does not undo its mutations


The `using` clause argument of :tacn:`auto`-like tactics in Ltac2 now takes a global `reference`


`of_intro_pattern` and `to_intro_pattern` in `Ltac2.Ltac1`


Basic APIs in `Ltac2.Ltac1` for more informative errors on value conversion


APIs `Ltac2.Control.unshelve` and `Ltac2.Notations.unshelve`


`intropattern` and `intropatterns` notation scopes support views


Open recursion combinators in `Ltac2.Constr.Unsafe`


APIs in `Ltac2.Constr.Pretype.Flags` to customize pretyping flags


:attr:`abstract` attribute for `Ltac2 Type`


APIs in `Ltac2.Message` to interact with the boxing system of the pretty printer


Flag `Automatic Proposition Inductives`, :flag:`Dependent Proposition Eliminators`, and warning `automatic-prop-lowering`


`Ltac2.Control.new_goal` removes the new goal from the shelf/future goals


ssreflect no longer relies on the recovery mechanism of the parsing engine


Notations `_.1` and `_.2` are now defined in the prelude at level 1 rather than in `ssrfun` at level 2


The :tacn:`have` tactic generates a proof term with an opaque constant, as in Coq ≤ 8.16


The `fun_scope` notation scope declared in `ssrfun.v` is deprecated; use `function_scope` instead


Handling of primitive projections in ssrewrite


Default reversibility status of most coercions is now truly “non-reversible except record :>` fields”


Focus commands (e.g. `1:{`) and goal selection (e.g. `1: Check`) don’t need Classic (Ltac1) proof mode


Inductives declared with `: Type` or no annotation and auto-lowered to `Prop` are not declared template polymorphic


Warning about use of `Let`, `Variable`, `Hypothesis`, and `Context` outside sections is now an error by default


The "fragile-hint-constr" warning is now an error by default


:cmd:`Scheme` automatically registers the resulting schemes in the :cmd:`Register Scheme` database


:cmd:`Typeclasses Transparent` / `Opaque` default locality outside sections is now `export`


The :cmd:`Cd` command.  Use the command line option `-output-directory` or :opt:`Extraction Output Directory`


:attr:`warn` attribute, generalizing the deprecation machinery to other forms of comments


:cmd:`Register Scheme` to add entries to the scheme database


`Print @reference` shows implicit arguments directly on the type


`@import_categories` supports category `options`


`About`/`Print` now indicate if a name is a projection


:cmd:`Hint Projections` sets transparency flags for projections in specified hint DBs


:cmd:`Search` now has `is:Fixpoint` and `is:CoFixpoint`


:cmd:`Include` can now include module types with `with` clauses


Missing implicit args after a `->` in `Print`/`About`


:flag:`Cumulativity Weak Constraints` can unify universes to `Set` with :flag:`Universe Minimization ToSet`


`Search` with `is:Scheme` was searching for inductives with schemes, not the schemes themselves


`Search` now searches in included module types


`Eval` / `Definition := Eval` work without loading the Ltac plugin


:cmd:`Scheme` declares non-recursive schemes for `@scheme_type`


:flag:`Cumulativity Weak Constraints` had its meaning flipped since 8.12


SIGINT now produces “user interrupt” instead of aborting, for better messages


`-output-directory dir` sets default output dir for extraction, :cmd:`Redirect`, :cmd:`Print Universes`


coqdoc links to section variables introduced with `Context`


Find/replace UI improved: margins, icons for found/not found


Default key binding modifier for Navigation menu is now Alt (non-macOS). Undo changed to Ctrl-Z, Next/Previous tab to Ctrl-PgUp/PgDn


Changing modifiers for View menu only applies to toggle items; View/Show Proof changed to Shift-F2


Edit/Select All and Navigation/Fully Check menu items


Opening a file via drag and drop now works correctly


Incorrect highlight/line numbers for errors/warnings with Unicode; XML protocol updated


Renamed “push” lemmas for List.length to consistent naming: e.g. `app_length`→`length_app`


`Coq.CRelationClasses.arrow`, `iffT`, `flip` are now Typeclasses Opaque


`Coq.NArith.Ndigits`, `Coq.NArith.Ndist`, `Coq.Strings.ByteVector` (deprecated since 8.19)


`Coq.Numbers.NatInt.NZProperties`; use `NZMulOrder` instead


A warning on `Vector.t` to caution new users about complexity vs bundling lists


Lemmas `NoDup_app`, `NoDup_iff_ForallOrdPairs`, `NoDup_map_NoDup_ForallPairs`, `NoDup_concat`


Lemmas around nth_error in `List`: `In_iff_nth_error`, `nth_error_app`, `nth_error_cons_0`, …


Various `N`/`Nat` lemmas: `strong_induction_le`, `binary_induction`, `even_even`, `odd_even`, …


`Z.euclidean_division_equations_cleanup` reordering for improved performance


Minimal Dune version to build Coq is now 3.6.1


Support for `.vio` files and `.vio2vo` transformation removed; `.vos` is the recommended method


`coq-doc` opam/Dune package for building and installing Coq’s documentation


Coq is now compatible with `memprof-limits` interruption


Ability to exit `Drop.` in Coq toplevel with `Ctrl+D`, plus `#go` directive


Extension for OCaml extraction: foreign function calls to C and ML function exposition


Self-referencing extraction of primitive projections in functors


:ref:`sort-polymorphism` to share constructs over `Type`, `Prop`, `SProp`


Primitives incorrectly convertible to anything by module subtyping


:token:`term_forall_or_fun`, :token:`term_let`, :token:`term_fix`, etc. from level 200 → level 10, removing parser recovery hacks


:g:`(id := body)` in :cmd:`Context` outside a section in a :cmd:`Module Type` no longer tries to declare a class instance


Anomaly with duplicate variables within a disjunctive pattern


Printing of constructors and `in` clause of `match` respects :flag:`Printing Implicit` and :flag:`Printing All`


Wrong shift of argument names with :cmd:`Arguments` in nested sections


More informative message when a notation cannot be interpreted as a reference


In casts `term : t`, if `t` is bound to scope `t_scope`, `term` is also interpreted in `t_scope`


Notation `term%_scope` to set a scope only temporarily


The ability to declare scopes whose name starts with `_`


The `term%scope` syntax in :cmd:`Arguments`


Quoted strings can be used as tokens in notations; double quotes can be used in symbols


Parsing support for recursive binders in `let` or `match`


Declaring the same level of a notation variable more than once is now an error


Various custom binder fixes in nonrecursive/recursive notations


Invalid eta-expansion in notation pretty-printer


:flag:`Printing Parentheses` works on a right-open notation with explicit level


Anomaly with nested repeated binder variables


Anomaly on disabling a non-existent custom notation


Proper error instead of anomaly with pattern-matching over a constructor with too many arguments


Support constructors with parameters in number/string notations for patterns


Chains of entry coercions sometimes printed in the wrong order


`open_constr` in Ltac1/Ltac2 does not perform evar normalization


:tacn:`abstract` now supports existential variables


Instances declared with :flag:`Typeclasses Unique Instances` do not allow backtracking even with evars in the goal


In :tacn:`rewrite_strat`, the syntax for `choice` strategy changed slightly


:tacn:`replace` with `by tac` no longer tries to solve the equality subgoal with existing hypotheses


`Z.euclidean_division_equations_cleanup` now breaks up `0 <= _ < _` hypotheses


:tacn:`simpl` now refolds a partial application of a fixpoint even when partially applied


Ltac2 tactic `Std.resolve_tc` to resolve typeclass evars


`lazy`, `simpl`, `cbn`, `cbv`, and `eval` can do head reduction with `head`


Opaque primitive projections are handled properly by “Evarconv”


Duplications with `Hint Cut` and `Hint Mode`


`zify` / `Z.euclidean_division_equations_cleanup` no longer instantiates dependent hypotheses in an order-sensitive manner


:tacn:`simpl` now works on reducible named mutual fixpoints with parameters


:tacn:`congruence` / :tacn:`f_equal` handle polymorphic universe variables


Only run zify saturation on existing goal hypotheses


`cbv` reify substitution for Case stack node


Anomaly in :tacn:`simpl` on partially applied named mutual fixpoints


:tacn:`simpl` tries to reduce named mutual fixpoints even when returning a function


“r <num>” and “r <string>” commands in coqtop Ltac debugger


`Array.empty`, `Message.Format.stop`, `Pattern.empty_context` are no longer thunked


Ltac2 `exact` / `eexact` elaborate with expected type


Argument order for `List.fold_left` / `List.fold_right` / `Array.fold_right` changed to match OCaml


`Ltac2.Std.red_flags` has a field `rStrength` for head-only reduction


Ltac2 supports pattern quotations when building `pattern` values (dynamic patterns)


New modules `Ltac2.Unification`, `Ltac2.TransparentState`


New stdlib modules `Ltac2.Ref`, `Ltac2.Lazy`, `Ltac2.RedFlags` + expansions


:cmd:`Ltac2 Globalize` and :cmd:`Ltac2 Check`


A new flag :flag:`Ltac2 In Ltac1 Profiling`


`Ltac2.Message.Format.ikfprintf` for conditional printing


Ltac2 mutable references are not considered values anymore


`Let` with `Qed` now produces an opaque side definition; use `Defined` + `clearbody` to replicate old behavior


Automatic lowering of record types to `Prop` matches the behavior for inductives


:opt:`Extraction Output Directory` option


`-profile` cmd-line argument and `PROFILE` var in `coq_makefile` for a new :ref:`profiling` system


:cmd:`Instructions` command to count CPU instructions on Linux


Support for instruction counts with `-profile`


New command :cmd:`Attributes` to assign attributes like :attr:`deprecated` to a library file


Anomaly with :cmd:`Search` in the context of a goal


Printer for :cmd:`Guarded` with existential variables


`coqdep -w` can adjust warnings like `coqc -w`


Delayed variable expansion with `coq_makefile` for combined `.vo` and `.glob` targets on GNU Make >=4.4


Spurious `coqdep` warnings from missing path normalization


Reimplemented `Ncring_tac` reification in Ltac for :tacn:`nsatz`, `cring`


:g:`ZArith.Zdigits` in favor of :g:`Z.testbit`


Several long-deprecated files in `Arith` (Div2, Even, Gt, etc.)


Lemmas about `Maps` in `FMapInterface`, e.g. `cardinal_Add_In`


`unfold_nth_error`, `nth_error_nil`, `nth_error_cons`, etc.


`Rle`, `Rge`, `Rlt`, `Rgt` as reflexive/symmetric/transitive/antisymmetric instances


In the error message about extracting sort-polymorphic singletons, do not specifically refer to OCaml


Incorrect abstraction of sort variables for opaque constants, leading to inconsistency


Memory corruption with :tacn:`vm_compute` (rare but more likely with OCaml 5.1)


:warn:`Found no matching notation to enable or disable` is now a warning not an error


Undeclared universe with multiple uses of :tacn:`abstract`


Incorrect printing of constructors with multiple arguments; over-parenthesizing


Missing `conf-` dependencies for `coq-core` and `coq` opam packages


Avoid symlinks in git that caused build failures on some Windows


Regression from 8.18 for a defined field in a primitive `Record`


Printer sometimes failing to use a prefix/infix custom notation from a different custom entry


:tacn:`abstract` failing if there are admitted goals around


Anomalies with VsCoq due to incorrect state handling


Anomaly using :cmd:`Include` on a module with a `Primitive Projections` record


Anomaly from :cmd:`Fixpoint` with no arguments


Position error/warning tooltips with multibyte UTF-8


Compatibility with OCaml versions where `effect` is a keyword


Coq is now compatible with `memprof-limits`


The `bad-relevance` warning is now an error by default


The kernel now checks that private inductive types can’t be eliminated outside their module


A bug in :tacn:`native_compute` for arbitrary float values


Universe unification can now delay a sort’s definition to allow less `Prop`/`SProp` annotation


Pattern-matching over a primitive record avoids overhead for matches that are just a projection


Volatile casts `@term :> @type` to display hidden subterms in matches


Printing uninterpreted terms (e.g. `Print Ltac`) now preserves custom term extensions


Locality attributes for the single “field” of definitional typeclasses


A hook in the coercion mechanism for external metalanguages


Universe constraint inference in module subtyping can trigger constant unfoldings


The `'[='` keyword. Replace with `'[' and '='


Support :flag:`Printing Parentheses` in custom notations


Improved printing of reverse coercions with `reverse_coercion`


Recursive pattern as a sequence in binder position no longer anomalies


Improved printing of notations with anonymous binders


Anomaly with notations abbreviating a local var or record field


Ensure “only parsing” actually declares a parsing rule


In `Number Notation`, “abstract after N” is applied if number > N, not ≥


:tacn:`specialize` with a `with` clause that depends on a variable in the type fails instead of silently shelving


Term-level extensions like `ltac:()` are errors in term patterns


:tacn:`case` always produces as many goals as constructors now


:tacn:`injection` continues with sigma types if no equality scheme found


The unification heuristics for :tacn:`case` changed; prefer :tacn:`destruct`


No-argument form of :tacn:`instantiate`, deprecated since 8.16


Undocumented `hresolve_core` and `hget_evar`


`revert dependent`, an alias for :tacn:`generalize dependent`


:tacn:`simpl` respects `simpl never` even under additional definitions


Unification less sensitive to subterm indirections


:tacn:`setoid_rewrite` no longer produces untypable states


Intropatterns destructing a product can’t silently create shelved evars


:tacn:`field_simplify` no longer introduces side-conditions when working on a hypothesis


:tacn:`tauto` variants match types up to universe unification


Finite sets/maps for identifier, string, int, constant, inductive, constructor keys


:flag:`Ltac Profiling` also covers Ltac2, plus new `start_profiling`, `stop_profiling`, `show_profile`


Build/compare values in `Ltac2.Init.cast`


`ltac2val:(ltac2 tactic)` quotations in Ltac1 produce Ltac1 values


Nested notations with term-antiquotations


Parsing level of `by` clause in `assert`


`multi_match!` etc. now preserve exceptions from backtracking after a branch has succeeded


Tactic-options commands now support :attr:`export`


`Hint` and :cmd:`Instance` with no locality attribute is now an error


Transparent obligations from Program do not produce an implicit :cmd:`Hint Unfold`


:cmd:`Print Typeclasses` replaces `Print TypeClasses`


`-async-proofs-tac-j=0` means no new processes for `par`


`:>` in typeclass fields is replaced by `::`


Improved description of :cmd:`Proof using`


`::` syntax for fields in records as typeclass instances


:cmd:`Print Grammar` for arbitrary nonterminals


:flag:`Fast Name Printing` no longer captures variable names


:tacn:`vm_compute` respects the `bytecode-compiler`


Anomaly in :cmd:`Function` with an applied `fix`


`coq_makefile` no longer passes `-rectypes` to OCaml by default


`coqdoc` no longer indexes variable binders by default


`coqdoc` can link all references (type + elimination + …) to the same definition


Command line `-require lib` and `-require-from root lib`


`coqtimelog2html` to render timing files produced with `-time`


`coq_makefile` large “install” commands replaced by smaller ones


XML protocol now sends line+column for locations


:g:`Vector.nth` re-implemented to compute strict subterms


:g:`set_diff_nodup` no longer requires :g:`NoDup l'`


Instances from :g:`DecidableClass` moved to `Bool`, `PeanoNat`, `BinInt`


`btauto.Algebra.bool` hint changed from :attr:`global` to :attr:`export`


Various renames and modifications in `Reals/RIneq.v` (e.g. `completeness_weak`→`upper_bound_thm`)


Deprecated definitions like `Datatypes.prod_curry`, `Bool.leb`, etc.


:g:`List.app_nil_end`, :g:`List.app_assoc_reverse`, :g:`List.ass_app`, :g:`List.app_ass`


:g:`Numbers.Cyclic.Int31.Cyclic31` and variants (since 8.10)


Some lemmas in `Reals/RIneq.v`, e.g. :g:`inser_trans_R`, :g:`IZR_neq`, etc.


Lemmas `olift`, `pred_oapp`, etc. ported from math-comp PR #872/#874


Lemmas around `Permutation`/`List` (Permutation_incl_cons_inv_r, etc.)


Modules `Nat.Div0`/`Nat.Lcm0` and `N.Div0`/`N.Lcm0`


`nth_error_ext`, `map_repeat`, `rev_repeat` in `List.v`; `to_list_nil_iff`, `to_list_inj` in `VectorSpec.v`


Transparent `extgcd` to replace opaque `euclid` in `Znumtheory`


Entirely built with Dune; must use new build instructions


Not compiled with `-rectypes` by default


Makefile “pretty-timed” targets strip absolute prefixes from paths


Default to `-native-compiler no` in Coq’s configure


Coq now supports OCaml 5, though `native_compute` is unavailable


Module names added to loadpath in alphabetical order, not directory order


:tacn:`vm_compute` inconsistency by removing a vulnerable cache


Unexpected anomaly in fixpoint termination with inaccessible branches


The “Unused variable ‘ident’ might be a misspelled constructor” warning triggers even if the variable matches a single case


Pattern-matching clauses lost for a constructor from a singleton inductive under implicit coercions


Possible anomaly with `term.(proj)` if projection is from a section


New lexical rule: if multiple tokens match the same characters, the longest matching token that does not cut inside a contiguous letter group is used


`Enable Notation` / `Disable Notation` to toggle previously defined notations


Multiple scopes in :cmd:`Arguments`, e.g. `Arguments foo _%scope _%other`


:attr:`add_top` / :attr:`add_bottom` for `Bind Scope` to attach multiple scopes


Documented grammar is now correct for the tactics chapter


:tacn:`eauto` respects `Extern` hint priorities


:tacn:`auto` is more consistent with :tacn:`simple apply` and :tacn:`exact`


`absurd_hyp` tactic (use :tacn:`contradict`)


Default `intuition_solver` uses `auto with *`, now warns with `intuition-auto-with-star`


:tacn:`auto` updates local hypotheses after a hint is applied


:tacn:`destruct ... using ...` is now more aligned with :tacn:`destruct ...`


Typeclass inference sometimes lost holes


`Ltac ::= ...` redefinitions now respect :attr:`local`


In :tacn:`match goal`, “hyp := body : typ” is sugar only for a default cast


`Ltac2.Bool` notations moved into `Ltac2.Bool.BoolNotations`


`Constr.in_context` enforces the “constr is a type” requirement


Goal matching functions in `Ltac2.Pattern` changed type


Deep pattern matching with `match x with` + `as`, records, literal ints


`Message.to_string`, `String.concat`, `String.cat`, `String.equal`, etc.


`Ltac2.Constr.Unsafe.closedn`, `is_closed`, `occur_between`, `occurn`


:cmd:`Print Ltac2`, :cmd:`Print Ltac2 Signatures`, :cmd:`Locate` can find Ltac2 definitions


`Ltac2.Constant.equal` & many `equal` for Constructors, Evars, Floats, etc.


Syntax for Ltac2 record update `{ foo with field := bar }`


Record punning in Ltac2, e.g. `{ foo; M.bar }`


`match! goal` can match hypothesis bodies


`olift`, `pred_oapp`, etc. from math-comp


Commands setting tactic options now support :attr:`export`


No “locality attribute omitted” warnings for `Hint` / `Instance` become errors now


Program transparent obligations no longer produce an implicit `Hint Unfold`


`Print Typeclasses` replaces `Print TypeClasses`


`-async-proofs-tac-j=0` means no new processes for `par`


`:>` syntax for typeclass instance fields replaced by `::`


`::` syntax for typeclass instance fields


:cmd:`Print Grammar` for arbitrary nonterminals


:flag:`Fast Name Printing` no longer captures variable names


Anomaly in :cmd:`Function` with an applied `fix`


`coq_makefile` no longer passes `-rectypes` to OCaml


`coqdoc` no longer indexes variable binders by default


`-require lib` / `-require-from root lib`


`coq_makefile` large “install” commands replaced by smaller ones


`set_diff_nodup` drops second NoDup assumption


`btauto.Algebra.bool` hint is now :attr:`export`


Old definitions like `Datatypes.prod_curry`


`olift` and `pred_oapp`, plus new lemmas from math-comp


`Nat.Div0` / `Nat.Lcm0` / `N.Div0` / `N.Lcm0`


`nth_error_ext`, `map_repeat`, `rev_repeat` in `List.v`; `to_list_nil_iff`, `to_list_inj` in `VectorSpec.v`


`pretty-timed` targets in Makefiles strip absolute path prefixes


OCaml 5 support (still no `native_compute`)


Module names added to loadpath in alphabetical order, not directory order


coqdep emitted incorrect paths for META files, breaking some dune plugin builds


Shadowing of record fields in extracted OCaml code


“backtracking and redoing byextend on …” debug message is now fully off


Major memory regression with typeclass inference in certain cases