public void rollback(List<Type> saved_undet) {
        Assert.check(saved_undet != null);
        //restore bounds (note: we need to preserve the old instances)
        ListBuffer<Type> newUndetVars = new ListBuffer<>();
        ListBuffer<Type> newInferenceVars = new ListBuffer<>();
        while (saved_undet.nonEmpty() && undetvars.nonEmpty()) {
            UndetVar uv = (UndetVar)undetvars.head;
            UndetVar uv_saved = (UndetVar)saved_undet.head;
            if (uv.qtype == uv_saved.qtype) {
                uv_saved.dupTo(uv, types);
                undetvars = undetvars.tail;
                saved_undet = saved_undet.tail;
                newUndetVars.add(uv);
                newInferenceVars.add(uv.qtype);
            } else {
                undetvars = undetvars.tail;
            }
        }
        undetvars = newUndetVars.toList();
        inferencevars = newInferenceVars.toList();
    }
public void rollback ( List < Type > saved_undet ) { Assert . check ( saved_undet != null ) ; ListBuffer < Type > newUndetVars = new ListBuffer < > ( ) ; ListBuffer < Type > newInferenceVars = new ListBuffer < > ( ) ; while ( saved_undet . nonEmpty ( ) && undetvars . nonEmpty ( ) ) { UndetVar uv = ( UndetVar ) undetvars . head ; UndetVar uv_saved = ( UndetVar ) saved_undet . head ; if ( uv . qtype == uv_saved . qtype ) { uv_saved . dupTo ( uv , types ) ; undetvars = undetvars . tail ; saved_undet = saved_undet . tail ; newUndetVars . add ( uv ) ; newInferenceVars . add ( uv . qtype ) ; } else { undetvars = undetvars . tail ; } } undetvars = newUndetVars . toList ( ) ; inferencevars = newInferenceVars . toList ( ) ; }
Restore the state of this inference context to the previous known checkpoint.
Consider that the number of saved undetermined variables can be different to the current
amount. This is because new captured variables could have been added.