let extend_partial_context_unifier ~(recompute: bool) ~(p_preserving: bool)
(subst: subst) (input_partner: input_partner) (context_partner: context_partner) : subst =
match context_partner.cp_partial_context_unifier with
| Some partial_context_unifier ->
(* cheap pre-check *)
(* if not recompute then
Unification.unify_substs_shallow subst partial_context_unifier;*)
Unification.unify_substs
~recompute:recompute
~p_preserving:p_preserving
subst
partial_context_unifier
| None ->
(* special case: pseudo literal v *)
if
Context.element_equal context_partner.cp_element Context.plus_v_element
||
Context.element_equal context_partner.cp_element Context.minus_v_element
then begin
failwith "extend_partial_context_unifier";
(*
Subst.set_ ~p_preserving:false ~i_preserving:false
subst
Term.v_par
(Subst.context_literal_offset input_partner.ip_index)
Term.v_term
(Subst.context_literal_offset input_partner.ip_index)
*)
end
(* special case: ignore assert gap -
automatically done as the constant context_partner
has a cached partial context unifier
else if Context.is_equal context_partner.cp_element Context.assert_element then
subst
*)
else begin
(* put context literal first,
as it is then more likely than universal context variables are bound. *)
let subst =
Unification.unify_terms_
~recompute:recompute
~p_preserving:p_preserving
subst
context_partner.cp_element.Context.el_literal.Term.atom
(Subst.context_literal_offset input_partner.ip_index)
input_partner.ip_literal.Term.atom
Subst.input_literal_offset
in
subst
end