public static Keyword conceptPrototypeSpecialist(ControlFrame frame, Keyword lastmove) {
    { Proposition proposition = frame.proposition;
      Stella_Object renamed_Class = Logic.argumentBoundTo((proposition.arguments.theArray)[0]);
      Stella_Object prototypeargument = (proposition.arguments.theArray)[1];
      LogicObject prototype = null;

      lastmove = lastmove;
      if ((renamed_Class == null) ||
          (!Stella_Object.isaP(renamed_Class, Logic.SGT_LOGIC_DESCRIPTION))) {
        return (Logic.KWD_TERMINAL_FAILURE);
      }
      prototype = ((LogicObject)(Logic.accessBinaryValue(renamed_Class, Logic.SGT_PL_KERNEL_KB_CONCEPT_PROTOTYPE)));
      if (prototype == null) {
        { Proposition equivalence = null;

          { Object old$Context$000 = Stella.$CONTEXT$.get();
            Object old$Module$000 = Stella.$MODULE$.get();

            try {
              Native.setSpecial(Stella.$CONTEXT$, ((Description)(renamed_Class)).homeContext);
              Native.setSpecial(Stella.$MODULE$, ((Context)(Stella.$CONTEXT$.get())).baseModule);
              prototype = Logic.createHypothesizedInstance((Stella_Object.isaP(renamed_Class, Logic.SGT_LOGIC_NAMED_DESCRIPTION) ? ("proto-" + Logic.objectNameString(renamed_Class)) : "prototype"));
              { Object old$InvisibleassertionP$000 = Logic.$INVISIBLEASSERTIONp$.get();

                try {
                  Native.setBooleanSpecial(Logic.$INVISIBLEASSERTIONp$, true);
                  Logic.assertMemberOfProposition(prototype, renamed_Class);
                  equivalence = Logic.assertBinaryValue(Logic.SGT_PL_KERNEL_KB_CONCEPT_PROTOTYPE, renamed_Class, prototype);

                } finally {
                  Logic.$INVISIBLEASSERTIONp$.set(old$InvisibleassertionP$000);
                }
              }

            } finally {
              Stella.$MODULE$.set(old$Module$000);
              Stella.$CONTEXT$.set(old$Context$000);
            }
          }
          equivalence.reactToInferenceUpdate();
        }
      }
      return (Logic.selectProofResult(Logic.bindArgumentToValueP(prototypeargument, prototype, true), false, true));
    }
  }