let backtrack (candidates: candidates) (retracted: choice_point) (explanation: literal list) : unit =
let explanation =
Array.of_list (
Tools.list_remove_first
(fun literal -> Term.literal_equal literal (State.left_split_literal retracted))
explanation
)
in
backtrack_invalid candidates;
backtrack_right_splits candidates;
backtrack_added candidates retracted explanation;
if Const.debug then begin
match candidates.cd_right_splits with
| [] ->
failwith "Selection_split.backtrack: no right split found"
| _ ->
()
end;
backtrack_exceeding candidates;