package coq-lsp
Language Server Protocol native server for Coq
Install
Dune Dependency
Authors
Maintainers
Sources
coq-lsp-0.1.8.8.19.tbz
sha256=1e63289d620e533615812267e96e44c1b5cd2dbdaf26cc9dc8ba00051c2b08c0
sha512=9f5e25c6974d293e7c073e65f85936ef18180692dd031c7b709d24d3eefb1955e955c6208cf02c2ac70fa12966d96bc1d43b29f55c425274802289dcf66d5eb2
doc/src/coq-lsp.coq/goals.ml.html
Source file goals.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
(************************************************************************) (* * The Coq Proof Assistant / The Coq Development Team *) (* v * INRIA, CNRS and contributors - Copyright 1999-2018 *) (* <O___,, * (see CREDITS file for the list of authors) *) (* \VV/ **************************************************************) (* // * This file is distributed under the terms of the *) (* * GNU Lesser General Public License Version 2.1 *) (* * (see LICENSE file for the text of the license) *) (************************************************************************) (************************************************************************) (* Coq serialization API/Plugin SERAPI *) (* Copyright 2016-2019 MINES ParisTech -- LGPL 2.1+ *) (* Copyright 2019-2022 Inria -- LGPL 2.1+ *) (* Written by: Emilio J. Gallego Arias *) (************************************************************************) type 'a hyp = { names : string list ; def : 'a option ; ty : 'a } let map_hyp ~f { names; def; ty } = let def = Option.map f def in let ty = f ty in { names; def; ty } type info = { evar : Evar.t ; name : Names.Id.t option } type 'a reified_goal = { info : info ; hyps : 'a hyp list ; ty : 'a } let map_reified_goal ~f { info; ty; hyps } = let ty = f ty in let hyps = List.map (map_hyp ~f) hyps in { info; ty; hyps } type ('a, 'pp) goals = { goals : 'a list ; stack : ('a list * 'a list) list ; bullet : 'pp option ; shelf : 'a list ; given_up : 'a list } let map_goals ~f { goals; stack; bullet; shelf; given_up } = let goals = List.map f goals in let stack = List.map (fun (s, r) -> (List.map f s, List.map f r)) stack in let shelf = List.map f shelf in let given_up = List.map f given_up in { goals; stack; bullet; shelf; given_up } type 'pp reified_pp = ('pp reified_goal, 'pp) goals (** XXX: Do we need to perform evar normalization? *) module CDC = Context.Compacted.Declaration type cdcl = EConstr.compacted_declaration let binder_name n = Context.binder_name n |> Names.Id.to_string let to_tuple ppx : cdcl -> 'pc hyp = let open CDC in function | LocalAssum (idl, tm) -> let names = List.map binder_name idl in { names; def = None; ty = ppx tm } | LocalDef (idl, tdef, tm) -> let names = List.map binder_name idl in { names; def = Some (ppx tdef); ty = ppx tm } (** gets a hypothesis *) let get_hyp (ppx : EConstr.t -> 'pc) (_sigma : Evd.evar_map) (hdecl : cdcl) : 'pc hyp = to_tuple ppx hdecl (** gets the constr associated to the type of the current goal *) let get_goal_type (ppx : EConstr.t -> 'pc) (env : Environ.env) (sigma : Evd.evar_map) (g : Evar.t) : _ = let (EvarInfo evi) = Evd.find sigma g in let concl = match Evd.evar_body evi with | Evd.Evar_empty -> Evd.evar_concl evi | Evd.Evar_defined body -> Retyping.get_type_of env sigma body in ppx concl let build_info sigma g = { evar = g; name = Evd.evar_ident g sigma } (** Generic processor *) let process_goal_gen ppx sigma g : 'a reified_goal = (* XXX This looks cumbersome *) let env = Global.env () in let (EvarInfo evi) = Evd.find sigma g in let env = Evd.evar_filtered_env env evi in (* why is compaction neccesary... ? [eg for better display] *) let ctx = Termops.compact_named_context sigma (EConstr.named_context env) in let ppx = ppx env sigma in let hyps = List.map (get_hyp ppx sigma) ctx |> List.rev in let info = build_info sigma g in { info; ty = get_goal_type ppx env sigma g; hyps } let if_not_empty (pp : Pp.t) = if Pp.(repr pp = Ppcmd_empty) then None else Some pp let reify ~ppx lemmas = let lemmas = State.Proof.to_coq lemmas in let proof = Vernacstate.LemmaStack.with_top lemmas ~f:(fun pstate -> Declare.Proof.get pstate) in let { Proof.goals; stack; sigma; _ } = Proof.data proof in let ppx = List.map (process_goal_gen ppx sigma) in { goals = ppx goals ; stack = List.map (fun (g1, g2) -> (ppx g1, ppx g2)) stack ; bullet = if_not_empty @@ Proof_bullet.suggest proof ; shelf = Evd.shelf sigma |> ppx ; given_up = Evd.given_up sigma |> Evar.Set.elements |> ppx }
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>