Skip to content

Commit 3d12676

Browse files
authored
Add unified options for Velvet (#21)
* add a file with Loom options * use options info for sematics and solver control * refactor Velvet case studies for new options
1 parent 2372de9 commit 3d12676

File tree

15 files changed

+244
-31
lines changed

15 files changed

+244
-31
lines changed

CaseStudies/Velvet/Std.lean

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@ import Mathlib.Algebra.Ring.Int.Defs
77

88
import Loom.MonadAlgebras.NonDetT.Extract
99
import Loom.MonadAlgebras.WP.Tactic
10+
import Loom.MonadAlgebras.WP.Options
1011
import Loom.MonadAlgebras.WP.DoNames'
1112

1213
import CaseStudies.Extension
1314
import CaseStudies.Velvet.Syntax
1415

15-
macro_rules
16-
| `(tactic|loom_solver) =>
17-
`(tactic|try grind (splits := 20))
1816

1917
macro_rules
2018
| `(doElem|$id:ident[$idx:term] := $val:term) =>

CaseStudies/Velvet/Syntax.lean

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,10 @@ elab_rules : command
270270
for mutType in mutTypes do
271271
mutTypeProd <- `($mutType × $mutTypeProd)
272272
retType <- `($retType × $mutTypeProd)
273+
/- We need Velvet methods to be elaborated in a modified `do`-notation.
274+
For that we localy open the `DoNames` namespace which contains the extensioned `do`-notation. -/
273275
let defCmd <- `(command|
276+
open Lean.Elab.Term.DoNames in
274277
set_option linter.unusedVariables false in
275278
def $name $bindersIdents* : VelvetM $retType:term := do $mods* $doSeq*
276279
$suf:suffix)
@@ -340,6 +343,37 @@ elab_rules : command
340343
$pre
341344
($name $ids*)
342345
(fun $ret => $post) := by $proofSeq $suf:suffix)
346+
let opts <- getOptions
347+
348+
/- We need to check the termination and choice semantics options before
349+
stating the proof. -/
350+
if opts.getString (defVal := "unspecified") `loom.semantics.choice = "unspecified" then
351+
throwError "First, you need to specify the choice semantics using `set_option loom.semantics.choice <demonic/angelic>`"
352+
353+
if opts.getString (defVal := "unspecified") `loom.semantics.termination = "unspecified" then
354+
throwError "First, you need to specify the termination semantics using `set_option loom.semantics.termination <partial/total>`"
355+
356+
/- Now, depending on the solver option, we will locally define the `loom_solver` tactic. -/
357+
let solver := opts.getString (defVal := "grind") `loom.solver
358+
let thmCmd <- match solver with
359+
| "grind" =>
360+
/- In case of `grind` solver, we need to fetch the number of splits from the options first. -/
361+
let splits := Lean.Syntax.mkNatLit <| (opts.getNat (defVal := 20) `loom.solver.grind.splits)
362+
`(command|
363+
macro_rules | `(tactic| loom_solver) => do `(tactic| try grind (splits := $splits)) in
364+
$thmCmd)
365+
| "custom" => pure thmCmd
366+
| _ =>
367+
/- This is the case of `cvc5` or `z3` solver. We also need to fetch the timeout from the options. -/
368+
let timeout := Syntax.mkNatLit <| (opts.getNat (defVal := 1) `loom.solver.smt.timeout)
369+
let solver := Syntax.mkStrLit <| (opts.getString (defVal := "cvc5") `loom.solver.smt.solver)
370+
`(command|
371+
set_option auto.smt.trust true in
372+
set_option auto.smt true in
373+
set_option auto.smt.solver.name $solver in
374+
set_option auto.smt.timeout $timeout in
375+
macro_rules | `(tactic| loom_solver) => do `(tactic| loom_auto) in
376+
$thmCmd)
343377
trace[Loom] "{thmCmd}"
344378
Command.elabCommand thmCmd
345379
velvetObligations.modify (·.erase name.getId)

CaseStudies/Velvet/VelvetExamples/EncodeDecodeStr.lean

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import Loom.MonadAlgebras.WP.DoNames'
77
import CaseStudies.Velvet.Std
88
import CaseStudies.TestingUtil
99

10-
open PartialCorrectness DemonicChoice Lean.Elab.Term.DoNames
10+
set_option loom.semantics.termination "partial"
11+
set_option loom.semantics.choice "demonic"
1112

13+
open PartialCorrectness DemonicChoice
1214
section RunLengthEncoding
1315

1416
structure Encoding where
@@ -60,7 +62,6 @@ method decodeStr' (encoded_str: Array Encoding)
6062
i := i + 1
6163
return decoded
6264

63-
6465
prove_correct decodeStr' by
6566
loom_solve
6667
· simp[*] at *

CaseStudies/Velvet/VelvetExamples/Examples.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import Loom.MonadAlgebras.WP.DoNames'
1111
import CaseStudies.Velvet.Std
1212
import CaseStudies.TestingUtil
1313

14-
open PartialCorrectness DemonicChoice Lean.Elab.Term.DoNames
14+
set_option loom.semantics.termination "partial"
15+
set_option loom.semantics.choice "demonic"
1516

1617
section insertionSort
1718

CaseStudies/Velvet/VelvetExamples/Examples_Total.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import Loom.MonadAlgebras.WP.DoNames'
1010

1111
import CaseStudies.Velvet.Std
1212

13-
open TotalCorrectness DemonicChoice Lean.Elab.Term.DoNames
13+
set_option loom.semantics.termination "total"
14+
set_option loom.semantics.choice "demonic"
1415

1516
attribute [grind] Array.multiset_swap
1617

CaseStudies/Velvet/VelvetExamples/GCD.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import Loom.MonadAlgebras.WP.DoNames'
88
import CaseStudies.Velvet.Std
99
import CaseStudies.TestingUtil
1010

11-
open TotalCorrectness DemonicChoice Lean.Elab.Term.DoNames
11+
set_option loom.semantics.termination "total"
12+
set_option loom.semantics.choice "demonic"
1213

1314
-- The Euclidean algorithm for GCD is a classic example of a function requiring
1415
-- explicit termination measures due to the modulo operation

CaseStudies/Velvet/VelvetExamples/IsSorted.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import Loom.MonadAlgebras.WP.DoNames'
77
import CaseStudies.Velvet.Std
88
import CaseStudies.TestingUtil
99

10-
open PartialCorrectness DemonicChoice Lean.Elab.Term.DoNames
10+
set_option loom.semantics.termination "partial"
11+
set_option loom.semantics.choice "demonic"
1112

1213

1314
method IsSorted(a: Array Int) return (sorted: Bool)

CaseStudies/Velvet/VelvetExamples/MaxElem.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import Loom.MonadAlgebras.WP.DoNames'
77
import CaseStudies.Velvet.Std
88
import CaseStudies.TestingUtil
99

10-
open PartialCorrectness DemonicChoice Lean.Elab.Term.DoNames
10+
set_option loom.semantics.termination "partial"
11+
set_option loom.semantics.choice "demonic"
1112

1213
section MaxElem
1314

@@ -36,7 +37,6 @@ method maxElem (arr: Array Int) return (res: Int)
3637
return mx
3738

3839
prove_correct maxElem by
39-
unfold isMax
4040
loom_solve
4141

4242
end MaxElem

CaseStudies/Velvet/VelvetExamples/Recursion.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import Loom.MonadAlgebras.WP.DoNames'
1111
import CaseStudies.Velvet.Std
1212
import CaseStudies.TestingUtil
1313

14-
open TotalCorrectness DemonicChoice Lean.Elab.Term.DoNames
14+
set_option loom.semantics.termination "total"
15+
set_option loom.semantics.choice "demonic"
1516

1617
method simple_recursion (x : Nat) return (res: Nat)
1718
require True

CaseStudies/Velvet/VelvetExamples/SpMSpV_Example.lean

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@ import Loom.MonadAlgebras.WP.DoNames'
1111

1212
import CaseStudies.Velvet.Std
1313

14-
open PartialCorrectness DemonicChoice Lean.Elab.Term.DoNames
1514

1615
set_option auto.smt.trust true
1716
set_option auto.smt true
18-
--try increasing this parameter if verification fails
1917
set_option auto.smt.timeout 4
2018
set_option auto.smt.solver.name "cvc5"
2119

20+
set_option loom.semantics.termination "partial"
21+
set_option loom.semantics.choice "demonic"
22+
2223

2324
attribute [solverHint] Array.get_set_c
2425
section SpMV

0 commit comments

Comments
 (0)