Вход/Регистрация
Prolog
вернуться

Неизвестно

Шрифт:

Робот пытался налить вина из бутылки.

Цель сжатие выведет его в таком виде:

Робот пытался налить вина из бутылки.

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

сжатие :-

get0( С),

put( С).

сделатьостальное( С).

сделатьостальное( 46) :- !.

% 46 -АSСII-код точки, Все сделано

сделатьостальное( 32) :- !,

% 32 - ASCII-код пробела

get( С),

put( С),

сделатьостальное( С).

сделатьостальное( Буква) :-

сжатие.

Упражнение

6. 3. Обобщите процедуру сжатие на случай запятых. Все пробелы, стоящие непосредственно перед запятой, нужно убрать, а после каждой запятой нужно поместить единственный пробел.

Назад | Содержание | Вперёд

Назад | Содержание | Вперёд

6. 4. Создание и декомпозиция атомов

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

name( A, L)

истинно, если L - список кодов ASCII, кодирующих атом. Например,

name( zx232, [122, 120, 50, 51, 50] )

истинно. Существуют два типичных способа использования name:

(1) дан атом, разбить его на отдельные символы;

(2) дан список символов, объединить их в один атом.

Примером первого случая применения предиката является программа, которая имеет дело с заказами такси и водителями. Все это представлено в программе атомами

заказ1, заказ2, водитель1, водитель2, такси1, таксилюкс

Предикат

такси( X)

проверяет, относится ли атом Х к тем атомам, которые представляют такси:

такси( Х) :-

name( X, Хспис),

nаmе( такси, Тспис),

конк( Тспис, _, Хспис).

конк( [ ], L, L).

конк( [А | L1], L2, [А | L3] ) :-

конк( L1, L2, L3).

Предикаты заказ и водитель можно определить аналогично.

Наш следующий пример иллюстрирует применение объединения отдельных символов в один атом. Мы определим предикат

читпредложение( Списслов)

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

Мэри было приятно видеть неудачу робота.

то цель читпредложение( Предложение) вызовет конкретизацию

Предложение=['Мэри', было, приятно, видеть, неудачу, робота]

Для простоты будем считать, что каждое предложение оканчивается точкой и внутри него не используются никакие знаки препинания.

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

  • Читать дальше
  • 1
  • ...
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: