public static void simulateGoalEvaluation(Proposition goal) {
    { Vector arguments = goal.arguments;
      boolean okP = false;

      { Keyword testValue000 = goal.kind;

        if (testValue000 == Logic.KWD_FUNCTION) {
          { boolean chooseValue000 = false;

            if (Proposition.computedPredicateP(goal)) {
              { boolean alwaysP000 = true;

                { Stella_Object arg = null;
                  Iterator iter000 = arguments.butLast();

                  loop000 : while (iter000.nextP()) {
                    arg = iter000.value;
                    if (!Logic.argumentBoundP(arg)) {
                      alwaysP000 = false;
                      break loop000;
                    }
                  }
                }
                chooseValue000 = alwaysP000;
              }
            }
            else {
              { boolean foundP000 = false;

                { Stella_Object arg = null;
                  Vector vector000 = arguments;
                  int index000 = 0;
                  int length000 = vector000.length();

                  loop001 : for (;index000 < length000; index000 = index000 + 1) {
                    arg = (vector000.theArray)[index000];
                    if (Logic.argumentBoundP(arg) &&
                        Logic.typeHasBacklinksP(Logic.ensureDeferredDescription(Logic.logicalType(arg)))) {
                      foundP000 = true;
                      break loop001;
                    }
                  }
                }
                chooseValue000 = foundP000;
              }
            }
            okP = chooseValue000;
          }
        }
        else if (testValue000 == Logic.KWD_PREDICATE) {
          if (goal.operator == Logic.SGT_PL_KERNEL_KB_MEMBER_OF) {
            okP = Logic.argumentBoundP((arguments.theArray)[1]);
          }
          else {
            { boolean chooseValue001 = false;

              if (Proposition.computedPredicateP(goal)) {
                { boolean alwaysP001 = true;

                  { Stella_Object arg = null;
                    Vector vector001 = arguments;
                    int index001 = 0;
                    int length001 = vector001.length();

                    loop002 : for (;index001 < length001; index001 = index001 + 1) {
                      arg = (vector001.theArray)[index001];
                      if (!Logic.argumentBoundP(arg)) {
                        alwaysP001 = false;
                        break loop002;
                      }
                    }
                  }
                  chooseValue001 = alwaysP001;
                }
              }
              else {
                { boolean foundP001 = false;

                  { Stella_Object arg = null;
                    Vector vector002 = arguments;
                    int index002 = 0;
                    int length002 = vector002.length();

                    loop003 : for (;index002 < length002; index002 = index002 + 1) {
                      arg = (vector002.theArray)[index002];
                      if (Logic.argumentBoundP(arg) &&
                          Logic.typeHasBacklinksP(Logic.ensureDeferredDescription(Logic.logicalType(arg)))) {
                        foundP001 = true;
                        break loop003;
                      }
                    }
                  }
                  chooseValue001 = foundP001;
                }
              }
              okP = chooseValue001;
            }
          }
        }
        else if (testValue000 == Logic.KWD_ISA) {
          okP = true;
        }
        else if (testValue000 == Logic.KWD_EQUIVALENT) {
          okP = Logic.argumentBoundP((arguments.theArray)[0]) ||
              Logic.argumentBoundP((arguments.theArray)[1]);
        }
        else {
          { OutputStringStream stream000 = OutputStringStream.newOutputStringStream();

            stream000.nativeStream.print("`" + testValue000 + "' is not a valid case option");
            throw ((StellaException)(StellaException.newStellaException(stream000.theStringReader()).fillInStackTrace()));
          }
        }
      }
      if (!okP) {
        Proposition.warnOfUnboundVariableArgument(goal);
      }
      { Stella_Object arg = null;
        Vector vector003 = arguments;
        int index003 = 0;
        int length003 = vector003.length();

        for (;index003 < length003; index003 = index003 + 1) {
          arg = (vector003.theArray)[index003];
          Logic.simulateBindVariableToValue(arg);
        }
      }
    }
  }