public static NamedDescription helpDefineRelationFromParseTree(Cons tree, String stringifiedsource) {
    { Symbol operator = ((Symbol)(tree.value));
      Symbol name = ((Symbol)(tree.rest.value));
      Cons parameters = ((Cons)(tree.rest.rest.value));
      Cons options = tree.nthRest(3);
      boolean classP = operator == Logic.SYM_LOGIC_DEFCONCEPT;
      boolean functionP = operator == Logic.SYM_LOGIC_DEFFUNCTION;
      NamedDescription description = null;

      description = Logic.getIdenticalRelation(name, stringifiedsource);
      if (description != null) {
        return (description);
      }
      { List parameternames = null;
        List parametertypes = null;
        boolean variablearityP = false;

        { Object [] caller_MV_returnarray = new Object[2];

          parameternames = Logic.parseRelationParametersTree(parameters, caller_MV_returnarray);
          parametertypes = ((List)(caller_MV_returnarray[0]));
          variablearityP = ((boolean)(((BooleanWrapper)(caller_MV_returnarray[1])).wrapperValue));
        }
        description = Logic.createPrimitiveDescription(parameternames, parametertypes, variablearityP, classP, functionP, ((Module)(Stella.$MODULE$.get())));
        Native.setSpecial(Logic.$DESCRIPTIONUNDERCONSTRUCTION$, description);
        Logic.stringifiedSourceSetter(description, stringifiedsource);
        KeyValueList.setDynamicSlotValue(description.dynamicSlots, Logic.SYM_STELLA_BADp, Stella.TRUE_WRAPPER, null);
        Logic.bindLogicObjectToSurrogate(name, description);
        Description.ensureDescriptionBody(description);
        description.processDefinitionOptions(options);
        KeyValueList.setDynamicSlotValue(description.dynamicSlots, Logic.SYM_STELLA_BADp, null, null);
        Logic.registerUnfinalizedObject(description);
        return (description);
      }
    }
  }