-- | `later meta args` defers the invocation of `meta args` \meta later {- | `fails meta args` succeeds if and only if `meta args` fails - `fails {T} meta args` succeeds if and only if `meta args : T` fails -} \meta fails -- | `using (e_1, ... e_n) e` adds `e_1`, ... `e_n` to the context before checking `e` \meta using -- | `usingOnly (e_1, ... e_n) e` replaces the context with `e_1`, ... `e_n` before checking `e` \meta usingOnly -- | `hiding (x_1, ... x_n) e` hides local variables `x_1`, ... `x_n` from the context before checking `e` \meta hiding -- | `run { e_1, ... e_n }` is equivalent to `e_1 $ e_2 $ ... $ e_n` \meta run -- | `((f_1, ... f_n) at x) r` replaces variable `x` with `f_1 (... (f_n x) ...)` and runs `r` in the modified context \meta \infix 1 at -- | `f in x` is equivalent to `\let r => f x \in r`. Also, `(f_1, ... f_n) in x` is equivalent to `f_1 in ... f_n in x`. This meta is usually used with `f` being a meta such as `rewrite`, `simplify`, `simp_coe`, or `unfold`. \meta \infixr 1 in {- | `cases args default` works just like `mcases args default`, but does not search for \case expressions or definition invocations. - Each argument has a set of parameters that can be configured. - Parameters are specified after keyword 'arg' which is written after the argument. - Available parameters are 'addPath', 'name', and 'as'. - Parameter 'name' can be used to specify the name of the argument which can be used in types of subsequent arguments. - Parameter 'as' can be used to specify an \as-name that will be added to corresponding patterns in each clause. - The type of an argument is specified as either `e : E` or `e arg parameters : E`. - The flag 'addPath' indicates that argument `idp` with type `e = x` should be added after the current one, where `e` is the current argument and `x` is its name. - That is, `cases (e arg addPath)` is equivalent to `cases (e arg (name = x), idp : e = x)`. -} \meta cases {- | `mcases {def} args default \with { ... }` finds all invocations of definition `def` in the expected type and generate a \case expression that matches arguments of those invocations. - It matches only those arguments which are matched in `def`. - If the explicit argument is omitted, then `mcases` searches for \case expressions instead of definition invocations. - `default` is an optional argument which is used as a default result for missing clauses. - The list of clauses after \with can be omitted if the default expression is specified. - `args` is a comma-separated list of expressions (which can be omitted) that will be additionally matched in the resulting \case expressions. - These arguments are written in the same syntax as arguments in `cases`. - `mcases` also searches for occurrences of `def` in the types of these additional expressions. - Parameters of found arguments can be specified in the second implicit argument. - The syntax is similar to the syntax for arguments in `cases`, but the expression should be omitted. - If the first implicit argument is `_`, it will be skipped. - `mcases {def_1, ... def_n}` searches for occurrences of definitions `def_1`, ... `def_n`. - `mcases {def, i_1, ... i_n}` matches arguments only of `i_1`-th, ... `i_n`-th occurrences of `def`. - For example, - * `mcases {(def1,4),def2,(def3,1,2)}` looks for the 4th occurrence of `def1`, all occurrences of `def2`, and the first and the second occurrence of `def3`. - * `mcases {(1,2),(def,1)}` looks for the first and the second occurrence of a \case expression and the first occurrence of `def`. - * `mcases {(def1,2),(),def2}` looks for the second occurrence of `def1`, all occurrences of \case expressions, and all occurrences of `def2`. - * `mcases {_} {arg addPath, arg (), arg addPath}` looks for case expressions and adds a path argument after the first and the third matched expression. -} \meta mcases {- | `unfold (f_1, ... f_n) e` unfolds functions/fields/variables `f_1`, ... `f_n` in the expected type before type-checking of `e` and returns `e` itself. - If the first argument is omitted, it unfold all fields. - If the expected type is unknown, it unfolds these function in the result type of `e`. -} \meta unfold -- | Unfolds \let expressions \meta unfold_let -- | Unfolds recursively top-level functions and fields \meta unfolds {- | `x <|> y` invokes `x` and if it fails, invokes `y` - Also, `(x <|> y) z_1 ... z_n` is equivalent to `x z_1 ... z_n <|> z_1 ... z_n` -} \meta \infixr 3 <|> -- | The same as {<|>} \meta try {- | Inserts data type arguments in constructor invocation. - If constructor `con` has 3 data type arguments, then `mkcon con args` is equivalent to `con {_} {_} {_} args` -} \meta mkcon {- | * `assumption` searches for a proof in the context. It tries variables that are declared later first. - * `assumption` {n} returns the n-th variables from the context counting from the end. - * `assumption` {n} a1 ... ak applies n-th variable from the context to arguments a1, ... ak. -} \meta assumption -- | `defaultImpl C F E` returns the default implementation of field `F` in class `C` applied to expression `E`. The third argument can be omitted, in which case either `\this` or `_` will be used instead, \meta defaultImpl