public static void evaluateFunctionProposition(Proposition self) {
    if (Stella_Object.isaP(self.operator, Logic.SGT_STELLA_SYMBOL)) {
      return;
    }
    Proposition.equateEquivalentFunctionPropositions(self);
    { NamedDescription description = Logic.getDescription(((Surrogate)(self.operator)));
      MethodSlot computation = NamedDescription.lookupConstraintFunction(description);
      Stella_Object storedvalue = null;
      Stella_Object computedvalue = null;
      int missingvalueindex = -1;

      if (computation != null) {
        { Object [] caller_MV_returnarray = new Object[1];

          computedvalue = Proposition.computeSimpleRelationConstraint(self, computation, false, caller_MV_returnarray);
          missingvalueindex = ((int)(((IntegerWrapper)(caller_MV_returnarray[0])).wrapperValue));
        }
        if (computedvalue != null) {
          if (missingvalueindex == -1) {
            Proposition.assignTruthValue(self, computedvalue);
            return;
          }
          storedvalue = Logic.valueOf((self.arguments.theArray)[missingvalueindex]);
          if (!Stella_Object.eqlP(computedvalue, storedvalue)) {
            Proposition.equateValues(self, computedvalue, storedvalue);
          }
        }
        return;
      }
      computation = NamedDescription.lookupComputationFunction(description);
      if (computation != null) {
        computedvalue = Proposition.computeRelationValue(self, computation, false);
        if (computedvalue != null) {
          computedvalue = Logic.evaluateTerm(computedvalue);
        }
        storedvalue = Logic.valueOf((self.arguments.theArray)[(self.arguments.length() - 1)]);
        if ((!Stella_Object.eqlP(computedvalue, storedvalue)) &&
            (computedvalue != null)) {
          Proposition.equateValues(self, computedvalue, storedvalue);
        }
      }
    }
  }