let register_literal
    (problem_literals: problem_literals) (literal: literal) (index: int) : input_partner =
  (* find the corresponding problem literal *)
  let problem_literal =
    get_problem_literal problem_literals literal
  in

  (* find the corresponding input_partner *)
  let element =
    try
      Elements.find index problem_literal.elements
    with
      | Not_found ->
          (* first occurance of this literal/index: create it *)
          let new_input_partner =
            create_input_partner problem_literals literal index
          in
          let new_element = {
            input_partner = new_input_partner;
            spaces = [];
          }
          in
            set_initial_context_partners problem_literals problem_literal new_input_partner;

            (* add new input partner *)
            problem_literal.elements <- Elements.add index new_element problem_literal.elements;
            new_element
  in
    element.input_partner