This PR adds `reprove N by T`, which effectively elaborates `example type_of% N := by T`. It supports multiple identifiers. This is useful for testing tactics. 🤖 Generated with [Claude Code](https://claude.ai/code) --------- Co-authored-by: Claude <noreply@anthropic.com>
109 lines
2.1 KiB
Text
109 lines
2.1 KiB
Text
import Lean.Util.Reprove
|
||
|
||
-- Test successful reprove
|
||
theorem simpleTheorem : 1 + 1 = 2 := rfl
|
||
|
||
reprove simpleTheorem by rfl
|
||
|
||
theorem withTactics : ∀ n : Nat, n + 0 = n := by
|
||
intro n
|
||
rw [Nat.add_zero]
|
||
|
||
reprove withTactics by
|
||
intro n
|
||
simp
|
||
|
||
reprove List.append_nil by
|
||
intro l
|
||
simp
|
||
|
||
-- Test failed reprove - wrong tactic
|
||
/--
|
||
warning: declaration uses 'sorry'
|
||
-/
|
||
#guard_msgs in
|
||
reprove simpleTheorem by
|
||
sorry
|
||
|
||
-- Test failed reprove - incomplete proof
|
||
/-- error: (kernel) declaration has metavariables 'reprove_example✝' -/
|
||
#guard_msgs in
|
||
reprove withTactics by
|
||
intro n
|
||
|
||
-- Test unknown declaration
|
||
/--
|
||
error: Unknown constant `nonExistentTheorem`
|
||
-/
|
||
#guard_msgs in
|
||
reprove nonExistentTheorem by
|
||
simp
|
||
|
||
-- Test with a non-propositional type (creates example that succeeds)
|
||
def natValue : Nat := 42
|
||
|
||
reprove natValue by
|
||
exact 42
|
||
|
||
-- Test with wrong proof
|
||
/--
|
||
error: Type mismatch
|
||
"hello"
|
||
has type
|
||
String
|
||
but is expected to have type
|
||
Nat
|
||
-/
|
||
#guard_msgs in
|
||
reprove natValue by
|
||
exact "hello"
|
||
|
||
-- Test complex type with implicit arguments
|
||
theorem hasImplicits {α : Type} (xs : List α) : xs.length ≥ 0 := by simp
|
||
|
||
reprove hasImplicits by simp
|
||
|
||
-- Test multiple declarations in one command
|
||
theorem theorem1 : 2 + 2 = 4 := by simp
|
||
theorem theorem2 : 3 + 3 = 6 := by simp
|
||
theorem theorem3 : 4 + 4 = 8 := by simp
|
||
|
||
reprove theorem1 theorem2 theorem3 by simp
|
||
|
||
-- Test namespace functionality
|
||
namespace Test
|
||
|
||
theorem namespaceTheorem : 5 + 5 = 10 := by simp
|
||
|
||
end Test
|
||
|
||
open Test
|
||
|
||
reprove namespaceTheorem by simp
|
||
|
||
-- Test multiple declarations where one fails due to unknown name
|
||
/--
|
||
error: Unknown constant `unknownTheorem`
|
||
-/
|
||
#guard_msgs in
|
||
reprove
|
||
theorem1
|
||
unknownTheorem
|
||
theorem2
|
||
by simp
|
||
|
||
-- Test multiple declarations where tactic fails for one
|
||
theorem needsIntro : ∀ n : Nat, n = n := fun _ => rfl
|
||
theorem simpleEq : 1 = 1 := rfl
|
||
|
||
/--
|
||
error: Tactic `rfl` failed: Expected the goal to be a binary relation
|
||
|
||
Hint: Reflexivity tactics can only be used on goals of the form `x ~ x` or `R x x`
|
||
|
||
⊢ ∀ (n : Nat), n = n
|
||
-/
|
||
#guard_msgs in
|
||
reprove simpleEq needsIntro simpleTheorem by rfl
|
||
|
||
reprove Array.attach_empty by grind
|