public static double estimatePredicateGoalFanout(Proposition goal) {
    if (goal.operator == Logic.SGT_PL_KERNEL_KB_MEMBER_OF) {
      return (Proposition.estimateMemberOfGoalFanout(goal));
    }
    { NamedDescription description = Logic.getDescription(((Surrogate)(goal.operator)));
      BooleanVector goalvector = Logic.argumentsVectorToBooleanVector(goal.arguments);

      if (description == null) {
        return (Stella.NULL_FLOAT);
      }
      { boolean testValue000 = false;

        { boolean foundP000 = false;

          { BooleanWrapper gbit = null;
            BooleanVector vector000 = goalvector;
            int index000 = 0;
            int length000 = vector000.length();
            BooleanWrapper ibit = null;
            BooleanVector vector001 = NamedDescription.getIndexingVector(description);
            int index001 = 0;
            int length001 = vector001.length();

            loop000 : for (;(index000 < length000) &&
                      (index001 < length001); index000 = index000 + 1, index001 = index001 + 1) {
              gbit = ((BooleanWrapper)((vector000.theArray)[index000]));
              ibit = ((BooleanWrapper)((vector001.theArray)[index001]));
              if ((ibit == Stella.TRUE_WRAPPER) &&
                  (gbit == Stella.TRUE_WRAPPER)) {
                foundP000 = true;
                break loop000;
              }
            }
          }
          testValue000 = foundP000;
        }
        testValue000 = !testValue000;
        if (testValue000) {
          return (NamedDescription.estimateCardinalityOfExtension(Logic.getDescription(((Surrogate)(goal.operator)))));
        }
      }
      { boolean allbitsmatchP = false;

        { BooleanVector uniquenesskey = null;
          Cons iter000 = NamedDescription.getUniquenessVectors(description).theConsList;

          for (;!(iter000 == Stella.NIL); iter000 = iter000.rest) {
            uniquenesskey = ((BooleanVector)(iter000.value));
            allbitsmatchP = true;
            { BooleanWrapper ubit = null;
              BooleanVector vector002 = uniquenesskey;
              int index002 = 0;
              int length002 = vector002.length();
              BooleanWrapper gbit = null;
              BooleanVector vector003 = goalvector;
              int index003 = 0;
              int length003 = vector003.length();

              loop002 : for (;(index002 < length002) &&
                        (index003 < length003); index002 = index002 + 1, index003 = index003 + 1) {
                ubit = ((BooleanWrapper)((vector002.theArray)[index002]));
                gbit = ((BooleanWrapper)((vector003.theArray)[index003]));
                if ((ubit == Stella.TRUE_WRAPPER) &&
                    (gbit == Stella.FALSE_WRAPPER)) {
                  allbitsmatchP = false;
                  break loop002;
                }
              }
            }
            if (allbitsmatchP) {
              return (1.0);
            }
          }
        }
        return (Logic.ESTIMATED_NUMBER_OF_PREDICATE_BINDINGS);
      }
    }
  }