Программа для читпредложение
показана на рис. 6.4. Вначале процедура читает текущий входной символ Симв, а затем передает его процедуре читостальное для завершения работы. Процедура читостальное должна правильно обработать следующие три случая:(1) Симв
- точка, тогда все сделано.(2) Симв
- пробел, - игнорировать его и читпредложение от остального ввода.(3) Симв
- буква, - сначала считать слово Слово, которое начинается с Симв, а затем запустить читпредложение, чтобы считать оставшуюся часть предложения, породив при этом Списслов. Общим результатом этого будет список [Слово | Списслов].Процедура, считывающая символы одного слова, такова:
читбуквы( Буква, Буквы, Сделсимв)
Ее три аргумента:
(1) Буква
- текущая буква (уже считанная) читаемого слова.(2) Буквы
- список букв (начинающийся с буквы Буква), оставшихся до конца слова.(3) Следсимв
- входной символ, непосредственно следующий за читаемым словом. Следсимв не должен быть буквой.Мы завершим данный пример замечанием о возможном применения процедуры
читпредложение. Ее можно использовать в программе обработки текста на естественном языке. Предложения, представленные в виде списков слов, имеют удобную форму для дальнейшей обработки при помощи Пролога. В простейшем/*
Процедура читпредложение считывает предложение и из его слов создает список атомов. Например,
читпредложение( Списслов)
порождает
Списслов=['Мэри', было, приятно, видеть, неудачу, робота]
если входным было предложение
Мэри было приятно видеть неудачу робота.
*/
читпредложение( Списслов) :-
gеt0( Симв),
читостальное( Симв, Списслов).
читостальное( 46, [ ]) :- !.
% Конец предложения: 46 = ASCII-код для ' '
читостальное( 32, Списслов) :- !,
% 32 = ASCII-код для пробела
читпредложение( Списслов).
% Пропустить пробел
читостальное( Буква, [Слово | Списслов]) :-
читбуквы( Буква, Буквы, Следсимв),
% Считать буквы текущего слова
nаmе( Слово, Буквы),
читостальное( Следсимв, Списслов).
читбуквы( 46, [ ], 46) :- !.
% Конец слова: 46 = точка
читбуквы( 32, [ ], 32) :- !.
% Конец слова: 32 = пробел
читбуквы( Бкв, [Бкв | Буквы], Следсимв) :-
get0( Симв),
читбуквы( Симв, Буквы, Следсимв).
Рис. 6. 4.
Процедура для преобразования предложения в список атомов.случае такой обработкой мог бы быть поиск во входном предложении определенных ключевых слов. Значительно более сложной задачей является понимание предложения, т. е. извлечение из него смысла, представленного в некотором избранном формализме. Это важная область исследований в искусственном интеллекте.
Упражнения
6. 4.
Определите отношениеначинается( Атом, Символ)
для проверки, начинается ли Атом
с символа Символ.Посмотреть ответ
6. 5.
Определите процедуру plural, которая преобразует английские существительные из единственного числа во множественное, добавляя к слову окончание s. Например:?- plural( table, X).
Х = tables
Посмотреть ответ
6. 6.
Напишите процедурупоиск( Ключслово, Предложение)
которая при каждом вызове находит в текущем входном файле предложение, содержащее заданное ключевое слово
Ключслово. Предложение в своей исходной форме должно быть представлено в виде последовательности символов или в виде атома (процедуру читпредложение из данного раздела можно соответственно модифицировать).Назад | Содержание | Вперёд
Назад | Содержание | Вперёд
6. 5. Ввод программ:
Передавать программы пролог-системе можно при помощи двух встроенных предикатов:
consult и reconsult. Чтобы система считала программу из файла F, нужно поставить цель?- consult( F).
В результате все предложения программы, содержащейся в F, будут использованы пролог-системой при ответе на дальнейшие вопросы пользователя. Если позже в том же сеансе произойдет "консультация" с другим файлом, предложения этого нового файла будут просто добавлены в конец текущего множества предложений.
Для того, чтобы запустить программу, не обязательно записывать ее в файл, а затем "консультироваться" с ним. Вместо чтения файла система может принимать программу прямо с терминала, который соответствует псевдофайлу
user. Добиться этого можно так:?- consult( user).
После этого система будет ожидать ввода предложений программы с терминала.