Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 65425
Модуль Forms 65187
Пример работы с... 64352
ТЕХНОЛОГИИ ДОСТ... 61834
Имитационное мо... 57755
Реклама
Сейчас на сайте
Гостей: 3
На сайте нет зарегистрированных пользователей

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

Обратное размещение элементов ЭВС на Delphi + Пояснительная записка
Обучающая и тестирующая программа по здаче экзамена ПДД на Turbo Pascal ...
База данных - рабочее место кассира на Delphi + бд Access

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
5.3. Ввод предложений


В этом разделе мы представим программу, которая вводит предложение с терминала и преобразует его в список атомов языка Пролог. В программе определяется предикат ввести, имеющий один аргумент. Программа должна уметь определять, где заканчивается одно вводимое слово и начинается следующее. Поэтому предположим, что слово состоит из нескольких букв, цифр или специальных литер. Буквы и цифры уже были представлены в разд. 2.1. Мы будем рассматривать одиночную кавычку ''' и дефис '-' как специальные литеры. Литеры
, ; : ? ! .
будут рассматриваться как отдельные слова. Все другие литеры являются разделителями между словами. Предложение считается законченным, когда встречается одно из слов '.', '!' или '?'. Прописные буквы автоматически преобразуются в строчные, так что одно и то же слово всегда превращается в один и тот же атом. В результате такого определения программа будет поддерживать диалог с пользователем, подобный следующему:
?- ввести(S).
The man, who is very rich, saw John's watch.
S = [the,man,',',who,is,very,rich,',',saw,'John's',watch,'.']



В действительности мы вставили в представление предложения дополнительные одинарные кавычки, чтобы выделить некоторые атомы.
Программа использует предикат get0 для ввода литер с терминала. Затруднение, связанное с предикатом get0 , состоит в том, что если литера прочитана с терминала этим предикатом, то она «ушла навсегда» и никакое другое целевое утверждение get0 или попытка вновь доказать целевое утверждение get0 не позволит получить доступ к этой литере вновь. Поэтому следует избегать возврата за точку использования get0 , если мы хотим избежать «потери» литеры, которую он читает. Например, следующая программа, которая должна вводить литеры и печатать их снова, заменяя литеры а на b (код литеры 97 на код 98 ), не будет работать:
выполнить:- заменить_литеру, выполнить.
заменить_литеру:- get0(X) = 97,!, put(98).
заменить_литеру:- get0(X), put(X).



Приведенную программу в любом случае нельзя считать хорошей, потому что она будет работать вечно. Однако рассмотрим эффект попытки доказать согласованность целевого утверждения заме-нить_литеру. Если первое правило определения предиката заме-нить_литеру используется для чтения литеры, код которой отличен от 97 , то возврат приведет к тому, что будет сделана попытка воспользоваться вместо него вторым правилом. Однако согласование целевого утверждения get0(X) во втором правиле приведет к тому, что X будет конкретизирована следующей литерой. Это объясняется тем, что доказательство исходного целевого утверждения get0 было необратимым процессом. Таким образом, эта программа в действительности не печатала бы все литеры. Она даже иногда печатала бы литеры а .
Как же программа ввести преодолеет проблемы возврата при вводе? Ответ заключается в том, что программа конструируется таким образом, что она вводит литеры с опережением на одну литеру, а проверки литеры выполняются правилом, отличным от правила, в котором эта литера была прочитана. Если литера введена в каком-то месте программы и не может быть здесь же использована, то она возвращается обратно для возможного использования другими правилами. В соответствии со сказанным предикат для ввода одного слова читать_слово в действительности имеет три аргумента. Первый предназначен для литеры, которая была получена при последнем выполнении get0 где-либо в программе, но которую оказалось невозможным использовать в месте ее получения. Второй предназначен для атома, который будет создан для прочитанного слова. Последний аргумент предназначен для литеры, следующей во вводимом предложении сразу за прочитанным словом. Для того чтобы определить, где кончается слово, необходимо ввести литеру, следующую непосредственно за словом. Эта литера должна быть сохранена, потому что она может оказаться первой литерой другого слова.
Здесь приведен текст программы:
/* Прочитать предложение */
ввести([Сл|Слс]):- get0(C), читать_слово(С,Сл,С1), остаток_предложения(Сл, С1, Слс).
/* Дано слово и литера после него, ввести остаток предложения */
остаток_предложения (Сл,_,П):- последнее_слово (Сл),!.
остаток_предложения(Сл,С,[Сл1|Слс]):- читать_слово(С, Сл, С1), остаток_предложения(Сл1,С1,Слс).
/* Ввести одно слово, имея начальную литеру и запомнив, какая литера идет после слова */
читать_слово(С,Сл,С1):- литера(С),!, name(Сл,С), get0(C1).
читать_слово(С,Сл,С2):- слово(С, Нс),!,get0(Cl),
остаток_слова(С1,Сс,С2),name(Сл,[Нс|Сс]).
читать_слово(С,Сл,С2):-get0(Cl), читать_слово (С1, Сл,С2).
остаток_слова(С,[Нс|Сс],С2):-слово(С,Нс),!,get0(Cl),остаток_слова (С1, Сс, С2 ). остаток_слова(С, [],С).
/* Эти литеры образуют отдельные слова */
литера(44) /*, */
литера(59) /*; */
литера(58) /*: */
литера(63) /*? */
литера(ЗЗ) /*! */
литера(46) /*. */
/* Следующие литеры могут встретиться внутри слова */
/* Второй факт для предиката слово преобразует прописные литеры в строчные
слово(С,С):- С › 96, С ‹ 123. /* a b… */
слово(С,М):- С › 64, С ‹ 91, M is С+ 32. /*А В… */
слово(С,С):- С › 47, С ‹ 58 /* 1 2… 9*/
слово(39,39). /* ' */
слово(45,45) /* – */
/* Следующие слова заканчивают предложение */
последнее_слово('.').
последнее_слово('!').
последнее_слово('?').



Упражнение 5.1. Объясните, для чего используется каждая переменная в приведенной программе.
Упражнение 5.2. Напишите программу, которая читает неограниченную последовательность литер и печатает ее, предварительно заменяя вхождения литеры а литерой b.
Опубликовал Kest July 09 2009 16:38:10 · 0 Комментариев · 7018 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
OnlineIP
CoolDev TipsSyste...
Сапёр
Delphi и технолог...
Delphi 7 Enterpri...
EditButton
PHP 5 в подлинник...
Delphi7 Для профе...
Image Browser [Ис...
Разработка интерн...
DelTrayIcon [Исхо...
Электронный магаз...
Xrumer 4 Platinum...
Rss Parser
Assistant
Модифицированная ...
Animation (Пример...
isoCanvas (Редакт...
Проигрыватель Mp3
Рисование PopupMenu

Топ загрузок
Приложение Клие... 100469
Delphi 7 Enterp... 87052
Converter AMR<-... 20078
GPSS World Stud... 12819
Borland C++Buil... 11831
Borland Delphi ... 8603
Turbo Pascal fo... 7039
Visual Studio 2... 4999
Калькулятор [Ис... 4799
FreeSMS v1.3.1 3542
Случайные статьи
Установка голубого...
Реализации файловы...
Лучшая реклама слу...
КАК ПИСАТЬ РЕКУРСИ...
функции AddDetails
Доменные зоны мира
6.1. ЦЕЛЬ: ПОДДЕРЖ...
Получение факса на...
Немного программир...
Содержательное опи...
Правила наследования
В предыдущих верси...
Как самому написат...
0 для совместимост...
Телефонное оборудо...
Функции ввода симв...
Что такое SEO, SEA...
вание цифровой под...
ПОСТРОЕНИЕ ЭКСПЕРТ...
Конструкторы и объ...
Подключение файла ...
Тестирование приме...
Условная компиляци...
Определить взаимно...
Где бесплатно скач...
Статистика



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


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