public static Keyword projectColumnSpecialist(ControlFrame frame, Keyword lastmove) {
    { Proposition proposition = frame.proposition;
      Stella_Object projectionarg = (proposition.arguments.theArray)[0];
      Stella_Object projectionvalue = Logic.argumentBoundTo(projectionarg);
      Stella_Object collectionarg = (proposition.arguments.theArray)[1];
      Stella_Object collectionvalue = Logic.argumentBoundTo(collectionarg);
      int selector = Stella.NULL_INTEGER;
      Stella_Object listarg = (proposition.arguments.theArray)[2];

      lastmove = lastmove;
      if ((collectionvalue == null) ||
          ((projectionvalue == null) ||
           (!Stella_Object.isaP(projectionvalue, Logic.SGT_STELLA_INTEGER_WRAPPER)))) {
        return (Logic.KWD_TERMINAL_FAILURE);
      }
      selector = ((IntegerWrapper)(projectionvalue)).wrapperValue;
      if (((Iterator)(KeyValueList.dynamicSlotValue(frame.dynamicSlots, Logic.SYM_STELLA_ITERATOR, null))) == null) {
        { Surrogate testValue000 = Stella_Object.safePrimaryType(collectionvalue);

          if (Surrogate.subtypeOfP(testValue000, Logic.SGT_STELLA_COLLECTION)) {
            { Collection collectionvalue000 = ((Collection)(collectionvalue));

              { List members = Logic.helpProjectNthColumn(selector, Logic.assertedCollectionMembers(collectionvalue000, false));

                if (members == null) {
                  return (Logic.KWD_TERMINAL_FAILURE);
                }
                return (Logic.selectProofResult(Logic.bindArgumentToValueP(listarg, Logic.createLogicalList(members), true), false, true));
              }
            }
          }
          else if (Surrogate.subtypeOfP(testValue000, Logic.SGT_LOGIC_SKOLEM)) {
            { Skolem collectionvalue000 = ((Skolem)(collectionvalue));

              { List members = Logic.helpProjectNthColumn(selector, Logic.assertedCollectionMembers(collectionvalue000, false));

                if (members == null) {
                  return (Logic.KWD_TERMINAL_FAILURE);
                }
                return (Logic.selectProofResult(Logic.bindArgumentToValueP(listarg, Logic.createLogicalList(members), true), false, true));
              }
            }
          }
          else if (Surrogate.subtypeOfP(testValue000, Logic.SGT_LOGIC_DESCRIPTION)) {
            { Description collectionvalue000 = ((Description)(collectionvalue));

              { boolean testValue001 = false;

                testValue001 = ((Vector)(KeyValueList.dynamicSlotValue(collectionvalue000.dynamicSlots, Logic.SYM_LOGIC_EXTERNAL_VARIABLES, null))) != null;
                if (testValue001) {
                  { boolean foundP000 = false;

                    { PatternVariable v = null;
                      Vector vector000 = ((Vector)(KeyValueList.dynamicSlotValue(collectionvalue000.dynamicSlots, Logic.SYM_LOGIC_EXTERNAL_VARIABLES, null)));
                      int index000 = 0;
                      int length000 = vector000.length();

                      loop000 : for (;index000 < length000; index000 = index000 + 1) {
                        v = ((PatternVariable)((vector000.theArray)[index000]));
                        if (!(Logic.argumentBoundTo(v) != null)) {
                          foundP000 = true;
                          break loop000;
                        }
                      }
                    }
                    testValue001 = foundP000;
                  }
                }
                if (testValue001) {
                  return (Logic.KWD_TERMINAL_FAILURE);
                }
              }
              if (Description.inferableP(collectionvalue000)) {
                {
                  ControlFrame.createCollectDescriptionExtensionFrame(frame, collectionvalue000);
                  KeyValueList.setDynamicSlotValue(frame.dynamicSlots, Logic.SYM_STELLA_ITERATOR, Logic.EMPTY_PROPOSITIONS_ITERATOR, null);
                  return (Logic.KWD_MOVE_DOWN);
                }
              }
              else {
                { List members = Logic.helpProjectNthColumn(selector, Logic.assertedCollectionMembers(collectionvalue000, false));

                  if (members == null) {
                    return (Logic.KWD_TERMINAL_FAILURE);
                  }
                  return (Logic.selectProofResult(Logic.bindArgumentToValueP(listarg, Logic.createLogicalList(members), true), false, true));
                }
              }
            }
          }
          else {
            return (Logic.KWD_FAILURE);
          }
        }
      }
      if (frame.down == null) {
        return (Logic.KWD_FAILURE);
      }
      { List list = Logic.helpProjectNthColumn(selector, frame.down.patternRecord.collectionList);

        ControlFrame.popFramesUpTo(frame.down);
        if (list == null) {
          return (Logic.KWD_TERMINAL_FAILURE);
        }
        return (Logic.selectProofResult(Logic.bindArgumentToValueP(listarg, Logic.createLogicalList(list), true), false, true));
      }
    }
  }