public static Proposition fastenDownOneProposition(Proposition self, boolean dontcheckforduplicatesP) {
    if (Proposition.nativeSlotPropositionP(self)) {
      return (self);
    }
    if (!(((Boolean)(Logic.$LOADINGREGENERABLEOBJECTSp$.get())).booleanValue())) {
      Proposition.surrogatifyDiscouragedArguments(self);
    }
    { Proposition duplicate = null;

      if (!(dontcheckforduplicatesP ||
          (((Boolean)(Logic.$DONT_CHECK_FOR_DUPLICATE_PROPOSITIONSp$.get())).booleanValue() ||
           ((Boolean)(Logic.$LOADINGREGENERABLEOBJECTSp$.get())).booleanValue()))) {
        duplicate = Proposition.findDuplicateProposition(self);
      }
      if (duplicate != null) {
        {
          if (!Stella_Object.equalP(((PropertyList)(KeyValueList.dynamicSlotValue(duplicate.dynamicSlots, Logic.SYM_LOGIC_ANNOTATIONS, null))), ((PropertyList)(KeyValueList.dynamicSlotValue(self.dynamicSlots, Logic.SYM_LOGIC_ANNOTATIONS, null))))) {
            Proposition.clearPropositionAnnotations(duplicate);
            KeyValueList.setDynamicSlotValue(duplicate.dynamicSlots, Logic.SYM_LOGIC_ANNOTATIONS, ((PropertyList)(KeyValueList.dynamicSlotValue(self.dynamicSlots, Logic.SYM_LOGIC_ANNOTATIONS, null))), null);
            Proposition.finalizePropositionAnnotations(duplicate);
            Proposition.evaluateNewProposition(duplicate);
          }
          return (duplicate);
        }
      }
      else {
        {
          if (!(((BooleanWrapper)(KeyValueList.dynamicSlotValue(self.dynamicSlots, Logic.SYM_LOGIC_DESCRIPTIVEp, Stella.FALSE_WRAPPER))).wrapperValue ||
              Logic.descriptionModeP())) {
            if (!((Boolean)(Logic.$LOADINGREGENERABLEOBJECTSp$.get())).booleanValue()) {
              Logic.logNewlyConceivedProposition(((Module)(Stella.$MODULE$.get())), self);
            }
          }
          if (!((Boolean)(Logic.$LOADINGREGENERABLEOBJECTSp$.get())).booleanValue()) {
            Proposition.rewrapPropositionArguments(self);
          }
          if (!((Boolean)(Logic.$LOADINGREGENERABLEOBJECTSp$.get())).booleanValue()) {
            { Stella_Object arg = null;
              Vector vector000 = self.arguments;
              int index000 = 0;
              int length000 = vector000.length();

              for (;index000 < length000; index000 = index000 + 1) {
                arg = (vector000.theArray)[index000];
                Logic.addDependentPropositionLink(arg, self);
              }
            }
          }
          Proposition.updateDescriptionExtension(self);
          KeyValueList.setDynamicSlotValue(self.dynamicSlots, Logic.SYM_LOGIC_UNFASTENEDp, null, null);
          Proposition.finalizePropositionAnnotations(self);
          Proposition.evaluateNewProposition(self);
          return (self);
        }
      }
    }
  }