- •IV. Версии языка пролог СиПролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда для разработки программ
- •Отладчик
- •Отладочные команды
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения языка
- •Квинтус Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Система программирования на Прологе фирмы Сайлоджик Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •Пролог-2 Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •Эрити Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Расширения
- •Унсв Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Турбо Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Среда разработки программ
- •Отладчик
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •V. Ответы к упражнениям Ответы к упражнениям
- •Глава 2
- •Глава 3
- •Глава 5
- •Глава 6
- •Глава 7
Глава 5
1. Процедура "читатьпредлож" воспримет предложение, занимающее более одной строчки. Если Вы наберете несколько предложений на одной строчке, то будет воспринято лишь первое из них. Что произойдет с остальными символами этой строчки, будет зависеть от вида буферизации входных данных в Вашей версии Пролога.
2. Форма записи предиката "вводстроки", вырабатывающего список слов по строке входной информации, будет различной в разных версиях Пролога. Ниже приводится простой вариант решения, предназначенный для СиПролога. Недостатком этой программы является то, что она в качестве последнего слова возвращает символ перехода к новой строке.
% вводстроки ( [W | Lw]) :— % считать строку
get0(C),
читатьслово (С, W, C1),
остатокпредл (W, C1, Lw), !.
% предыдущее слово и следующий символ введены;
% считать оставшуюся часть строки.
% + + -
остатокпредл (W, _, [ ]):—
границапредл (W), !. % конец, если предыдущим словом
% была граница предложения.
остатокпредл (W, С, [W1 | Lw]) : -
читатьслово (С, W1, C1),
остатокпредл (W1, C1, Lw).
% взять первый символ, прочитать слово, вернуть следующий
% символ.
% +.- -
читатьслово (С, W, _) :-переводстроки (С),
name(W, [С]). % построить слово по символам, % содержащимся в списке С.
читатьслово (С, W. C1) ;-
пунктуация(С), !,
name(W, [С]), % построить слово по символам,
% содержащимся в списке С.
get0(Cl).
читатьслово (С, W,C1):-
допустимый_символ (С),
!.
get0(C2),
остатокслова (С2, Lc, C1), % ввести последующие
% символы.
name(W, [С | Lc]). % построить слово.
читатьслово (С, W,C1):-
get0(C2). % символ "С" неприемлем, ввести новый
% символ.
читатьслово (С2, W, Cl). % попытаться снова.
% составлять слово из символов до тех пор, пока не
% встретится недопустимый символ
% + -
остатокслова (С, [С | Lc], Cl):- % объединить символы в список
допустимый_символ (С),
!,
get0(C2),
остатокслова (С2, LC, Cl).
остатокслова (С, [ ], С). % конец слова, если символ С
% недопустим
% символы, считающиеся самостоятельными словами:
пунктуация(44). % , пунктуация(59). % ;
пунктуация(58). %:
пунктуация(63). % ?
пунктуация(33). % !
пунктуация(46). % .
переводстроки (10). % символ перевода строки для ОС
% UNIX, VMS и т.д.
% диапазоны кодов допустимых символов:
допустимый _символ(I) - I > 96, К 123. %a—z
допустимый_символ (I) - I > 64, I < 91. % A ~ Z
допустимый_символ (I) - I>47, I < 58. %0—9
%символы, заканчивающие строку:
границапредл (' '). % перевод строки
данную задачу можно было бы решить более просто, если написать вариант процедуры "вводполя/1" (см. разд. 3.9), которая возвращала бы список всех символов строки, и другую процедуру, которая разбивала бы этот список на отдельные слова.
6. Символы ( и ) следует объявить как знаки пунктуации. Если символы : и - объявлены как допустимые, то процедура "читатьпредлож" выдает сочетание символов :— как отдельное слово, если только сразу после лото сочетания располагается пробел или символ перевода строки.
8. Довольно трудно добавить команду "суммировать" без серьезной переделки программы. Лучше всего будет связать эту команду с заключительным действием, выполняемым при обработке запроса. Так, команда "отобразить" должна приводить к тому, что заключительным действием будет обращение к процедуре "печатать_тсписок" (это сейчас выполняется но умолчанию). Команда "суммировать" должна приводить к тому, что заключительным действием будет вызов новой программы, названной, к примеру, "суммировать_тсписок". Эта программа должна суммировать все значения, передаваемые ей через аргумент {{Printlist}), и печатать итоговую сумму,
