public static boolean inferableWithCycleCheckP(Description self, Cons alreadyvisitedlist) {
    if (alreadyvisitedlist.membP(self)) {
      return (false);
    }
    { boolean inferableP = false;

      if (Surrogate.subtypeOfP(Stella_Object.safePrimaryType(self), Logic.SGT_LOGIC_NAMED_DESCRIPTION)) {
        { NamedDescription self000 = ((NamedDescription)(self));

          { MemoizationTable memoTable000 = null;
            Cons memoizedEntry000 = null;
            Stella_Object memoizedValue000 = null;

            if (Stella.$MEMOIZATION_ENABLEDp$) {
              memoTable000 = ((MemoizationTable)(Logic.SGT_LOGIC_F_INFERABLE_WITH_CYCLE_CHECKp_MEMO_TABLE_000.surrogateValue));
              if (memoTable000 == null) {
                Surrogate.initializeMemoizationTable(Logic.SGT_LOGIC_F_INFERABLE_WITH_CYCLE_CHECKp_MEMO_TABLE_000, "(:MAX-VALUES 500 :TIMESTAMPS (:IMPLIES-PROPOSITION-UPDATE))");
                memoTable000 = ((MemoizationTable)(Logic.SGT_LOGIC_F_INFERABLE_WITH_CYCLE_CHECKp_MEMO_TABLE_000.surrogateValue));
              }
              memoizedEntry000 = MruMemoizationTable.lookupMruMemoizedValue(((MruMemoizationTable)(memoTable000)), self000, ((Context)(Stella.$CONTEXT$.get())), Stella.MEMOIZED_NULL_VALUE, null, -1);
              memoizedValue000 = memoizedEntry000.value;
            }
            if (memoizedValue000 != null) {
              if (memoizedValue000 == Stella.MEMOIZED_NULL_VALUE) {
                memoizedValue000 = null;
              }
            }
            else {
              { boolean testValue001 = false;

                testValue001 = !(self000.surrogateValueInverse == Logic.SGT_STELLA_THING);
                if (testValue001) {
                  testValue001 = (alreadyvisitedlist = Cons.cons(self000, alreadyvisitedlist)) != null;
                  if (testValue001) {
                    { boolean foundP001 = false;

                      { Proposition p = null;
                        Cons iter001 = LogicObject.applicableRulesOfDescription(self000, Logic.KWD_BACKWARD, false);

                        loop000 : for (;!(iter001 == Stella.NIL); iter001 = iter001.rest) {
                          p = ((Proposition)(iter001.value));
                          if ((!((BooleanWrapper)(KeyValueList.dynamicSlotValue(p.dynamicSlots, Logic.SYM_LOGIC_FORWARD_ONLYp, Stella.FALSE_WRAPPER))).wrapperValue) &&
                              (Proposition.trueP(p) &&
                               NamedDescription.inferableThroughBySomeDescendantP(self000, ((LogicObject)((p.arguments.theArray)[0])), alreadyvisitedlist))) {
                            foundP001 = true;
                            break loop000;
                          }
                        }
                      }
                      testValue001 = foundP001;
                    }
                  }
                }
                memoizedValue000 = (testValue001 ? Stella.TRUE_WRAPPER : Stella.FALSE_WRAPPER);
              }
              if (Stella.$MEMOIZATION_ENABLEDp$) {
                memoizedEntry000.value = ((memoizedValue000 == null) ? Stella.MEMOIZED_NULL_VALUE : memoizedValue000);
              }
            }
            inferableP = BooleanWrapper.coerceWrappedBooleanToBoolean(((BooleanWrapper)(memoizedValue000)));
          }
        }
      }
      else {
        inferableP = true;
      }
      return (inferableP);
    }
  }