Знания и алгоритмы

Понял, что еще меня смущает в мысли о том, что

Глобальные Правила Игры должны быть расписаны в виде алгоритмов: делай раз, делай два, проверяй три, полученную сумму заноси в такую-то кассу.

Понятие алгоритма немыслимо без представления об исполнителе. Вообще, в «программистских» курсах этот вопрос обходится стороной. Например, в известном учебнике Кормена алгоритм определяется, как «любая корректно определенная вычислительная процедура, на вход которой подается некоторая величина или набор величин, и результатом выполнения которой является выходная величина или набор значений». Это сложно назвать определением, скорее, это попытка объяснить одно непонятное слово с помощью нескольких других («корректно определенная», «процедура», «вход», «результат», «выполнение»). Спорным выглядит и сужение определения алгоритма до «вычислительной процедуры». А как быть с «алгоритмом кипячения воды в чайнике»? Более общие определения вводят, явно или неявно, понятие исполнителя — то есть «чего-то» или «кого-то», кто будет выполнять определенную последовательность действий. У Кормена «исполнитель» появляется страниц через десять — когда впервые рассматривается вопрос об эффективности алгоритмов, а окончательно описывается вместе с набором инструкций в «модели RAM». Этим исполнителем оказывается что-то, моделируещее процесссор «среднестатистического» современного компьютера.

В «советском» курсе информатики, кстати говоря, «исполнитель» появлялся практически сразу же. «Робот» из учебника Кушниренко и его многочисленные клоны считать не умеют, но могут выполнять команды типа «шаг влево», «шаг вправо», «закрасить» и тому подобные. Можно ли говорить об алгоритме покраски лабиринта? Видимо, можно, так что «вычислительное» определение алгоритма оказывается слишком узким. Вообще, такое представление о самостоятельном «исполнителе» с ограниченным набором команд, говоря современным языком, это очень мощный паттерн. Лично мне оно кажется важнейшим отличием «курса Кушниренко» от некритично заимствуемых западных учебников.

Вернемся к «Глобальным Правилам Игры». Предположим, что они записаны в виде алгоритмов. Попробуем разобраться, кто же будет их исполнителями. Возьмем относительно простой случай — вопрос «какие налоги, выплаты, сборы, поборы будет платить ИП на упрощёнке«. Отноительно несложно составить алгоритмы для этого ИП. Но! Здесь возникает куча «контрагентов» — то есть налоговая инспекция, разнообразные фонды (социального страхования, Пенсионный, тысячи их), всякие пожарники и прочие звери. Для каждого из них нужен свой алгоритм по взаимодействию с этим «ИП на упрощенке» — и при этом я не разделяю налоговую инспекцию на собственно налогового инспектора, работающего с этим несчастным ИП, и его начальника.

Если говорить в терминах модели «сценариев использования», то сценарий «заплати налоги и спи спокойно» порождает огромную толпу «заинтересованных лиц» и «акторов» — для каждого из которых требуется свой алгоритм действий. Собственно, по этим алгоритмам они и живут — только называются они «должностными инструкциями» или как-то в этом духе.

Существующая запись «правил игры» — в виде продукционной базы знаний — тоже имеет свои недостатки, но и одно неоспоримое достоинство — она позволяет сравнительно просто породить все нужные алгоритмы. В принципе, это действие — порождение алгоритма из правил в «базе знаний» — достаточно неплохо формализуется, и само по себе может быть записано в виде алгоритма. Примерно это и понималось под «искусственным интеллектом» в 70-80-е годы, и надо сказать, что человечество достигло в этом определенных успехов.

Обобщая эту ситуацию, можно сказать, что «знания» — это способ компактной записи большого набора конкретных алгоритмов, пригодных для разных ситуаций. Например, «знаниями» можно назвать монтажную и принципиальную схемы прибора. Имея соответствующую квалификацию, например, инженера-технолога, можно породить алгоритм сборки прибора неграмотными унтерменшами на конвейере — то есть «технологическую карту» в духе «припаять желтый провод к клеммам такой-то и такой-то, передать дальше». Имея другую квалификацию — можно из тех же исходных данных составить алгоритм поиска неисправностей. При этом исходные данные остаются одними и теми же, меняется лишь способ их обработки.

Если вернуться на абзац раньше — то, видимо, ключевыми словами будут «достаточно легко». Обычно алгоритмы в задачах, подобных этой, строятся по какому-то описанию предметной области. Интересно, а возможна ли обратная операция и насколько она будет сложна в сравнении с «прямой»?