public static Keyword continueCachedBindingsProof(ControlFrame frame, Keyword lastmove) {
    lastmove = lastmove;
    { Proposition goal = frame.proposition;
      Iterator iterator = ((Iterator)(KeyValueList.dynamicSlotValue(frame.dynamicSlots, Logic.SYM_LOGIC_CACHED_BINDINGS_ITERATOR, null)));

      if (iterator == null) {
        { GoalCache goalcache = ControlFrame.findGoalCache(frame);
          List cachedbindings = null;

          if (goalcache == null) {
            ControlFrame.createGoalCacheP(frame);
            return (Logic.KWD_FAILURE);
          }
          cachedbindings = goalcache.cachedBindings;
          switch (cachedbindings.length()) {
            case 0: 
              Logic.traceGoalCache("EMPTY CACHE: ", frame);
              return (Logic.KWD_FAILURE);
            case 1: 
              Logic.traceGoalCache("USED CACHED BINDING: ", frame);
              if (Logic.bindVectorOfArgumentsToValuesP(goal.arguments, ((Cons)(cachedbindings.first())))) {
                return (Logic.KWD_FINAL_SUCCESS);
              }
              else {
                return (Logic.KWD_FAILURE);
              }
            default:
              Logic.traceGoalCache("USED MANY CACHED BINDINGS: ", frame);
              iterator = ((ListIterator)(goalcache.cachedBindings.allocateIterator()));
              KeyValueList.setDynamicSlotValue(frame.dynamicSlots, Logic.SYM_LOGIC_CACHED_BINDINGS_ITERATOR, iterator, null);
            break;
          }
        }
      }
      ControlFrame.createChoicePoint(frame);
      while (iterator.nextP()) {
        if (Logic.bindVectorOfArgumentsToValuesP(frame.proposition.arguments, ((Cons)(iterator.value)))) {
          if (iterator.emptyP()) {
            return (Logic.KWD_FINAL_SUCCESS);
          }
          else {
            return (Logic.KWD_CONTINUING_SUCCESS);
          }
        }
      }
      return (Logic.KWD_FAILURE);
    }
  }