This PR updates various error messages produced by or associated with built-in tactics and adapts their formatting to current conventions.
218 lines
4.7 KiB
Text
218 lines
4.7 KiB
Text
/-!
|
|
# Error messages for matches with incorrect numbers of patterns
|
|
|
|
https://github.com/leanprover/lean4/issues/7170
|
|
|
|
Error messages for `match` expressions and definitions by pattern matching where an incorrect or
|
|
inconsistent number of patterns are supplied should indicate this issue and should only assert that
|
|
a given number of patterns is "incorrect" (rather than merely "inconsistent") when the number of
|
|
discriminants has been explicitly specified by the user.
|
|
-/
|
|
|
|
inductive Foo
|
|
| foo
|
|
| foo2
|
|
|
|
def correct : Foo → Foo → Prop
|
|
| .foo => fun _ => True
|
|
| .foo2 => fun _ => False
|
|
|
|
/--
|
|
error: Inconsistent number of patterns in match alternatives: This alternative contains 2 patterns:
|
|
.foo2, x
|
|
but a preceding alternative contains 1:
|
|
.foo
|
|
-/
|
|
#guard_msgs in
|
|
def patCountMismatch : Foo → Foo → Prop
|
|
| .foo => fun _ => True
|
|
| .foo2, x => False
|
|
|
|
/--
|
|
error: Cannot define a value of type
|
|
Nat
|
|
by pattern matching because it is not a function type
|
|
-/
|
|
#guard_msgs in
|
|
def badType : Nat
|
|
| 0 => 32
|
|
|
|
/--
|
|
error: Too many patterns in match alternative: At most 2 patterns expected in a definition of type ⏎
|
|
Foo → Foo → Prop
|
|
but found 3:
|
|
f₁, f₂, f₃
|
|
-/
|
|
#guard_msgs in
|
|
def tooMany₁ : Foo → Foo → Prop
|
|
| f₁, f₂, f₃ => True
|
|
|
|
/--
|
|
error: Too many patterns in match alternative: At most 2 patterns expected in a definition of type ⏎
|
|
Foo → Foo → Prop
|
|
but found 3:
|
|
.foo, .foo, f
|
|
-/
|
|
#guard_msgs in
|
|
def tooMany₂ : Foo → Foo → Prop
|
|
| .foo, .foo, f => True
|
|
| .foo, .foo2 => True
|
|
|
|
/--
|
|
error: Inconsistent number of patterns in match alternatives: This alternative contains 3 patterns:
|
|
.foo, .foo, f
|
|
but a preceding alternative contains 2:
|
|
.foo, .foo2
|
|
-/
|
|
#guard_msgs in
|
|
def tooMany₃ : Foo → Foo → Prop
|
|
| .foo, .foo2 => True
|
|
| .foo, .foo, f => True
|
|
|
|
/--
|
|
error: Type mismatch
|
|
True
|
|
has type
|
|
Prop
|
|
but is expected to have type
|
|
Foo → Prop
|
|
-/
|
|
#guard_msgs in
|
|
def tooFew₁ : Foo → Foo → Prop
|
|
| _ => True
|
|
|
|
/--
|
|
error: Inconsistent number of patterns in match alternatives: This alternative contains 2 patterns:
|
|
.foo, .foo2
|
|
but a preceding alternative contains 1:
|
|
.foo
|
|
-/
|
|
#guard_msgs in
|
|
def tooFew₂ : Foo → Foo → Prop
|
|
| .foo => False
|
|
| .foo, .foo2 => True
|
|
|
|
/--
|
|
error: Inconsistent number of patterns in match alternatives: This alternative contains 1 pattern:
|
|
_
|
|
but a preceding alternative contains 2:
|
|
.foo, .foo
|
|
-/
|
|
#guard_msgs in
|
|
def tooFew₃ : Foo → Foo → Prop
|
|
| .foo, .foo => True
|
|
| _ => False
|
|
|
|
/--
|
|
error: Inconsistent number of patterns in match alternatives: This alternative contains 1 pattern:
|
|
_
|
|
but a preceding alternative contains 2:
|
|
.foo, .foo
|
|
-/
|
|
#guard_msgs in
|
|
def tooFewFn : Foo → Foo → Prop
|
|
| .foo, .foo => True
|
|
| _ => fun f => True
|
|
|
|
def TyVal := Nat → String → Nat
|
|
|
|
def withTyValOK : TyVal
|
|
| x, _ => x
|
|
|
|
/--
|
|
error: Too many patterns in match alternative: At most 2 patterns expected in a definition of type ⏎
|
|
TyVal
|
|
but found 3:
|
|
x, y, z
|
|
-/
|
|
#guard_msgs in
|
|
def withTyValTooMany : TyVal
|
|
| x, y, z =>
|
|
let x := 34
|
|
toString x ++ y ++ z
|
|
|
|
/--
|
|
error: Inconsistent number of patterns in match alternatives: This alternative contains 1 pattern:
|
|
_
|
|
but a preceding alternative contains 2:
|
|
Nat.zero, ""
|
|
-/
|
|
#guard_msgs in
|
|
def noType
|
|
| Nat.zero, "" => true
|
|
| _ => false
|
|
|
|
/--
|
|
error: Too many patterns in match alternative: Expected 1, but found 2:
|
|
.foo, .foo
|
|
-/
|
|
#guard_msgs in
|
|
def matchTooMany₁ (f : Foo) : Nat :=
|
|
match f with
|
|
| .foo, .foo => 32
|
|
| _ => 41
|
|
|
|
/--
|
|
error: Too many patterns in match alternative: Expected 1, but found 2:
|
|
.foo2, .foo2
|
|
-/
|
|
#guard_msgs in
|
|
def matchTooMany₂ (f : Foo) : Nat :=
|
|
match f with
|
|
| .foo => 41
|
|
| .foo2, .foo2 => 32
|
|
|
|
/--
|
|
error: Not enough patterns in match alternative: Expected 2, but found 1:
|
|
.foo
|
|
---
|
|
error: Missing cases:
|
|
Foo.foo2, Foo.foo
|
|
-/
|
|
#guard_msgs in
|
|
def matchTooFew₁ (f : Foo) : Nat :=
|
|
match f, f with
|
|
| .foo => 41
|
|
| .foo2, .foo2 => 32
|
|
|
|
/--
|
|
error: Not enough patterns in match alternative: Expected 2, but found 1:
|
|
.foo
|
|
---
|
|
error: Missing cases:
|
|
Foo.foo2, Foo.foo
|
|
-/
|
|
#guard_msgs in
|
|
def matchTooFew₂ (f : Foo) : Nat :=
|
|
match f, f with
|
|
| .foo2, .foo2 => 32
|
|
| .foo => 41
|
|
|
|
set_option pp.mvars false in
|
|
/--
|
|
error: Not enough patterns in match alternative: Expected 2, but found 1:
|
|
.(_)
|
|
---
|
|
error: Type mismatch
|
|
fun b => True
|
|
has type
|
|
?_ → Prop
|
|
but is expected to have type
|
|
Prop
|
|
-/
|
|
#guard_msgs in
|
|
def matchTooFewFn : Foo → Foo → Prop := fun a b =>
|
|
match a, b with
|
|
| _ => fun b => True
|
|
|
|
/--
|
|
error: Inconsistent number of patterns in match alternatives: This alternative contains 1 pattern:
|
|
n + 1
|
|
but a preceding alternative contains 2:
|
|
x, 0
|
|
-/
|
|
#guard_msgs in
|
|
def checkCounterexampleMsg : Nat → Nat → Nat
|
|
| x, 0 => x
|
|
| 0, n + 1 => n
|
|
| n + 1 => 42
|