Навигация
Главная
Поиск
Форум
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
Реклама
Сейчас на сайте
Гостей: 8
На сайте нет зарегистрированных пользователей

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

Меры близости на векторах в Delphi + Блок схемы
Моделирование системы управления качеством производственного процесса на...
База данных студентов на Turbo Pascal (Списки) + Пояснительная записка

3.4. Пример: преобразование предложений


Рассмотрим программу на Прологе, которая в ответ на введенное с терминала предложение (на английском языке) печатает другое предложение, представляющее преобразованное исходное предложение. Эта программа для «ответов» программисту могла бы поддерживать следующий диалог:
Вы: you are a computer (Вы - ЭВМ)
Пролог: i am not a computer (Я – не ЭВМ)
Вы: do you speak french (Вы говорите по-французски?)
Пролог: no i speak german (Нет, я говорю по-немецки)



Хотя этот диалог может показаться натянутой, но все же осмысленной беседой, очень легко написать программу, выполняющую свою «часть» диалога. Для этого достаточно просто последовательно выполнять следующие действия:
1. Ввести предложение, набранное пользователем на терминале.
2. Заменить каждое вхождение слова you на слово i .
3. Аналогичным образом заменить are на am not.
4. Заменить french на german.
5. Заменить do на nо.
Если применить данную схему преобразования к надлежащим образом подобранным предложениям, подобным использованным в приведенном выше диалоге, то получим осмысленные преобразованные предложения. Однако эта схема применима не ко всем предложениям. Например;
Вы: i do like you (я действительно люблю вас)
Пролог: i no like i (я не люблю себя)



Но если простая программа уже написана, то впоследствии ее можно модифицировать так, чтобы она справлялась и с предложениями, подобными приведенному.
Программа на Прологе, преобразующая одно предложение английского языка в другое, может быть реализована следующим образом. Прежде всего необходимо осознать, что имеется отношение между исходным предложением и преобразованным. В связи с этим нам следует определить предикат, называемый преобразовать. Преобразовать(Х, Y) означает, что предложение X может быть преобразовано в предложение Y . Предложения X и Y удобно представлять в виде списков атомов, обозначающих слова, так что предложения могут быть записаны следующим образом: [this,is,a , sentence] (это некоторое предложение). Определив предикат преобразовать, мы могли бы обращаться к Прологу с вопросами вида
?- преобразовать([dо,you,know,french],X). (Знаете ли вы французский)



на что Пролог отвечал бы
X=[no,i,know,german] (нет, я знаю немецкий).



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



Или, иначе: это факт, что преобразование пустого списка дает пустой список. Если причины для того, чтобы рассматривать пустой список, здесь не очевидны, то последующее изложение прояснит их. Далее нам следует разобраться в том, что основные действия предиката преобразовать заключаются в следующем:
1. Заменить голову входного списка соответствующим словом и поместить это слово в выходной список в качестве головы.
2. Преобразовать хвост входного списка и сделать его хвостом выходного списка.
3. Если мы достигли конца входного списка, то к выходному списку больше ничего добавлять не надо, и мы можем завершить выходной список пустым списком [].
Переводя это на язык, более близкий к Прологу, можно сказать:
Преобразование списка с головой  H и хвостом  T дает список с головой X и хвостом Y , если замена слова  H дает слово X , а преобразование списка  T дает список Y .
Теперь следует сказать, что значит «заменить» одно слово на другое. Это может быть сделано при наличии в базе данных фактов вида заменить(Х, Y) , означающих, что слово X может быть заменено словом Y . В конце базы данных следует поместить факт-«ловушку», так как если слово не заменяется другим словом, то его следует заменить самим собой. Если сейчас не совсем понятно назначение «ловушки», то позднее, когда мы объясним, как работает программа, это должно стать ясным.
Роль такого факта-ловушки выполняет факт заменить(Х,Х), который обозначает, что слово X заменяется самим собой. Ниже приведена база данных, обеспечивающая указанные выше замены слов:
заменить(уоu,i).
заменить(аrе, [am,not]).
заменить(french,german).
заменить(dо,nо)
заменить(Х,Х). /* это факт-ловушка */



Заметим, что фраза «am not» представлена как список, так что она входит в факт как один аргумент.
Теперь можно перевести приведенный выше текст на псевдо-Прологе в настоящую программу на Прологе, помня, что запись [А|В] обозначает список, имеющий голову А и хвост В. Мы получаем нечто подобное следующему:
преобразовать([],[]).
преобразовать([Н|T],[X|Y]):-заменить(Н, X), преобразовать(Т,Y).
Первое утверждение в приведенной процедуре проверяет, является ли аргумент пустым списком. Оно же проверяет окончание списка. Как? Рассмотрим это на примере:
?- преобразовать([уоu,are,a,computer],Z).
Этот вопрос был бы сопоставлен с основным правилом для преобразовать, при этом переменная Н получила бы значение you , а переменная Т – значение [are,a,computer] . Затем была бы рассмотрена подцель заменить (you,Х) , найден подходящий факт и переменная X стала бы равной i . Так как X является головой выходного списка (в целевом утверждении преобразовать), то первое слово в выходном списке есть i . Далее, поиск соответствия для подцели преобразовать ([are, a, computer], Y) привел бы к использованию того же правила. Слово are в соответствии с имеющейся базой данных заменяется на список [am,not] , и генерируется другая подцель с предикатом преобразовать – преобразовать([а,computer], Y) . Ищется факт заменить(а,X) , но так как в базе данных нет факта заменить, первый аргумент которого равен а, то будет найден факт-ловушка, расположенный в конце базы данных, заменяющий ' а ' на ' а '. Правило преобразовать вызывается еще раз с computer в качестве головы входного списка и пустым списком [] в качестве хвоста входного списка. Как и ранее, заменить(computer, X) сопоставляется с фактом-ловушкой. Наконец, преобразовать вызывается с пустым списком на месте первого аргумента, и происходит сопоставление с первым утверждением предиката преобразовать. Результатом является пустой список, который заканчивает преобразованное предложение (напомним, что список заканчивается пустым хвостом). В заключение Пролог отвечает на вопрос, печатая
Z = [i,[am,not], a, computer]



Отметим, что фраза [am,not] появляется в списке точно в таком же виде, как она была в него вставлена.
Теперь должны быть ясны причины появления в базе данных факта преобразовать ([],[]) и факта-ловушки заменить (Х,Х) . Факты, подобные этим, часто включаются в программу, когда требуется проверить выполнение граничных условий. Из приведенного выше объяснения должно быть ясно, что выход на граничные условия происходит в случае, когда входной список становится пустым и когда оказываются просмотренными все факты для предиката заменить . В обоих случаях выхода на граничные условия необходимо выполнить определенные действия. В случае когда входной список становится пустым, необходимо завершить выходной список (вставив пустой список в его конец). Если просмотрены все факты для предиката заменить , но при этом не обнаружен факт, содержащий данное слово, то это слово должно остаться неизменным (путем замены его самим собой).

http://ecocomp.ru/: компьютерная техника, телевизоры, видео камеры и другое.
Опубликовал Kest July 09 2009 12:10:29 · 0 Комментариев · 9457 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Панель "ссылки"
Delphi 2006 - Спр...
Bitmap [для кнопок]
CoolHints2k v1.03
PBFoldder
Domen Name IP
Report
Tetris 2002
Halcyon
Керниган Б.В., Ри...
PHP 5. Полное рук...
ShadelLabel
Мониторинг сервер...
TrayIcon
Паскаль и Дельфи....
DelphiXIsoDemo1
Midi
UmEdit
Игра PackMan
WAP версия сайта

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98016
Converter AMR<-... 20298
GPSS World Stud... 17059
Borland C++Buil... 14238
Borland Delphi ... 10373
Turbo Pascal fo... 7390
Калькулятор [Ис... 6080
Visual Studio 2... 5228
Microsoft SQL S... 3674
Случайные статьи
Вычислить значение...
Методы values() и ...
Ситуации из теоремы
Прочие SQL-функци...
Сотрудник службы б...
Процедура SetPalet...
Перемещение объект...
Как организовать к...
The profit of gamb...
Коммерческие и тех...
Структура узла и с...
Ожидавшиеся распре...
Анализ общей линей...
ЛОГИЧЕСКИЕ КЛЮЧИ
Как приставка, так...
Коллекции атрибутов
Интеграция разноро...
Сколько есть всего...
Поиск файлов на De...
Природа нулевой эн...
Список таблиц в ди...

- contoso
Изменение активной...
4.3. Понимание про...
Статистика



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


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