Назад | Содержание| Вперёд 6. 4. Создание и декомпозиция атомов Ч...

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

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)        Симв - точка,тогда все сделано.

(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.    Напишите процедуру

        поиск( Ключслово,Предложение)

которая при каждом вызове находит в текущемвходном файле предложение, содержащее заданноеключевое слово Ключслово. Предложениев своей исходной форме должно быть представленов виде последовательности символов или в видеатома (процедуру читпредложение изданного раздела можно соответственномодифицировать).

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









Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх