Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 6
На сайте нет зарегистрированных пользователей

Пользователей: 13,372
новичок: vausoz
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных - словарь терминов на Delphi + Пояснительная записка
Моделирование интернет кафе на GPSS + Отчет
Обработка задач на ЭВМ на GPSS + Пояснительная записка

9.2. Описание синтаксического анализа на языке Пролог


Основная структура данных, о которой идет речь при обсуждении задачи синтаксического анализа, представляет последовательность слов. Предполагается, что можно выделить подпоследовательности этой структуры, представляющие различные словосочетания, допустимые грамматикой, и, основываясь на этом, показать, что последовательность в целом допустима в качестве словосочетания типа предложение . Так как стандартным способом представления последовательности является список, то входные данные для синтаксического анализатора будут представлены как список языка Пролог. А какое же представление имеют сами слова? Для решаемой здесь задачи знание внутренней структуры слов представляется несущественным, так как все, что необходимо делать,- это сравнивать слова друг с другом. Поэтому естественно представлять слова как атомы языка Пролог,
Давайте разработаем программу, позволяющую определять, является ли заданная последовательность слов предложением в соответствии с приведенной выше грамматикой. Для того чтобы сделать это, программа будет должна выявить внутреннюю структуру заданных ей предложений. Далее будет показано, как разрабатывать программу, которая запоминает эту структуру и делает ее доступной для обозрения, но здесь этот вопрос не будет рассматриваться, чтобы не усложнять программу. Так как программа проверяет, является ли некоторая последовательность слов предложением, то давайте определим предикат предложение. Этот предикат использует лишь один аргумент и соответствует следующему утверждению:
предложение(Х) означает, что X является последовательностью слов, образующей грамматически правильное предложение.
Таким образом, предполагается, что можно задавать вопросы, подобные следующему:
?- предложение ([the, man, eats, the apple]).



Ответом на этот вопрос будет «да», если «the man eats the apple» является предложением, и «нет» в противном случае.
Представляется довольно неудачным, что мы должны задавать предложения искусственным способом, используя для этого списки атомов языка Пролог. Для более серьезных применений было бы желательно иметь возможность печатать английские предложения на терминале в их естественном виде. В главе 5 было показано, как может быть определен предикат ввести для того, чтобы преобразовывать напечатанное предложение в список атомов языка Пролог. Очевидно, что мы могли бы использовать этот предикат в нашем синтаксическом анализаторе, чтобы обеспечить естественный способ общения с пользователем программы. Однако здесь мы не будем прибегать к таким «косметическим» средствам, а сконцентрируем внимание на реальных проблемах собственно синтаксического анализа.
В чем состоит проверка последовательности слов на принадлежность множеству правильных предложений? В соответствии с первым правилом грамматики, исходная задача сводится к нахождению словосочетания группа_существительного в начале заданной последовательности слов, а затем словосочетания груп - па_глагола в оставшейся части последовательности. К концу этого процесса мы должны использовать в точности все слова последовательности, ни одним словом больше и ни одним словом меньше. Введем предикаты группа_существительного и группа_глагола , чтобы выразить свойства принадлежности группе существительного и группе глагола:
группа_существительного(Х) означает, что последовательность X является группой существительного. Аналогично, группа_глагола(Х) значит, что последовательность X является группой глагола.
Используя эти предикаты, мы можем дать определение предиката предложение. Последовательность X является предложением, если ее можно разбить на две подпоследовательности Y и Z , где Y – это группа_существительного , Z – группа_глагола . Так как мы представляем последовательности как списки, то у нас уже есть предикат присоединить , выполняющий разбиение списка на два других. Таким образом, можно записать:
предложение(Х):-присоединить(Y,Z,Х), группа_существительного(Y), группа_глагола(Z).
Аналогично
группа_существительного(Х):- присоединить(Y,Z,Х), определитель(Y), существительное(Z).
группа_глагола(Х):- присоединить(Y,Z,Х), глагол(Y), группа_существительного(Z).
группа_глагола(Х):- глагол(Х).



Отметим, что два правила для предиката группа_ глагола превращаются в два утверждения для нашего предиката, что соответствует двум возможным способам проверки последовательности на принадлежность классу группа_глагола . И наконец, не составляет труда написать утверждения, соответствующие правилам, вводящим слова:
определитель([the]).
существительное([аррlе]).
существительное([man]).
глагол([eats]).
глагол([sings]).



Теперь наша программа завершена. Действительно, эта программа успешно идентифицирует последовательности слов, являющиеся предложениями для приведенной грамматики. Однако, прежде чем считать задачу решенной, следует посмотреть, что в действительности произойдет, когда мы зададим вопрос о некоторой последовательности слов. Рассмотрим утверждение для предиката предложение :
предложение(Х):- присоединить(Y,Z,Х), группа_существительного(Y), группа_глагола(Z).



и следующий вопрос:
?- предложение([the, man, eats, the, apple]).
Переменная X в правиле конкретизируется значением [the, man, eats, the, apple] , а переменные Y и Z не будут конкретизированы, так что данная цель будет порождать возможные пары значений для Y и Z такие, что результат присоединения списка Z к списку Y равен X . С помощью механизма возврата будут порождены все возможные пары, по одной при каждом возврате. Цель группа_ существительного будет выполняться лишь при условии, что Y действительно приемлем как группа_существительного . Иначе она не выполняется и присоединить будет вынужден найти другое значение для Y . Так что последовательность выполнения первой части предиката предложение будет следующей:
1. Целью является предложение(thе, man, eats, the, apple]) .
2. Разбиение исходного списка на два списка Y и Z . Возможны следующие варианты разбиения;
Y = [], Z = [the,man,eats,the,apple] Y = [the], Z = [man,eats,the,apple]
Y= [the,man], Z = [eats,the,apple]
Y= [the,man,eats], Z = [the,apple]
Y= [the,man,eats,the], Z = [apple]
Y= [the, man, eats, the, apple], Z = []



3. Выбор варианта значений для Y и Z из приведенного выше списка вариантов и проверка принадлежности Y классу группа_существительного. То есть, попытка согласования подцели группа_существительного(Y).
4. Если группа_существительного выполняется для Y , то перейти к группа_глагола. Иначе возвратиться к шагу 3 и попробовать другой вариант.
Очевидно, что при таком подходе выполняется совершенно ненужный поиск. Цель присоединить(Y,Z,X) порождает множество решений, большая часть которых бесполезна и не может быть идентифицирована как группа существительного. Должен существовать более прямой путь получения решения. Как следует из нашей грамматики, группа_существительного должна содержать в точности два слова. Этим можно было бы воспользоваться, чтобы не прибегать к поиску среди возможных вариантов разбиения исходной последовательности слов. Опасность заключается в том, что это не всегда так, если мы изменяем грамматику. Даже небольшое изменение в правиле для определитель могло бы повлиять на возможную длину группы существительного, а значит и на способ идентификации группы существительного. При разработке программы было бы хорошо сохранять некоторую модульность. Если мы хотим изменить одно утверждение, то это не должно вызывать изменение программы в целом.
Таким образом, эвристика относительно длины группы существительного имеет слишком частный характер, чтобы ее использовать в программе. Тем не менее, ее можно рассматривать как частный случай некоторого общего принципа. Если мы хотим выделить подпоследовательность, которая является группой существительного, то мы можем использовать свойства этой группы, чтобы ограничить набор подходящих для этого последовательностей. Если определение группы существительного подвержено изменениям, то это можно сделать, только передав всю ответственность по проверке соответствующих свойств утверждению группа_существительного. Так как именно утверждение группа _ существительного выражает свойства, которыми обладает группа существительного, то почему не предположить, что этот предикат сам может решить, на что должна быть похожа соответствующая последовательность? Давайте потребуем, чтобы предикат группа_существительного сам решил, какая часть последовательности ему необходима и что необходимо оставить для последующей обработки предикатом группа_глагола.
Это обсуждение приводит нас к новому определению предиката группа_существительного, который теперь имеет уже два аргумента:
группа_существительного(Х, Y) истинно, если начальная часть последовательности X является группой существительного, а остальная часть последовательности есть Y .
Таким образом, можно было бы ожидать, что следующие вопросы:
?- группа_существительного([the,man,eats,the,apple], [eats, the,apple]).
?- группа_существительного([thе,аррlе,sings], [sings]).



должны иметь ответ «да». Теперь, чтобы отразить это изменение, мы должны пересмотреть определение предиката группа_существительного. Для этого надо решить, как последовательность, выбранная в качестве группы существительного, разбивается на последовательность, представляющую определитель, за которой следует последовательность, являющаяся существительным. Мы можем вновь предоставить решение задачи о том, какую часть последовательности следует выбрать, непосредственно тем утверждениям, которые обрабатывают соответствующие группы слов, положив:
группа_существительного(Х,Y):- определитель(Х,Z), существительное(Z, Y).
Таким образом, в начале последовательности X имеется группа, существительного, если мы можем выделить определитель в начале X , обозначив оставшуюся часть Z , а затем можем выделить существительное в начале Z . Часть последовательности, остающаяся после выделения группы существительного, совпадает с последовательностью, следующей за существительным. На диаграмме это выглядит так:
[the, man, eats, the, apple]
|--------------X--------------|
       |-----------Z-----------|
                |-------Y-------|



Для того чтобы все происходило так, как здесь описано, мы должны будем принять относительно предикатов определитель и существительное соглашение, подобное тому, какое мы приняли для предиката группа_существительного.
Приведенное утверждение для предиката группа_существи-тельного говорит о том, как задачу выделения группы существительного свести к задаче выделения определителя и следующего за ним существительного. Это аналогично сведению задачи разбора предложения к выделению группы существительного, за которой следует группа глагола. Все это очень абстрактно. Ничто из сказанного не говорит нам о том, как много слов входят в состав определителя, группы существительного или предложения. Эта информация должна извлекаться, исходя из нашей версии правил, которые фактически вводят английские слова. Мы вновь можем представить их в виде утверждений языка Пролог, но на этот раз мы должны добавить дополнительный аргумент, как например:
определитель([the|Х],Х).



Это правило (грамматики) выражает тот факт, что определитель стоит в начале последовательности, начинающейся со слова the . Более того, определитель занимает лишь первое слово этой последовательности и оставляет все следующие за ним.
В действительности, для того чтобы показать, как в этой группе слов «используются» слова из последовательности и какая часть последовательности остается необработанной, к каждому предикату, распознающему группу слов некоторого вида, можно добавить дополнительный аргумент. В частности, для единообразия было бы разумно сделать то же самое и с предикатом предложение . Как теперь выглядит исходная цель, с которой мы обращаемся к программе? Необходимо решить, какие два аргумента задавать в вопросе для предиката предложение . Эти аргументы обозначают последовательность, с которой начинается обработка, и последовательность, оставшуюся после ее завершения. Очевидно, что первый из аргументов – тот же самый, что мы задавали ранее в предикате предложение . Кроме того, так как мы хотим выделить предложение, которое включает в себя всю последовательность целиком, то нам надо, чтобы после того, как предложение выделено, ничего не осталось, т. е. чтобы осталась лишь пустая последовательность. Поэтому мы должны обратиться к программе следующим образом:
?- предложение(the,man,eats,the,аррlе],[]).



Посмотрим теперь, как выглядит грамматика в целом после того, как мы переписали ее с учетом обсуждавшихся выше изменений:
предложение(S0,S):- группа_существительного(S0,S1), группа_глагола(S1,S).
группа_существительного(S0,S):- определитель(S0,S1), существительное(S1,S).
группа_глагола(S0,S):- глагол(S0,S).
группа_глагола(S0,S):- глагол(S0,S1), группа_существительного(S1,S).
определитель([the|S],S).
существительное([man|S],S).
существительное([аррle|S],S).
глагол([eats|S],S).
глагол([sings|S],S).



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

Купить не дорого http://ad2go.ru/texts/ можно тут. Сео тексты необходимы для продвижения в поисковых системах.
Опубликовал Kest July 10 2009 08:09:15 · 0 Комментариев · 8657 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Факториал [Исходн...
Панель Наша Кнопка
Архив программ
Проигрыватель Mp3
Программирование ...
Delphi 2005. Разр...
Карта сайта
LaserTank [Исходн...
Еext Editor
TMS
PDPcheck
EMS QuickExport S...
Клавиатурный трен...
Geo-Whois
Введение в станда...
Панель случайной ...
Assembler. Учебни...
Программирование ...
Панель для реклам...
Применение фильтр...

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98016
Converter AMR<-... 20298
GPSS World Stud... 17059
Borland C++Buil... 14239
Borland Delphi ... 10374
Turbo Pascal fo... 7390
Калькулятор [Ис... 6080
Visual Studio 2... 5228
Microsoft SQL S... 3674
Случайные статьи
По умолчанию в ред...
Локхид
Работа с окружением
Данная книга
Мой компьютер
Поиск чисел удовле...
1.2. Вопросы
Казино Адмирал
Статические элемен...
Запуск программы
Ленивая реализация
Вызов функции poor
Примечание Консорц...
Размеры объектов к...
по любому протоколу
Компактное оформле...
Canon: как выбрать...
Настройка заголовка
Концепция программ...
Интерфейс с базой ...
Системная архитектура
Конструктор Qoob
Исследование персо...
Самая большая дыра...
• Если RAS-сервер ...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?