test: add List.mergeSort benchmark for cbv tactic (#12588)

This PR adds a benchmark for `cbv` tactic that involves evaluating
`List.mergeSort` on a reversed list on natural numbers.
This commit is contained in:
Wojciech Różowski 2026-02-19 13:59:42 +00:00 committed by GitHub
parent a5f2b78da5
commit fad343d9ef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 56 additions and 0 deletions

View file

@ -0,0 +1,50 @@
import Lean
open Lean
/-- Build an `Expr` for the list `[1, 2, ..., n]` of type `List Nat`. -/
partial def mkRangeListExpr (n : Nat) : Expr :=
let natExpr := mkConst ``Nat
let nil := mkApp (mkConst ``List.nil [.zero]) natExpr
let cons := fun (head tail : Expr) => mkApp3 (mkConst ``List.cons [.zero]) natExpr head tail
let rec mkList (i : Nat) (acc : Expr) : Expr :=
if i == 0 then acc
else mkList (i - 1) (cons (mkNatLit i) acc)
mkList n nil
/-- Build an `Expr` for the list `[n, n-1, ..., 1]` of type `List Nat`. -/
partial def mkRevRangeListExpr (n : Nat) : Expr :=
let natExpr := mkConst ``Nat
let nil := mkApp (mkConst ``List.nil [.zero]) natExpr
let cons := fun (head tail : Expr) => mkApp3 (mkConst ``List.cons [.zero]) natExpr head tail
let rec mkList (i : Nat) (acc : Expr) : Expr :=
if i == 0 then acc
else mkList (i - 1) (cons (mkNatLit (n - i + 1)) acc)
mkList n nil
/-- Build the expression `List.mergeSort [n, ..., 1] Nat.ble`. -/
def mkMergeSortProblem (n : Nat) : Expr :=
let natExpr := mkConst ``Nat
let list := mkRevRangeListExpr n
let le := mkConst ``Nat.ble
mkApp3 (mkConst ``List.mergeSort [.zero]) natExpr list le
def runProblem (n : Nat) : MetaM Unit := do
let problem := mkMergeSortProblem n
let startTime ← IO.monoNanosNow
let executed ← Lean.Meta.Tactic.Cbv.cbvEntry problem
let endTime ← IO.monoNanosNow
let ms := (endTime - startTime).toFloat / 1000000.0
match executed with
| .rfl _ => IO.println s!"mergeSort_{n}: {ms} ms (rfl)"
| .step _ proof _ =>
let startTime ← IO.monoNanosNow
Meta.checkWithKernel proof
let endTime ← IO.monoNanosNow
let kernelMs := (endTime - startTime).toFloat / 1000000.0
IO.println s!"mergeSort_{n}: cbv {ms} ms, kernel {kernelMs} ms"
def runBenchmarks : MetaM Unit := do
IO.println "=== Merge Sort CBV Benchmarks ==="
IO.println ""
for n in [10, 25, 50, 75, 100, 125, 175] do
runProblem n

View file

@ -689,3 +689,9 @@
run_config:
<<: *time
cmd: lean ./cbv/decide.lean
- attributes:
description: cbv tactic (evaluating List.mergeSort)
tags: [other]
run_config:
<<: *time
cmd: lean ./cbv/merge_sort.lean