Значит, я с бодуна вот что придумал.
Универсальный Критерий Угребищности Систем Общего Назначения. (Теорема лавсана)
Система Общего Назначения является Угребищной тогда и только тогда когда она не является Метациклическим Интерпретатором.
Другими словами: Система, не способная к построению Метасистемы в рамках самой себя, то есть не способная к описанию и изменению самой себя в своих же терминах, и при этом являющаяся Системой Общего Назначения(в какой-либо области), Угребищна.
Обратное, естественно, неверно. Если Метасистему Системы Общего Назначения можно описать другой системой, это совершенно не значит что она Угребищна, и более того, в таком случае не существовало бы концепции бутстрапа, а значит и Метациклических Интерпретаторов вообще.
Чем, в контексте языков программирования, это отличается от просто тьюринг-полноты?
Тем, что имея в руках тьюринг-полный язык, мы, естественно можем построить метасистему для этого языка на нем самом, и более того это стандартная практика(компиляторы, анализаторы кода и другие средства разработки на мейнстримных языках как правило пишутся на них самих же), но такая метасистема не будет доступна в этом же языке, покуда мы не изменим язык и ее в язык не включим, получив в итоге диалект лиспа.
Альтернативно, мы можем такую метасистему использовать как стороннее средство, связанное через стороннюю систему(скажем генерировать код и вызывать компилятор через создание процесса операционной системы в которой запускается программа на нашем тьюринг-полном языке), подтверждая тем самым десятое правило Гринспуна, и собственно тезис теоремы.
Примеры, сначала метациклических интерпретаторов:
- Универсальная машина Тьюринга
- RASP-машина
- Реляционная модель данных
- Лисп
А вот скажем примеры систем, соответствующих критерию:
- Среднестатистический современный регистровый процессор
- Большинство языков программирования, особенно со статической типизацией.
- Большинство NoSQL моделей данных или скажем иерархических моделей данных, вроде файловых систем
В частности, давайте посмотрим на C#. C# не является метациклическим интерпретатором, т.к. термины языка не являются его же объектами.
Отчасти, это компенсируется платформой .Net, для которой термины C#(но не все) объектами таки являются(System.Reflection, грядущий Roslyn и т.д.), отчасти, в самой малой степени, фичей nameof() из C# 6, но это все только отчасти.
Сама же платформа .Net критерию тоже соответствует, но, в теории из нее можно было бы сделать метациклический интерпретатор, лисп-машину, внеся лишь достаточно небольшие изменения.
Дискач.
UPD. Собственно, отличнейшую статью нашел на эту тему: http://weblog.raganwald.com/2006/11/significance-of-meta-circular_22.html