public static Stella_Object copyPropositionArgument(Stella_Object self, KeyValueMap mapping) {
    { Stella_Object copy = mapping.lookup(self);

      if (copy != null) {
        if (Logic.descriptionModeP()) {
          { Surrogate testValue000 = Stella_Object.safePrimaryType(copy);

            if (Surrogate.subtypeOfP(testValue000, Logic.SGT_LOGIC_PATTERN_VARIABLE)) {
              { PatternVariable copy000 = ((PatternVariable)(copy));

              }
            }
            else if (Surrogate.subtypeOfP(testValue000, Logic.SGT_LOGIC_LOGIC_OBJECT)) {
              { LogicObject copy000 = ((LogicObject)(copy));

                if (copy000.surrogateValueInverse != null) {
                  return (copy000.surrogateValueInverse);
                }
              }
            }
            else {
            }
          }
        }
        return (copy);
      }
      { Surrogate testValue001 = Stella_Object.safePrimaryType(self);

        if (Surrogate.subtypeOfP(testValue001, Logic.SGT_LOGIC_PROPOSITION)) {
          { Proposition self000 = ((Proposition)(self));

            return (Proposition.copyProposition(self000, mapping));
          }
        }
        else if (Surrogate.subtypeOfP(testValue001, Logic.SGT_LOGIC_DESCRIPTION)) {
          { Description self000 = ((Description)(self));

            if (((Vector)(KeyValueList.dynamicSlotValue(self000.dynamicSlots, Logic.SYM_LOGIC_EXTERNAL_VARIABLES, null))) != null) {
              { Description copy000 = Description.copyDescription(self000, mapping, true);

                mapping.insertAt(self000, copy000);
                return (copy000);
              }
            }
            else {
              return (self000);
            }
          }
        }
        else if (Surrogate.subtypeOfP(testValue001, Logic.SGT_LOGIC_PATTERN_VARIABLE)) {
          { PatternVariable self000 = ((PatternVariable)(self));

            throw ((StellaException)(StellaException.newStellaException("OOPS -- BUG IN 'copy-description'").fillInStackTrace()));
          }
        }
        else {
          return (self);
        }
      }
    }
  }