@@ -855,3 +855,42 @@ let pr_lconstr_pattern_expr ~flags env sigma c : Pp.t = !term_pr.pr_lconstr_patt
855855let pr_cases_pattern_expr ~flags c : Pp.t = pr_patt ~flags (pr ~flags no_after ltop) no_after ltop c
856856
857857let pr_binders ~flags env sigma l : Pp.t = pr_undelimited_binders ~flags spc true (pr_expr ~flags env sigma no_after ltop) l
858+
859+ module CompactedDecl = struct
860+ type t =
861+ | LocalAssum of Id .t EConstr .binder_annot list * EConstr .types
862+ | LocalDef of Id .t EConstr .binder_annot list * EConstr .constr * EConstr .types
863+
864+ let of_named_decl = function
865+ | Context.Named.Declaration. LocalAssum (id ,t ) ->
866+ LocalAssum ([id],t)
867+ | Context.Named.Declaration. LocalDef (id ,v ,t ) ->
868+ LocalDef ([id],v,t)
869+
870+ let to_tuple = function
871+ | LocalAssum (ids , t ) -> ids, None , t
872+ | LocalDef (ids , b , t ) -> ids, Some b, t
873+ end
874+
875+ let compact_named_context sigma sign =
876+ let module NamedDecl = Context.Named. Declaration in
877+ let compact l decl =
878+ match decl, l with
879+ | NamedDecl. LocalAssum (i ,t ), [] ->
880+ [CompactedDecl. LocalAssum ([i],t)]
881+ | NamedDecl. LocalDef (i ,c ,t ), [] ->
882+ [CompactedDecl. LocalDef ([i],c,t)]
883+ | NamedDecl. LocalAssum (i1 ,t1 ), CompactedDecl. LocalAssum (li ,t2 ) :: q ->
884+ if EConstr. eq_constr sigma t1 t2
885+ then CompactedDecl. LocalAssum (i1::li, t2) :: q
886+ else CompactedDecl. LocalAssum ([i1],t1) :: CompactedDecl. LocalAssum (li,t2) :: q
887+ | NamedDecl. LocalDef (i1 ,c1 ,t1 ), CompactedDecl. LocalDef (li ,c2 ,t2 ) :: q ->
888+ if EConstr. eq_constr sigma c1 c2 && EConstr. eq_constr sigma t1 t2
889+ then CompactedDecl. LocalDef (i1::li, c2, t2) :: q
890+ else CompactedDecl. LocalDef ([i1],c1,t1) :: CompactedDecl. LocalDef (li,c2,t2) :: q
891+ | NamedDecl. LocalAssum (i ,t ), q ->
892+ CompactedDecl. LocalAssum ([i],t) :: q
893+ | NamedDecl. LocalDef (i ,c ,t ), q ->
894+ CompactedDecl. LocalDef ([i],c,t) :: q
895+ in
896+ sign |> Context.Named. fold_inside compact ~init: [] |> List. rev
0 commit comments