Adds a mechanism where when an autoparam tactic fails to synthesize a parameter, the associated parameter name or field name for the autoparam is reported in an error. Examples: ```text could not synthesize default value for parameter 'h' using tactics could not synthesize default value for field 'inv' of 'S' using tactics ``` Notes: * Autoparams now run their tactics without any error recovery or error-to-sorry enabled. This enables catching the error and reporting the contextual information. This is justified on the grounds that autoparams are not interactive. * Autoparams for applications now cleanup the autoParam annotation, bringing it in line with autoparams for structure fields. * This preserves the old behavior that autoparams leave terminfo, but we will revisit this after some imminent improvements to the unused variable linter. Closes #2950
66 lines
2 KiB
Text
66 lines
2 KiB
Text
open List MergeSort Internal
|
|
|
|
-- If we omit the comparator, it is filled by the autoparam `fun a b => a ≤ b`
|
|
unseal mergeSort merge in
|
|
example : mergeSort [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] = [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] :=
|
|
rfl
|
|
|
|
unseal mergeSort merge in
|
|
example : mergeSort [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] (· ≤ ·) = [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] :=
|
|
rfl
|
|
|
|
unseal mergeSort merge in
|
|
example : mergeSort [3, 100 + 1, 4, 100 + 1, 5, 100 + 9, 2, 10 + 6, 5, 10 + 3, 5] (fun x y => x/10 ≤ y/10) = [3, 4, 5, 2, 5, 5, 16, 13, 101, 101, 109] :=
|
|
rfl
|
|
|
|
unseal mergeSortTR.run mergeTR.go in
|
|
example : mergeSortTR [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] = [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] :=
|
|
rfl
|
|
|
|
unseal mergeSortTR.run mergeTR.go in
|
|
example : mergeSortTR [3, 100 + 1, 4, 100 + 1, 5, 100 + 9, 2, 10 + 6, 5, 10 + 3, 5] (fun x y => x/10 ≤ y/10) = [3, 4, 5, 2, 5, 5, 16, 13, 101, 101, 109] :=
|
|
rfl
|
|
|
|
unseal mergeSortTR₂.run mergeTR.go in
|
|
example : mergeSortTR₂ [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] = [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] :=
|
|
rfl
|
|
|
|
unseal mergeSortTR₂.run mergeTR.go in
|
|
example : mergeSortTR₂ [3, 100 + 1, 4, 100 + 1, 5, 100 + 9, 2, 10 + 6, 5, 10 + 3, 5] (fun x y => x/10 ≤ y/10) = [3, 4, 5, 2, 5, 5, 16, 13, 101, 101, 109] :=
|
|
rfl
|
|
|
|
/-!
|
|
# Behaviour of mergeSort when the comparator is not provided, but typeclasses are missing.
|
|
-/
|
|
|
|
inductive NoLE
|
|
| mk : NoLE
|
|
|
|
/--
|
|
error: could not synthesize default value for parameter 'le' using tactics
|
|
---
|
|
error: failed to synthesize
|
|
LE NoLE
|
|
Additional diagnostic information may be available using the `set_option diagnostics true` command.
|
|
-/
|
|
#guard_msgs in
|
|
example : mergeSort [NoLE.mk] = [NoLE.mk] := sorry
|
|
|
|
inductive UndecidableLE
|
|
| mk : UndecidableLE
|
|
|
|
instance : LE UndecidableLE where
|
|
le := fun _ _ => true
|
|
|
|
/--
|
|
error: could not synthesize default value for parameter 'le' using tactics
|
|
---
|
|
error: type mismatch
|
|
a ≤ b
|
|
has type
|
|
Prop : Type
|
|
but is expected to have type
|
|
Bool : Type
|
|
-/
|
|
#guard_msgs in
|
|
example : mergeSort [UndecidableLE.mk] = [UndecidableLE.mk] := sorry
|