lean4-htt/tests/lean/run/partial_fixpoint_prop.lean
Wojciech Rozowski 07c398e441 chore: rename keywords for (co)inductive predicates and the names of their associated (co)induction principles
chore: rename `fixpoint_induct` to `induct` and `coinduct` for (co)inductive predicates
2025-06-23 20:40:08 +02:00

25 lines
1.1 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/--
Tests that `partial_fixpoint` is not picking up the partial order structure on Prop, that is exclusively used for defining (co)inductive predicates. Since `Prop` is inhabitted, `partial_fixpoint` will synthetise a `FlatOrder` instance, but in the provided example, it will not be able to prove that the recursive calls are monotone in their arguments.
-/
-- This works as `` is monotone in its arguments with respect to the (`ImplicationOrder`/`ReverseImplicationOrder` on `Prop`.
def f (x : Nat) : Prop :=
f (x + 1) f ( x + 2)
coinductive_fixpoint
def f' (x : Nat) : Prop :=
f' (x + 1) f' ( x + 2)
inductive_fixpoint
/--
error: Could not prove 'f''' to be monotone in its recursive calls:
Cannot eliminate recursive call `f'' (x + 1)` enclosed in
f'' (x + 1) f'' (x + 2)
Tried to apply 'Lean.Order.implication_order_monotone_or' and 'Lean.Order.coind_monotone_or', but failed.
Possible cause: A missing `Lean.Order.MonoBind` instance.
Use `set_option trace.Elab.Tactic.monotonicity true` to debug.
-/
#guard_msgs in
def f'' (x : Nat) : Prop :=
f'' (x + 1) f'' ( x + 2)
partial_fixpoint