Читать книгу: «Искусственный интеллект. Строки, контекст и волны на Паскале», страница 2
В пользу этой точки зрения стоит привести несколько фрагментов из статьи «Ноам Хомский: где искусственный интеллект пошел не туда?»:21
«… Ноам Хомский и его коллеги работали над тем, что впоследствии стало называться когнитивной наукой – открытие ментальных представлений и правил, которые лежат в основе наших познавательных и умственных способностей. Хомский и его коллеги опрокинули доминирующую в тот момент парадигму бихевиоризма, возглавляемую гарвардским психологом Б. Ф. Скиннером, в которой поведение животных было сведено к простому набору ассоциаций между действием и его следствием в виде поощрения или наказания.
…В мае 2011 года, в честь 150-летней годовщины Массачусетского технологического института, состоялся симпозиум «Brains, Minds and Machines» («Мозги, умы и машины»), на котором ведущие ученые-информатики, психологи и специалисты в области нейронаук собрались для обсуждения прошлого и будущего искусственного интеллекта и его связь с нейронауками. Подразумевалось, что собрание вдохновит всех междисциплинарным энтузиазмом по поводу возрождения того научного вопроса, из которого и выросла вся сфера искусственного интеллекта: Как работает разум? Как наш мозг создал наши когнитивные способности, и можно ли это когда-либо воплотить в машине?
Ноам Хомский, выступая на симпозиуме, не был преисполнен энтузиазма. Хомский раскритиковал сферу ИИ за принятие подхода, похожего на бихевиоризм, только в более современной, вычислительно- сложной форме. Хомский заявил, что опора на статистические техники для поиска закономерностей в больших объемах данных маловероятно даст нам объяснительные догадки, которых мы ждем от науки. Для Хомского новый ИИ – сфокусированный на использовании техник статистического обучения для лучшей обработки данных и выработки предсказаний на их основе – вряд ли даст нам общие выводы о природе разумных существ или о том, как устроено мышление. Эта критика вызвала подробный ответ Хомскому со стороны директора по исследованиям корпорации Google и известного исследователя в области ИИ, Питера Норвига, который защищал использование статистических моделей и спорил о том, что новые методы ИИ и само определение прогресса не так уж далеки от того, что происходит и в других науках. Хомский ответил, что статистический подход может иметь практическую ценность, например, для полезной поисковой системы, и он возможен при наличии быстрых компьютеров, способных обрабатывать большие объемы данных. Но с научной точки зрения, считает Хомский, данный подход неадекватен, или, говоря более жестко, поверхностен.
«Мы не научили компьютер понимать, что означает фраза „физик сэр Исаак Ньютон“, даже если мы можем построить поисковую систему, которая возвращает правдоподобные результаты пользователям, вводящим туда эту фразу…»
Еще раз уточним: задачей-минимумом нашего сегодняшнего исследования остается реализация диалоговой системы, близкой к человеческой модели мышления. И есть надежда, что технология MSM является принципиально новым подходом, способным дать нам новую пищу, иной способ исследования; вдохнуть новую жизнь в парадигму искусственного интеллекта как символьной системы, (но – не системы на естественном символьном языке).22
Глава 1. Строковые процедуры и функции на практике
Подготовка к работе в TMT-Pascal
Все, что нам первоначально потребуется для работы – скачать и установить программу компилятора TMT-Pascal.
Это можно сделать бесплатно, например, отсюда: http://pascal.sources.ru/tmt/download.htm.
Здесь можно выбрать, например, версию TMT Pascal Lite v.3.90, которая подходит для реализации наших задач.
Далее, для работы с русским языком в DOS-приложениях, нам понадобится произвести некоторые предварительные настройки. На 32-битной Windows:
В Windows XP:
В командной строке меню «Пуск» набираем команду «Regedit». Далее, вносим изменения: HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> Control -> KeyboardLayout
Здесь нужно изменить значение ключа 00000409 в папке DosKeybCodes на «ru».
Также, в файле autoexec. nt, расположенном в Windows\system32, надо добавить строку «lh %SystemRoot%\system32\kb16.com ru». После перезагрузки переключение раскладки клавиатуры в DOS-приложениях будет производиться комбинациями Ctrl+Left Shift (английская) и Ctrl+Right Shift (русская). Упомянутый метод нормально работает в том случае, если Language settings for the system в качестве Default стоит Cyrilic.
В Windows 7:
В файле Windows/sistem32/autoexec. nt вписать строки:
«lh %SystemRoot%system32dosx
lh %SystemRoot%system32kb16.com ru
set clipper=F80»
В файле Windows/sistem32/config. nt вписать:
«files=80; buffers=99».
В командной строке в меню «Пуск» через команду «rehgedit» редактируем реестр:
HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> Control -> Keyboard Layout
DosKeybCodes изменить значение параметра 0000409 на ru
Раскладка будет переключаться сочетаниями клавиш:
русский – правые Shift+Alt; английский – левые Shift+Alt.
В Windows 10:
Не требует изменений в реестре. В файле Windows/sistem32/autoexec. nt добавляем строчку – "%SystemRoot%/system32/kb16 ru».
В случае если используется 64-разрядный Windows, требуется использование приложения-эмулятора для DOS-программ «DOS-box».
Строковые данные
Работе со строковыми данными всегда уделяют слишком мало внимания. Считается, что это нечто, само-собой разумеющееся и слишком понятное, чтобы делать на них акцент. В учебниках, самоучителях любой толщины и направленности нам сильно повезет, если им уделяется хотя бы 2 страницы.
Попробуем же восполнить известные пробелы, для чего начнем с самых азов работы со строками на Паскале.
Итак, строчные переменные и константы в Паскале описываются так же, как и любые другие, например строка S: String означает что переменная S будет хранить некий набор символов, строку (в количестве от 1 до 255).23
Соответственно, декларация S: String [100] в блоке переменных обозначает, что переменная может хранить в себе последовательность элементов до 100 символов включительно. Декларировать количество символов может быть удобно, когда мы работаем с формализованными данными, например, с серией и номером документа с определенным числом символов. Но при этом следует учесть следующее: при попытке присвоения такой переменной более длинного ряда символов, не вошедшие символы будут «обрублены».
Например, описав переменную: S: String [8] следующая операция

даст в результате S=«Мама мыл» и соответственно, потерю оставшихся символов.
Также, если в одной процедуре входные или выходные переменные отличались по своему числу символов от переменных в другой процедуре или функции, компилятор вернет ошибку и укажет на разность типов переменных. В таком случае нам потребуется, чтобы число декларированных в переменных символов совпадало и не превышало 255. Если последнее условие представляет затруднения, но представляет крайнюю необходимость, помогут методы обработки длинных строк.
Длинные строки
В Паскале возможна работа с длинными строками,24 длина которых определяется не числовым значением первого байта строки, а замыкающим символом «#0». Ограничение в них определяется лишь объемом оперативной памяти или ее схемой адресации. Максимально возможная строка в таком случае ограничена числом в 65 535 символов; еще такие строки называют ASCIIZ-строками.
Для создания длинных строк, перед описанием программы следует включить директиву расширенных значений компилятора {X+}; так же следует включить и модуль Strings.
Сама строка описывается типом Pchar, который является символьным указателем и отвечает за хранение массива символов Char.
На следующем примере показан вывод строки из массива 600 символов. Здесь LongS – длинная строка, S-массив символов. В данном случае массив S поочередно заполняется символами A и B в зависимости от нечетности (Odd=true) или четности значений счетчика цикла i.

Илл. 3. Пример обработки длинной строки в программе longstring.
Далее, производится операция присвоения значений массива S переменной LongS и ее последний символ помечается символом завершения строки «#0».
Кроме того, мы можем и напрямую работать с массивами символов Char, как со строками.
В модуле Strings описываются следующие операторы для обработки ASCIIZ-строк, но мы перечислим кратко основные из них, поскольку в обычной практике они нам не потребуются:
StrCopy (S1,S2): Pchar; – Копирует строку S2 в строку S1, возвращая указатель на S1.
StrLen (S1): Integer; – Возвращает длину строки.
StrCat (S1, S2): Pchar; – Объединяет строки S1 и S2, возвращая указатель на начало строки.
StrECopy (S1, S2): Pchar; – так же объединяет строки S1 и S2, но возвращает указатель на конец строки.
StrComp (S1, S2): Integer; – Сравнивает две строки и возвращает код 0 если строки равны, положительное значение если S1> S2 и отрицательное значение если S1 меньше S2.
StrlComp (S1,S2: Pchar; L: Word): Pchar; – так же сравнивает строки, но не более числа символов, указанного в L.
StrEnd (S): Pchar – Возвращает указатель на конец строки.
StrLCat (S1, S2: Pchar; L: Word): Pchar; – функция копирует строку S2 в конец строки S1 с учетом ограничения на количество символов L.
Пример работы с массивом символов S, как с длинными строками:

Илл. 4. Обработка массива S с помощью функций StrCopy и StrLen.
В данном случае, мы присваиваем массиву значение функцией StrCopy, а затем измеряем его длину с помощью StrLen и выводим на экран.

Илл. 5. Результат работы программы Longstring.
Из недостатков работы с длинными строками выделяются:
– относительно долгие операции конкатенации (объединения двух строк) и получения числового значения их длины;
– отсутствие контроля за концом строки, (что может вызывать потери данных и критические ошибки);
– невозможность использовать символ завершающего байта (#0) в качестве элемента строки;
– громоздкость синтаксиса.
По этим причинам и ввиду особой специфики работы, – большее внимание мы уделим операциям с обычными строками.
Функция поиска
Одной из базовых функций работы с переменными строкового типа является функция поиска подстроки в строке POS (S,S2), указывающая на числовую позицию первого символа подстроки.
Например, в случае

n – должна быть переменной целочисленного типа (Integer, Word или Longint) и в данном случае получит значение 6 – позицию подстроки «мыла» в строке.
Функция Pos достаточно хороша во многих случаях, однако особенностью строчных данных может быть и такой случай, когда подстрока встречается в строке несколько раз. В таком случае функция Pos вернет первое попадание в подстроку.
Например, следующее выражение

вернет значение 2, хотя символ «а» встречается здесь несколько раз и верными могли быть также значения 4, 9 и 12.
Копирование
Если нам требуется получить фрагмент текста, являющегося частью строки, можно использовать функцию Copy (S,N1,N2); Здесь N1 определяет, с какого символа будет производиться копирование, а N2 – число копируемых символов.
Например, действие

присвоит переменной S значение «мыла». Если мы изменим числовые значения, например, на «11, 4» – в переменной S окажется слово «раму»; при «1, 4» – это будет «Мама»; а при «6, 2» в переменной окажется слово «мы».
Также, одним из ключевых элементов работы с фрагментами текста является функция Length (S), позволяющая определять длину строки, чтобы не выходить за ее рамки.
Например,

присвоит переменной n значение 14 – число символов, содержащихся в строке.25
Рассмотрим и возможности построения более сложных конструкций с символами.
Предположим, переменной S присвоено значение «Мама мыла раму»; но нам известно только, что в ней находится три слова (длина которых неизвестна) и необходимо получить первое слово из этой строки, отправив его в переменную S2. Это действие мы можем выполнить так:

– ведь мы помним, что функция Pos находит первое совпадение подстроки, а в начале строки пробела у нас нет. Так в S2 попадет слово «Мама».
Если же нам требуется скопировать текст, следующий за первым пробелом, эта процедура будет выглядеть несколько сложнее:

Здесь, в качестве позиции для отсчета мы берем место нахождения в строке первого пробела и копируем следующие за ним символы за минусом числа символов, следующих до пробела включительно. Проверить верность этой формулы можно в следующей программе:

Илл. 6. Копирование фрагмента строки с помощью функций Copy и Pos, с целью получения части текста, следующего за первым словом в строке.
Результат – можно увидеть на экране:

Илл. 7. Результат работы программы копирования фрагмента текста.
Также, предположим, что нам необходимо скопировать последнее слово из строки. В данном случае, поскольку функция «Pos» нам не поможет, придется воспользоваться циклом, чтобы «вручную» установить место нахождения последнего пробела.
Контролировать конкретный символ строки можно, используя числовое значение индекса символа в строке, при этом числовой индекс указывается в квадратных скобках S [n].
Так, в упомянутой строке S [1] =«М», S [2] =«а», s [3] =«м» и т. д. Зная общее число символов с помощью функции length (S) мы можем перебором достигнуть нужного нам символа в цикле и после произвести нужную операцию. В следующей программе мы получаем последнее слово, благодаря перебору символов с «хвоста», уменьшая значение, полученное из длины строки оператором Dec (i). Так же, на всякий случай мы уточняем условие выхода из цикла в случае, если пробел так и не будет достигнут (i <1).

Илл. 8. Копирование последнего слова из фрагмента текста с использованием цикла Repeat и строкового индекса.
Результат удовлетворяет ожиданиям.

Илл. 9. Итог работы программы (илл. 8).
Почему же в примерах мы использовали английскую транскрипцию? Очень просто, – поскольку по умолчанию в компиляторе TMT Pascal используется кодировка Win, и та же программа с русским предложением внутри даст непонятный итог:

Илл.10. Пример неудачного использования программы по работе с текстом, – из-за несовпадения кодировок ввода (Win) и вывода (DOS) удовлетворительный результат не может быть получен.
Так он будет выглядеть, несмотря на то, что формальных ошибок мы не допускали:

Илл. 11. Так выглядит фиаско при несовпадении кодировок.
И это ничто иное как слово «раму», не переведенное в Dos-кодировку.
Похожий, «никакой» результат мы получим, если, например, напишем символы «а» в строке в английской раскладке, а предложение – на русском; тогда функция Pos из поиска вернет значение отсутствия символа (0), хотя визуально нам кажется, что никакого различия в написании нет.
Эти проблемы открывают целый пласт операционных задач, связанных с кодировками.
Начислим
+7
Покупайте книги и получайте бонусы в Литрес, Читай-городе и Буквоеде.
Участвовать в бонусной программе