diff --git a/Pantograph.lean b/Pantograph.lean index 74289d6..1ac16fc 100644 --- a/Pantograph.lean +++ b/Pantograph.lean @@ -81,6 +81,7 @@ def execute (command: Protocol.Command): MainM Lean.Json := do printJsonPretty := args.printJsonPretty?.getD options.printJsonPretty, printExprPretty := args.printExprPretty?.getD options.printExprPretty, printExprAST := args.printExprAST?.getD options.printExprAST, + printDependentMVars := args.printDependentMVars?.getD options.printDependentMVars, noRepeat := args.noRepeat?.getD options.noRepeat, printAuxDecls := args.printAuxDecls?.getD options.printAuxDecls, printImplementationDetailHyps := args.printImplementationDetailHyps?.getD options.printImplementationDetailHyps diff --git a/Pantograph/Goal.lean b/Pantograph/Goal.lean index 8efc20f..3a8e2fe 100644 --- a/Pantograph/Goal.lean +++ b/Pantograph/Goal.lean @@ -91,7 +91,6 @@ private def newMVarSet (mctxOld: @&MetavarContext) (mctxNew: @&MetavarContext): acc.insert mvarId ) SSet.empty - protected def GoalState.focus (state: GoalState) (goalId: Nat): Option GoalState := do let goal ← state.savedState.tactic.goals.get? goalId return { diff --git a/Pantograph/Library.lean b/Pantograph/Library.lean index 34e1ecc..20eaa34 100644 --- a/Pantograph/Library.lean +++ b/Pantograph/Library.lean @@ -86,23 +86,6 @@ def createMetaContext: IO Lean.Meta.Context := do def envCatalog: Lean.CoreM Protocol.EnvCatalogResult := Environment.catalog ({}: Protocol.EnvCatalog) -@[export pantograph_mk_options] -def mkOptions - (printJsonPretty: Bool) - (printExprPretty: Bool) - (printExprAST: Bool) - (noRepeat: Bool) - (printAuxDecls: Bool) - (printImplementationDetailHyps: Bool) - : Protocol.Options := { - printJsonPretty, - printExprPretty, - printExprAST, - noRepeat, - printAuxDecls, - printImplementationDetailHyps, - } - @[export pantograph_env_inspect_m] def envInspect (name: String) (value: Bool) (dependency: Bool) (options: @&Protocol.Options): Lean.CoreM (Protocol.CR Protocol.EnvInspectResult) := diff --git a/README.md b/README.md index 4a8f448..508d026 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,15 @@ For Nix based workflow, see below. Install `elan` and `lake`. Execute ``` sh -make build/bin/pantograph +make ``` -setup the `LEAN_PATH` environment variable so it contains the library path of lean libraries. The libraries must be built in advance. For example, if `mathlib4` is stored at `../lib/mathlib4`, +This builds the executable in `.lake/build/bin/pantograph`. + +To use Pantograph in a project environment, setup the `LEAN_PATH` environment +variable so it contains the library path of lean libraries. The libraries must +be built in advance. For example, if `mathlib4` is stored at `../lib/mathlib4`, +the environment might be setup like this: + ``` sh LIB="../lib" LIB_MATHLIB="$LIB/mathlib4/lake-packages" @@ -23,7 +29,10 @@ export LEAN_PATH="$LIB/mathlib4/build/lib:$LIB_MATHLIB/aesop/build/lib:$LIB_MATH LEAN_PATH=$LEAN_PATH build/bin/pantograph $@ ``` -The provided `flake.nix` has a develop environment with Lean already setup. +The `$LEAN_PATH` executable of any project can be extracted by +``` sh +lake env printenv LEAN_PATH +``` ## Executable Usage @@ -71,33 +80,42 @@ where the application of `assumption` should lead to a failure. ### Commands See `Pantograph/Protocol.lean` for a description of the parameters and return values in JSON. -- `reset`: Delete all cached expressions and proof trees -- `expr.echo {"expr": , "type": }`: Determine the type of an expression and round-trip it -- `env.catalog`: Display a list of all safe Lean symbols in the current environment -- `env.inspect {"name": , "value": }`: Show the type and package of a +* `reset`: Delete all cached expressions and proof trees +* `stat`: Display resource usage +* `expr.echo {"expr": , "type": }`: Determine the + type of an expression and format it +* `env.catalog`: Display a list of all safe Lean symbols in the current environment +* `env.inspect {"name": , "value": }`: Show the type and package of a given symbol; If value flag is set, the value is printed or hidden. By default only the values of definitions are printed. -- `options.set { key: value, ... }`: Set one or more options (not Lean options; those +* `options.set { key: value, ... }`: Set one or more options (not Lean options; those have to be set via command line arguments.), for options, see `Pantograph/Protocol.lean` -- `options.print`: Display the current set of options -- `goal.start {["name": ], ["expr": ], ["copyFrom": ]}`: Start a new goal from a given expression or symbol -- `goal.tactic {"stateId": , "goalId": , ["tactic": ], ["expr": - ]}`: Execute a tactic string on a given goal. `tactic` executes an - ordinary tactic, `expr` assigns an expression to the current goal, `have` - executes the have tactic, ``calc` (of the form `lhs op rhs`) executes one step - of `calc`, and `"conv": true`/`"conv": false` enters/exits conversion tactic - mode. -- `goal.continue {"stateId": , ["branch": ], ["goals": ]}`: Continue from a proof state -- `goal.remove {"stateIds": []}"`: Remove a bunch of stored goals. -- `goal.print {"stateId": }"`: Print a goal state -- `stat`: Display resource usage +* `options.print`: Display the current set of options +* `goal.start {["name": ], ["expr": ], ["copyFrom": ]}`: + Start a new proof from a given expression or symbol +* `goal.tactic {"stateId": , "goalId": , ...}`: Execute a tactic string on a + given goal. The tactic is supplied as additional key-value pairs in one of the following formats: + - `{ "tactic": }`: Execute an ordinary tactic + - `{ "expr": }`: Assign the given proof term to the current goal + - `{ "have": , "binderName": }`: Execute `have` and creates a branch goal + - `{ "calc": }`: Execute one step of a `calc` tactic. Each step must + be of the form `lhs op rhs`. An `lhs` of `_` indicates that it should be set + to the previous `rhs`. + - `{ "conv": }`: Enter or exit conversion tactic mode. In the case of + exit, the goal id is ignored. +* `goal.continue {"stateId": , ["branch": ], ["goals": ]}`: + Execute continuation/resumption + - `{ "branch": }`: Continue on branch state. The current state must have no goals. + - `{ "goals": }`: Resume the given goals +* `goal.remove {"stateIds": []}"`: Drop the goal states specified in the list +* `goal.print {"stateId": }"`: Print a goal state ### Errors When an error pertaining to the execution of a command happens, the returning JSON structure is ``` json -{ error: "type", desc: "description" } +{ "error": "type", "desc": "description" } ``` Common error forms: * `command`: Indicates malformed command structure which results from either @@ -122,6 +140,8 @@ call Pantograph via this FFI since it provides a tremendous speed up. ## Developing +A Lean development shell is provided in the Nix flake. + ### Testing The tests are based on `LSpec`. To run tests,