четверг, 20 января 2022 г.

Шеркало 05.08: (не)любимые системы программирования (Другие ч.2)

 - ЕР?

- Что такое "ЕР", Ёж, выражайся яснее, пожалуйста!

- "ЕР?" - это общепринятый радиокод такой у радистов-коротковолновиков, сокращение от английского слова "Here?", вопрос "здесь ли ты?", что непонятного, Шеркало?

- А, ясно. Тогда я  -"здесь", продолжай свои байки.


LISP

Ну, тогда в какой бы последовательности продолжить? Начну, наверное, с языка LISP, который по древности лишь совсем немного уступает Фортрану и Алголу. Акроним названия языка расшифровывается, как LISt Processing - обработка списков. Я тот язык, как и Фортран, изучал исключительно "по книжкам", и  исключительно ради научного интереса = из чистого любопытства.

Выглядел LISP изначально примерно вот так:

Я не возьмусь комментировать работоспособность программы с картинки. Тексты на LISP - это реально было ((((ооочень (мнооого) скобочек)))), вызовы функций, вот вся такая красотищща. Изначально меня слегка фрустрировали непонятные имена функций вроде "CAR", "CDR" и "CONS" (на картинке они есть!). Однако, немного позже я узнал, что CAR и CDR - это были мнемоники частей команд языка ассемблера того компьютера, на котором изначально реализовывали LISP. Компьютер тот был IBM 704. Длина машинного слова = 36 бит. Из них 15 бит отводились на значение регистра адреса (Contents of the Address part of Register CAR), а ещё 15 бит на значение регистра декремента (Cotents of the Decrement part of Register CDR). Остальные 6 бит - на код операции или другие признаки. В результате машинное слово IBM 704 делилось (почти) на две адресные половинки (на два полуслова): часть CAR отрезала начальную половинку, игнорируя хвост, часть CDR отрезала хвостовую половинку машинного слова, обнуляя его начало. Ну а команда CONS, как можно догадаться, соединяла два своих коротких "половинчатых" аргумента в одно целое машинное слово компьютера. Получалось, что изначально язык LISP был фактически довольно простой надстройкой над языком ассемблера конкретной компьютерной архитектуры IBM 704, в которой нетрадиционную работу со списками организовали, пользуясь тем, что в одно машинное слово укладывались сразу два адреса ячеек памяти. В результате, CAR указывало на голову списка, CDR - на хвост списка, но этот хвост, в свою очередь, начинался с машинного слова, первая часть которого (CAR) указывала на голову хвоста, а вторая часть слова (CDR) указывала на хвост хвоста... и так до бесконечности очень долго.

Язык LISP в то далёкое время позиционировался, как язык для программирования самого настоящего Искусственного Интеллекта. Я этого, по молодости лет абсолютно не понимал, Ну, какой, в самом деле, может быть "ИскусственныйИнтеллект(tm)" в том, чтобы отрывать в длинных списках невнятных текстов головы от хвостов, потом соединять их в другом порядке помещая головы одних списков в хвосты других списков, а потом решая, какой вариант сочетания голов и хвостов оказался наиболее оптимальным с точки зрения субъективной эрудиции? Что-то в этой схеме не так, верно?!

Позже, со второй попытки, я понял: даже во времена Фортрана и Алгола, не говоря уже о более ранних, компьютеры не могли дать учёным НИЧЕГО, кроме просто очень быстрого вычисления набора математических (по сути арифметических!) ФОРМУЛ. И вот на том фоне примитивного вычисления арифметических выражений, возможность обрабатывать списки (а это автоматически значит - возможность обходить ДЕРЕВЬЯ и произвольные ГРАФЫ решений, с той или иной степенью оптимальности) - это реально в тот момент было интеллектуальным прорывом! Ведь никакой другой язык программирования, на начало 1960-х годов с графами и деревьями оперировать же вообще никак не мог!

Теперь мой личный комментарий, про язык LISP для тебя, Шеркало. Во-первых, я сам на LISP ничего и никогда не писал. Книжку прочитал, да, впечатление получил. Но вот реально работать - не пришлось. Во-вторых, современные диалекты языка LISP (а они есть, язык и сейчас весьма живой, развивающийся!) абсолютно не похожи н картинку из 1960 года, которую я привёл выше. Но, поскольку я ими не пользуюсь, то и писать об этих диалектах я здесь не буду.


Prolog = PROgramming in LOGical

Раз уж заговорили про "ИскусственныйИнтелект(tm)", нужно обязательно упомянуть Prolog. Язык весьма нестандартный. Такие языки называют "декларативными" - есть описание фактов и правил работы с фактами, а там, якобы, сам компьютер логически выведет решение. Гениально? Вот пример простенькой программы на Turbo Prolog 2.0. Специально расшифрую, что там к чему:

Слева - сама декларативная программа.

1. Есть люди, покупатели person() - kelly и judy. Есть товары для продажи for_sale() - pizza,lemon, hot_rod.

2. Есть отношение like(X,Y) - кто из людей, что любит. Есть отношение car(X) - какой товар уже лежит в тележке/корзинке.

3. Есть правило can_buy(), которое говорит, что товары может покупать только известный программе покупатель, только если эти товары есть в списке товаров и уже лежат в тележке (car), но при условии, что покупателю этот товар нравится (like).

В правой части окна пользователь задаёт программе вопросы can_buy, может ли тот или иной покупатель купить тот или иной товар. Соответственно большинство ответов = NO, то покупатель пришёл неизвестный, то товар оказался нелюбимый, то в тележку его не положили. А вот в одном случае всё удачно совпало и can_buy(kelly,hot_rod)=YES - покупка срастается.


Пример конечно чрезмерно примитивный: в данном случае любой идиот школьник решит такую задачу в уме в 100500 раз быстрее, чем программист напишет программу на Прологе. О чём я, кстати, изначально и сам догадывался. Но взрослые умные дяди/тёти мне, школьнику, объясняли, что всё не так просто. 

А дело в том, что с середины 1980-х годов во всей популярной и специальной литературе начались непрекращающиеся экспрессивные крики, буквально лавины восторженных статей, о ВЕЛИКОЙ японской стратегии создания компьютеров аж ПЯТОГО поколения. Японцы, якобы у запада всему-всему за последние годы научились, стали жутко-жутко крутыми компьютерщиками, и теперь весь остальной мир они порвут в интеллектуальном отношении легко, как соседский пёс Тузик тряпичную куклу!!! До меня этот вал про-японской пропаганды, разумеется, доходил большей частью в русскоязычных популяризованных переводах, но умные люди по всему миру, включая известных западных учёных, явно тоже были взволнованы, считали, что нужно срочно "садиться на хвост" японскому прорыву и не отставать, а опережать его! В учебно-программистской среде только о перспективах пятого поколения и говорили, мечтали, что осталось "вот ещё чуть-чуть потерпеть...", а лучше скорее помочь личным участием.

Идеи японского пятого поколения компьютеров были очень просты. Нужно просто взять современный супер-компьютер (или несколько очень мощных мини-микро-рабочих станций, которые все вместе как раз и изобразят такой супер-компьютер), как раз эта часть стратегии пятого поколения на практике тогда вполне реализовалась. Потом научить этот супер-компьютер языку PROLOG, и запихать в него в виде аксиом и правил все-все-все современные знания (как выразить вот прям все-все-все знания в форме аксиом и правил Prolog даже на супер-пупер-компьютере, никто толком не понимал... Но с оговорками... Пусть не все-все-все, а только лишь просто все, но главное - начать!). А в результате, этот супер-компьютер при помощи языка Пролог сам за несколько дней выведет из всех возможных аксиом все возможные в науке теоремы... И... Мы же теперь самые умные сапиенсы во всей вселенной!!! УРА! Ура? Точно ура?

Результат оказался вполне ожидаем. Внезапно (хи-хи, внезапно) выяснилось, что если взять самый супер-пупер-компьютер, напихать в него из всех энциклопедических словарей мильон определений самых умных слов, а потом перемешать с помощью самой умной программы в случайном порядке все эти слова мильон раз самым хитрожопым образом, то всё равно ни разу не получится "Ромео и Джульетта" от Шекспира. И даже простенькая ерунда, вроде "Война и мир" от Толстого, тоже ни разу не получится. Что и было изначально совершенно ясно-понятно не только мне (сопливому ёжику и тогда ещё школьнику), но и всем обычным вменяемым людям тоже. 

Я сейчас утрирую, конечно, сравнивая случайное перемешивание с логическим выводом по правилам. Так делать в общем случае неправильно, но на самом деле аналогия получается очень близкая. Логические выводы из сложного набора аксиом и правил в общем случае и сводятся к простому перебору всех возможных сочетаний применения этих правил к аксиомам. Ну садятся миллион обезьян за миллион калькуляторов, начинают жать на все кнопки подряд. Да, калькуляторы "умнее", чем обезьяны, они будут работать исключительно по правилам арифметики, а на все "лишние" нажатия кнопок будут с умным видом сообщать об ошибке. Вот только толку от подобных "обезьяньих" вычислений всё равно не будет никакого. Почему же вполне вменяемые люди в этом откровенно дебильном цирке всё-таки участвовали? Нет, ну, а как же ещё деньги попилить?! Что, если мы, вроде как будем радеть за научную правду, тогда и все деньги что, тоже - совсем без нас среди других жуликов разделятся? Нет, мы так несогласные!

На быстро и бесславно ушедшем со сцены японском "пятом поколении" компьютеров эта история не закончилась. По нормальной научной инерции, идея надстройки некоего механического (из трёх блатных аккордов основных булевых функций NOT, OR, AND) искусственного интеллекта над некоей абстрактной "базой знаний" (которую никто не знал, как технически реализовать, иначе, чем на Прологе, впрочем и на Прологе тоже никто не знал как), продолжила жить и цвести. Меня в Университете, на третьем, кажись, курсе (это уже начало 1990-х), кафедра пыталась устроить на практику в тот же институт ИОА на тему разработки "Экспертных систем". С точки зрения моих преподавателей в этом не было ничего плохого, они искренне желали студенту (мне) добра, старались дать мне возможность участвовать в "перспективной" современной теме. Они реально не понимали, в чём тут подвох.

Научный руководитель вводил в курс:

- Экспертные системы - это будущее человечества! Представляешь, звонит, например, в поликлинику больной из деревни, говорит: "У меня температура 38, голова болит, и в животе бурлит".

Скорая помощь в ту деревню только на следующие сутки доедет.

Медсестра в поликлинике вводит на компьютере запрос к экспертной системе, смотрит результат на экране.

Экспертная система задаёт доп.вопросы, есть ли сыпь на пятках, с какой-стороны живота сильнее болит, и тому подобное.

В итоге, простая медсестра, при помощи всего лишь персонального компьютера, без вызова вертолёта с врачами в деревню, излечивает больного, вот! Вопросы есть?

- Есть. А если экспертная система по неясным телефонным симптомам ошибётся в диагнозе?

- А она не может ошибаться! Она обучена на 1000 реальных случаев обращений к врачам, каждый из которых провёл не менее 100 успешных диагностик. Значит, она будет выдавать диагнозы не хуже, чем 1000 средних врачей!

- Да, но те врачи имели реальный доступ к больным, могли учесть лёгкие побочные симптомы, какие-то дополнительные, слабоуловимые подсказки, то что не видно на первый взгляд, и что больной постеснялся сказать... Да, и даже 1000 средних врачей, не могут заменить одного квалифицированного специалиста в конкретной области.

- Ерунда! Никаких слабоуловимых подсказок не бывает - мы же материалисты! Анализ на глисты положительный - значит сюда, отрицательный - значит туда. ВСЁ! И никаких дополнительных подсказок! 

А насчёт "1000 не могут заменить одного специалиста"? Ну так у нас мощность компьютеров растёт с каждым годом, память под базу знаний постоянно увеличивается! Будет не 1000 средних врачей, а 1000000 плохих врачей, но количество постепенно само по себе перейдёт в качество, что, студент, Марксистко-Ленинскую философию не изучали в ВУЗе?! 100500миллионов фельдшеров совсем без врачебного опыта, но объединившие свои знания в единой автоматизированной базе, всяко-разно дадут более правильный ответ, чем единственный интеллигент с опытом, но постоянно сомневающийся в своей правоте.

Короче, в теме экспертных систем я не остался и на Прологе больше ничего не писал. И я до сих пор абсолютно не понимаю, не вижу ответа, как можно в общем виде внедрять в компьютерные программы именно знания, а не просто данные. Современный подход - нейронные сети, впечатляет, но задачу решает лишь в узко-ограниченных формах, да и там с периодическими сбоями. Ещё должен добавить, что Пролог также развивается до сих пор (хоть и очень ограниченно). И на нём, в современных версиях, вполне можно писать реальные, достаточно сложные, полезные и интересные программы. Только на других, более распространённых языках, без всякого "логического программирования", те же самые программы обычно пишутся гораздо проще! ;)

Да, Шеркало, в качестве P.S. не могу удержаться, хотел бы добавить о моём личном общении с тем самым "научным руководителем" по экспертным системам. Началось оно с того, что он показал мне моё предполагаемое будущее рабочее место - компьютер IBM PC AT. И с первых минут он стал меня знакомить со знаменитым файловым менеджером "Norton Commander", как с новейшей известной технологией работы.  Если кто не понял, то NortonCommander, он же NC - это те известные "СиниеОкошки", примерно вот такие (картинка утащена из Wikipedia):

И вот, "научный руководитель" по экспертным системам целый день рассказывал и показывал мне, как пользоваться этими окошками, как открывать на разных панельках разные диски или каталоги, и копировать файлы с одной панельки на другую. На второй день, когда выяснилось, что я вспоминаю в NC сочетания клавиш вроде Alt+F1, F5, F7 Alt+F3 и т.п. быстрее, чем он сам, и легко изменяю под свои желания вызываемое по F2 меню, хотя вижу NC второй день в своей жизни (ну не пускали меня раньше на такие "мощные" компы, чтобы одновременно и IBM PC - совместимые, и чтобы NC там был установлен, здесь первый раз увидел), его энтузиазм в отношении меня явно сильно уменьшился, хотя меня это и удивило.

А уж на третий день, когда мы очень откровенно (я по молодости не терпел недомолвок) обсудили моё отношение к ближайшей перспективе внедрения экспертных систем в эксплуатацию... Ну...

В итоге, 

1) меня быстренько, прямо в следующий понедельник, перенаправили на практику в совсем другой отдел ИОА (где, кстати, я успешно прижился, все были взаимно довольны);

2) у меня на всю жизнь осталась любовь к тем самым "СинимОкошечкам", но конечно уже не в варианте NC, время которого ушло вместе с DOS, а в великолепном варианте FAR Manager, которым я продолжаю пользоваться минимум последние 30 лет, и до сих пор ничуть им не разочарован.

Комментариев нет:

Отправить комментарий