Source file proofState.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
open Printing
open Ppx_yojson_conv_lib.Yojson_conv.Primitives
type goal = {
id: int;
hypotheses: pp list;
goal: pp;
} [@@deriving yojson]
type t = {
goals: goal list;
shelvedGoals: goal list;
givenUpGoals: goal list;
} [@@deriving yojson]
open Printer
module CompactedDecl = Context.Compacted.Declaration
let mk_goal env sigma g =
let EvarInfo evi = Evd.find sigma g in
let env = Evd.evar_filtered_env env evi in
let min_env = Environ.reset_context env in
let id = Evar.repr g in
let concl = match Evd.evar_body evi with
| Evar_empty -> Evd.evar_concl evi
| Evar_defined body -> Retyping.get_type_of env sigma body
in
let ccl =
pr_letype_env ~goal_concl_style:true env sigma concl
in
let mk_hyp d (env,l) =
let d' = CompactedDecl.to_named_context d in
let env' = List.fold_right EConstr.push_named d' env in
let hyp = pr_ecompacted_decl env sigma d in
(env', hyp :: l)
in
let (_env, hyps) =
Context.Compacted.fold mk_hyp
(Termops.compact_named_context sigma (EConstr.named_context env)) ~init:(min_env,[]) in
{
id;
hypotheses = List.rev_map pp_of_coqpp hyps;
goal = pp_of_coqpp ccl;
}
let mk_goal_diff diff_goal_map env sigma g =
let id = Evar.repr g in
let og_s = Proof_diffs.map_goal g diff_goal_map in
let (hyps, ccl) = Proof_diffs.diff_goal ?og_s (Proof_diffs.make_goal env sigma g) in
{
id;
hypotheses = List.rev_map pp_of_coqpp hyps;
goal = pp_of_coqpp ccl;
}
let proof_of_state st =
match st.Vernacstate.interp.lemmas with
| None -> None
| Some lemmas ->
Some (lemmas |> Vernacstate.LemmaStack.with_top ~f:Declare.Proof.get)
let string_of_diff_mode = function
| Settings.Goals.Diff.Mode.Off -> "off"
| On -> "on"
| Removed -> "removed"
let set_diff_mode diff_mode =
Goptions.set_string_option_value Proof_diffs.opt_name @@ string_of_diff_mode diff_mode
let get_proof ~previous diff_mode st =
Vernacstate.unfreeze_full_state st;
match proof_of_state st with
| None -> None
| Some proof ->
let mk_goal env sigma g =
match diff_mode with
| Settings.Goals.Diff.Mode.Off ->
mk_goal env sigma g
| _ ->
begin
set_diff_mode diff_mode;
match Option.bind previous proof_of_state with
| None -> mk_goal env sigma g
| Some old_proof ->
let diff_goal_map = Proof_diffs.make_goal_map old_proof proof in
mk_goal_diff diff_goal_map env sigma g
end
in
let env = Global.env () in
let proof_data = Proof.data proof in
let sigma = proof_data.sigma in
let goals = List.map (mk_goal env sigma) proof_data.goals in
let shelvedGoals = List.map (mk_goal env sigma) (Evd.shelf sigma) in
let givenUpGoals = List.map (mk_goal env sigma) (Evar.Set.elements @@ Evd.given_up sigma) in
Some {
goals;
shelvedGoals;
givenUpGoals;
}