Я думаю, что имена должны помочь:
Names ["string"] дает список
названия символов, которые соответствуют
строка.
Если Names ["foo"] возвращает {}, тогда не должно быть определений для foo, в противном случае он должен возвращать {"foo"}.
Таким образом, ваша функция «определена» может быть выполнена как:
defined[str_] := Names[str] != {}
По крайней мере, для символов, потому что это не работает для "7", так как 7 не является символом. Вы можете обрабатывать этот случай отдельно, например, с помощью NumberQ.
Кроме того, вы можете использовать Symbol для создания символа из строки (полезно для автоматической генерации символов) и Definition для проверки определений символа.
Символ ["имя"] относится к символу с
указанное имя.
Определение [символ] печатается как
определения даны для символа.
EDIT : Лучше, чем смотреть, что возвращает Names, NameQ ["name"] сообщает вам, существует ли данное имя. Тем не менее, он не сообщает вам, имеет ли символ явное определение, только то, что он был упомянут.