Глава 1. Эврика!
Многие из вас играли когда-то в одну занимательную игру. Существует множество ее вариаций, но в виде одной из них она называлась «Отгадай предмет». Смысл заключался в том, что один из игроков загадывает некий предмет (или животное, или понятие), а второй – пытается его угадать, задавая простые вопросы, на которые можно дать ответ «Да» или «Нет».
Помнится в далеком детстве я сталкивался в одной популярной книге по программированию с примером такой игры, в виде простой программы на паскале и бейсике.* (1. Очков В. Ф., Хмелюк В. А., От микрокалькулятора к персональному компьютеру, М.: Изд-во МЭИ, 1990).
Каждый новый объект там хранился в бинарном «дереве» ответов, «поворачивая» на каждой ветке ответного алгоритма «влево» на ответ «Да» или «вправо» на ответ «Нет». Здесь я процитирую авторов книги:
«В этой игре человек задумывает животное (предмет, явление), которое компьютер должен отгадать, задавая альтернативные вопросы, разбивающие множество выдумок человека на две части. Машина как бы взбирается на двоичное дерево, ветви которого (альтернативные вопросы при ответе человека (да-нет) раздваиваются. На ветвях «висят» ответы на вопросы.
Программа самообучающаяся, т.е., машина сама «выращивает» дерево вопросов и ответов, которое хранится в двух литерных массивах В (вопросы) и О (ответы) и в одном числовом Р (логические переходы, ведущие к ответу).» (с. 165)
Игра на самом деле занимательная, но имеет ряд недочетов: бинарное дерево не идеально для построения требуемого классификатора, подобного тому, что находится от природы у нас в мозге.
Тем не менее, мысль об игре в животные не давала мне покоя долгое время, и я часто возвращался к ней спустя многие годы. И в один замечательный день, (если быть точнее, ночь) все элементы этой головоломки встали на свои места.
Вспомните, как вы начинаете игру в качестве угадывающего?
Чаще всего, вашими первыми вопросами будет вроде «Это живое»? «Это животное»? «Это человек»? и другие, очень общие вопросы. То есть, интуитивно, мы отсекаем от невероятно большого количества объектов материального мира ее значительную часть, для того, чтобы сократить поиски. В результате планомерного отсечения лишнего, наступает момент, когда число определяемых объектов сужается до класса, содержащего всего несколько предметов, и заканчивается на верном варианте.
Приведу пример. Мы начинаем в качестве угадывающего.
– Это живое?
– Нет
– Это можно взять в руки?
– Да
– Этим мы пользуемся каждый день?
– Да
– Это предмет гигиены?
– Нет
– Это предмет одежды?
– Нет
– Это твердое?
– Да
– Это элемент компьютера?
– Нет
– Это тяжелое?
– Нет
– Это телефон?
– Да
Конечно, задуманный объект был не очень сложным, поэтому мы отгадали его всего за 9 попыток. И конечно, отгадывающий хитрил, действуя на основе интуиции, переключаясь на самые популярные группы объектов. Но попробуйте сами, и вы откроете самое интересное, – то, что практически любой объект, или предмет, или понятие из реального мира можно отгадать, задав от 10 до 22 вопросов. Это правило действует так или иначе, в зависимости от степени разветвленности объектных классов, с которыми мы имеем дело.
И я задумался вот над чем. А если мы сохраним каким-то образом в компьютере при описании каждого предмета реального мира его «геном», «генетический код», хранящий информацию обо всех предыдущих классах, о каждой переходной ветке на этом дереве бытия?
Таким образом, у меня возникла идея о классификаторе ВСЕГО, любого предмета или объекта, понятия, животного или явления. Если мы сможем «нарисовать» эту топографическую карту в мозге машины, то проблема разгадки механизма мышления будет решена.
Конечно же визуально классификатор будет выглядеть как дерево со множеством ветвей. Но это дерево совсем не похоже на бинарное.
В первую очередь я нарисовал наверху слово
ВСЕ
Что собственно обозначает «все сущее», «всю вселенную со всем содержимым». Если бы я был буддистом, то назвал бы этот объект Аум или Ом, – звук, появившийся перед началом вселенной.
И вниз от него две ветки – Неживое и Живое. (Рис. 1)
Пусть «ВСЕ» будет иметь название или код «А».
Рис. 1. Как можно начинать классификацию
Как вы думаете, что дальше? Как следующий объект может унаследовать признак предыдущей?
Может быть как-то так, как на рисунке 2?
Рис. 2. Как не стоит начинать классификацию
Или так, как на рисунке 3?
Рис. 3. Так тоже не стоит начинать классификацию
Совсем нет. Нам не поможет ничто подобное.
Это невероятно просто, но я еще раз даю вам шанс прийти к этой мысли самостоятельно. Мы могли бы назвать нижние ветки «B» и «С», но, тогда нам придется прикладывать дополнительные усилия по формированию дополнительных условий и правил.
Но мы сделаем по-другому.
«Неживое» мы назовем AA, а «Живое» – АВ (рис. 4).
Рис. 4. «Живое» и «Неживое» получили свои уникальные коды.
Понимаете, что произошло?
Дам вам еще один шанс.
Пусть теперь под «Живым» у нас будет несколько объектов, которые мы назовем соответственно: «Животное» – АВА, «Растение» – ABB, «Гриб» – АВС, «Бактерия» – ABD, «Вирус» – ABE. (Рис. 5).
Рис. 5. Каждый объект иерархии наследует свойства предыдущего в виде уникального кода.
Так, каждый новый объект нашего дерева начинает содержать весь блок описаний своих предков, и это очень интересное явление. Продолжим путешествие по дереву вниз, и для этого, отчасти воспользуемся действующими классификаторами животного мира. Например, мы задумали описать кошку. Под веткой «Животное» ABA рисуем ветку вниз с именем «Хордовое» – ABAA «Членистоногое» ABAB и «Моллюск» ABAC. (Рис. 6).
Рис. 6. Продолжаем углубление в структуру, разделив «Хордовых», «Членистоногих» и «Моллюсков».
Кошка это, конечно, хордовое, поэтому идем ниже и пишем следующий переходный этап «Черепное» ABAAA, после которого делаем ответвления «Млекопитающее» ABAAAA, «Птица» ABAAAB, «Рыба» АВАААС, «Земноводное» ABAAAD. (Рис. 7).
Рис. 7. Дополняем классификатор разделами «Черепное» и выходящими из него: «Млекопитающее», «Птица», «Рыба» и «Амфибия».
Под млекопитающим нарисуем «Хищное» ABAAAAA, под ним – «Волчьи» (где находятся собаки) ABAAAAAA и «Кошачьи» – ABAAAAAB, и наконец, собственно «Кошка» – ABAAAAABA. (Рис. 8).
Рис. 8. Завершаем классификацию «Кошки».
Таким образом, мы получили код живого существа, у которого в «геноме» записаны все его основные уникальные свойства, такие как «Живое» (AB) «Животное» (ABA) «Хордовое» (АВАА) «Черепное» (АВААА) «Млекопитающее» (АВАААА), «Хищное» (АВААААА) и «Кошачьи» (АВАААААВ). (Рис. 9).
Рис. 9. На этом примере видно, как всего 9 символами был зафиксирован «геном» кошки в нашем собственном классификаторе.
(Стоит заметить что в «боевой» версии программы код кошки немного отличается, но также состоит из 9 символов – ABABACBBA. Формы кодов в различных разветвленных классификаторах этого типа могут довольно существенно отличаться как по принципу построения, так и по глубине. Например,
– код «Собака» выглядит как «ABABACBCB» (9 символов);
– код «Палец» выглядит как «АААААААDAABBAABAABAAAA» (22 символа!),
– код «Физика» выглядит как «AAAAAAADAABA» (12 символов),
– код «Вилка» выглядит как «AAADAACAABAA» (12 символов),
– код «Любовь» выглядит как «AAAAAABBAAA» (11 символов).
Кстати, вы заметили, но между пальцем и физикой есть общее. Это «Физическое», – часть кода «AAAAAAADAAB», после которого их «дороги» расходятся. Но подробнее о структуре классификатора мы поговорим в 4 главе.
Что уникального в этом коде?
– Заслоняя «хвост» любого понятия, мы находим его предка. Сравнивая «голову» кода с другим – мы находим его родственника. И это только самое простейшее свойство, лежащее на поверхности.
Что является аксиомой в этом коде?
– Каждый «потомок» имеет более длинный хвост чем его «родитель».
– Каждый «родитель» имеет более короткий хвост, чем его «потомок».
– Сравнивая два кода начиная с «головы» мы найдем общего предка до момента их расхождения.
– Сохранять любой объект можно простым описанием «M это N»;
На практике это выглядит в виде формулировки, как например «Человек это гоминид», после чего в базу данных или в файл программа вносит запись типа
ABABACAAA ЧЕЛОВЕК
(Конечно, предварительно программа должна знать что такое «Гоминид», чтобы иметь возможность присвоить код новому понятию).
– Каждая новая ветка начинается с буквы А. Каждая добавочная в ряде одного порядка – следующий по значению код символа.
То есть, каждый новый уровень мы начнем с добавления «А» к коду, а если какой-то объект добавляется к существующему на одном уровне, то получим уже «В», «C», «D»… и т. д.
Начиная работу над базой кодов, я признаюсь, пытался «загуглить» некий «Классификатор всего», но не нашел. К сожалению, человечество так и не пришло к простой идее создания универсального классификатора всего сущего. Сначала мне было сложно классифицировать все неживые понятия, поскольку даже сложно представить, с чего начать. Но впоследствии дело пошло вперед.
Я начал работу над собственным классификатором, и прорисовал его графически для простоты представления в powerpoint, и на первом этапе это выглядело, как на рисунке 10.
Рис. 10. Графический пример ветвлений в начале классифицирования неживого (слева) и живого (справа).
(Левая часть рисунка – это часть классификатора наиболее разветвленного, «Неживого»). С правой частью особых проблем испытывать не пришлось, спасибо биологам и ботаникам, которые хорошо потрудились над проработкой классификации царства животных и растений.
Из рисунка видно, что схема кажется очень сложной, и запутанной, хотя здесь всего лишь около 150 базисных наименований. К моменту написания этих строк число основных объектов в базе данных моей рабочей программы уже составляет около 3000. И хотя эта схема еще слишком проста для классификации «ВСЕГО», но уже слишком сложна, чтобы изобразить ее в виде подобного двухмерного рисунка. В будущем мы обязательно это нарисуем.
Кстати говоря, мне очень импонирует, что эта схема чем-то напоминает человеческий мозг (рис. 11). Или мне кажется? Но это несущественный вопрос.
Рис. 11. Если разветвленную структуру «классификатора всего» «упаковать» в небольшом объеме, то он мог бы получить сходство со схематичным мозгом.
В принципе, нам и не нужно разбираться в сложностях классификатора, за нас это будет делать компьютерная программа.
Новые понятия в этот классификатор добавляются очень просто, с использованием легкой конструкции объяснений, к какому объекту какой принадлежит.
Посмотрим, как выглядит часть записей словаря «боевой» программы на рисунке 12.
Рис. 12. Фрагмент кодирования в словаре «боевой» (но все же, тестовой) программы.
Сохраняя новые и новые объекты и их коды в базу данных, мы получаем структуру, обладающую огромным потенциалом, которую я назвал «Многомерным строчным множеством» или «Multidimensional String Multiplicity» (англ.). (Сокращенно, можно использовать аббревиатуру MSM или «слово-множество»).