Many of our tests in `tests/lean/run/` produce output from `#eval` (or `#check`) statements, that is then ignored. This PR tries to capture all the useful output using `#guard_msgs`. I've only done a cursory check that the output is still sane --- there is a chance that some "unchecked" tests have already accumulated regressions and this just cements them! In the other direction, I did identify two rotten tests: * a minor one in `setStructInstNotation.lean`, where a comment says `Set Nat`, but `#check` actually prints `?_`. Weird? * `CompilerProbe.lean` is generating empty output, apparently indicating that something is broken, but I don't know the signficance of this file. In any case, I'll ask about these elsewhere. (This started by noticing that a recent `grind` test file had an untested `trace_state`, and then got carried away.)
48 lines
1.5 KiB
Text
48 lines
1.5 KiB
Text
notation "#(" a ")" => ⟨a, by decreasing_tactic⟩
|
||
|
||
def List.unfoldr {α β : Type u} [sz : SizeOf β] (f : (b : β) → Option (α × { b' : β // sizeOf b' < sizeOf b})) (b : β) : List α :=
|
||
match f b with
|
||
| none => []
|
||
| some (a, ⟨b', h⟩) => a :: unfoldr f b'
|
||
|
||
def tst1 (n : Nat) : List Nat :=
|
||
List.unfoldr (b := n) fun
|
||
| 0 => none
|
||
| b+1 => some (3*n - b*2, #(b))
|
||
|
||
#guard tst1 10 == [12, 14, 16, 18, 20, 22, 24, 26, 28, 30]
|
||
|
||
def tst2 (n : Nat) : List Nat :=
|
||
-- Similar example where we provide our custom `SizeOf` instance
|
||
List.unfoldr (sz := ⟨fun b => n - b⟩) (b := 0) fun b =>
|
||
if h : b < n then
|
||
some (b*2, #(b+1))
|
||
else
|
||
none
|
||
|
||
#guard tst2 10 == [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
|
||
|
||
-- More general (and less convenient to use) version that can take an arbitrary well-founded relation.
|
||
def List.unfoldr' {α β : Type u} [w : WellFoundedRelation β] (f : (b : β) → Option (α × { b' : β // w.rel b' b})) (b : β) : List α :=
|
||
match f b with
|
||
| none => []
|
||
| some (a, ⟨b', h⟩) => a :: unfoldr' f b'
|
||
termination_by b
|
||
|
||
-- We need the `master` branch to test the following example
|
||
|
||
def tst3 (n : Nat) : List Nat :=
|
||
List.unfoldr' (b := n) fun
|
||
| 0 => none
|
||
| b+1 => some (3*n - b*2, #(b))
|
||
|
||
#guard tst3 10 == [12, 14, 16, 18, 20, 22, 24, 26, 28, 30]
|
||
|
||
def tst4 (n : Nat) : List Nat :=
|
||
List.unfoldr' (w := invImage (fun b => n - b) inferInstance) (b := 0) fun b =>
|
||
if h : b < n then
|
||
some (2*b, #(b+1))
|
||
else
|
||
none
|
||
|
||
#guard tst4 10 == [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
|