* @param arguments
   * @param updatemode
   * @return Proposition
   */
  public static Proposition updateTuple(Surrogate relation, Cons arguments, Keyword updatemode) {
    { boolean holdsP = relation == Logic.SGT_PL_KERNEL_KB_HOLDS;
      NamedDescription description = (holdsP ? Logic.getDescription(arguments.value) : Logic.getDescription(relation));
      Proposition proposition = null;

      if (holdsP) {
        relation = description.surrogateValueInverse;
        arguments = arguments.rest;
      }
      if (NamedDescription.functionDescriptionP(description)) {
        { Proposition definingproposition = Logic.findOrCreateFunctionProposition(relation, arguments.butLast().consify());

          proposition = Proposition.updateEquivalenceProposition(Logic.createEquivalenceProposition((definingproposition.arguments.theArray)[(definingproposition.arguments.length() - 1)], arguments.last()), updatemode);
          if (proposition == null) {
            return (definingproposition);
          }
        }
      }
      else if (NamedDescription.classDescriptionP(description)) {
        return (Logic.updateIsaProposition(arguments.value, relation, updatemode));
      }
      else {
        proposition = Logic.createProposition(Logic.SYM_STELLA_PREDICATE, arguments.length());
        proposition.operator = relation;
        { Stella_Object arg = null;
          Cons iter000 = arguments;
          int i = Stella.NULL_INTEGER;
          int iter001 = 0;

          for (;!(iter000 == Stella.NIL); iter000 = iter000.rest, iter001 = iter001 + 1) {
            arg = iter000.value;
            i = iter001;
            (proposition.arguments.theArray)[i] = arg;
          }
        }
      }
      proposition = Proposition.fastenDownOneProposition(proposition, false);
      Proposition.updatePropositionTruthValue(proposition, updatemode);
      return (proposition);
    }
  }