Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программы классификации 49 9 Программа классифи...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
944.13 Кб
Скачать

Упражнения

1. Для улучшения алгоритма поиска в глубину можно добавить еще одно усовершенствование, а именно, ввести ограничение на глубину поиска. Программная реализация этого ограничения сводится к уменьшению на единицу величины предела глубины при каждом рекурсивном обращении и проверке, чтобы этот предел не стал отрицательным. Напишите процедуру поиска в глубину с ограничением глубины.

3.6. Использование структур

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

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

Структуры состоят из нескольких компонент. Например, дату можно рассматривать как структуру, состоящую из трех компонент: день, месяц, год. Для того чтобы объединить компоненты в структуру, требуется выбрать функтор, например, data. Тогда дату «20 февраля 2000 года» можно записать так:

data( 20, february, 2000 )

То есть функтор есть имя связи, в которую включены аргументы.

Все компоненты в данном примере являются константами. Компонентами структуры могут быть также переменные или другие структуры, в том числе эти же самые. Таким образом, структура относится к рекурсивному типу данных. Структуры всегда выступают в качестве аргументов предикатов.

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

Например, структуры data(D, M, 2003) и data(D1, may, Y1) сопоставимы. Конкретизацией, которая делает эти структуры идентичными, является следующая:

  • D = D1

  • M = may

  • Y1 = 2003.

С другой стороны, структуры data(D, M, 2003) и data(D1, may, 2006) не сопоставимы

3.6.1. Объявление структур

Структура данных в Прологе задается на составной области определения (третий способ указания Domains). Для задания структуры выбирается ее имя, далее после знака «равно» записываются функторы-альтернативы данной структуры. Альтернативы перечисляются через точку с запятой. Структура может быть без альтернатив, т.е. иметь один функтор. Функтор может иметь аргументы – компоненты структуры, либо функтор может быть объявлен без аргументов. Компонентами структуры могут быть простые типы Пролога или другие структуры, в том числе те же самые, что порождает рекурсивные описания, которые могут описывать объекты сложных типов (деревьев).

Общая форма описания структур

Domains

region = functor1(d1,d2,...); functor2(d3,d4,...);...

где region объявляет сложную область(структуру),

functor1,functor2 – имена альтернатив составной области,

d1,d1,...,d3,d4 – один из типов Пролога, стандартный или определенный ранее в программе в Domains (указание типов может отсутствовать вместе со скобками).

Примеры описания структур:

Domains

data = dat( integer, string, integer )

object = int( integer ); str( string )

mesto = left; right .

После описания структур можно приступать к объявлению предикатов:

Predicates

anyday( data )

state( mesto )

Далее записываем клозы объявленных предикатов:

Clauses

anyday( dat (1, may, 2003) ).

anyday( dat (15, june, 2001) ).

state( right ).

state( left ).

Определим еще одну область Domains – список структур:

Domains

objects = object *

Тогда можно объявить список, содержащий целые числа и строки:

Predicates

list( objects )

Clauses

list( [ int(25), int(33), str(asd), str(qwe), int(38) ] ).

Примеры рекурсивных описаний структур данных:

Domains

domains

treetype = tree( treetype, integer, treetype); empty

EXP = var( STRING );

plus( EXP, EXP );

mult( EXP, EXP )

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

Predicates

TREE( treetype )

s_exp( EXP )

то для них можно записать клозы-факты. Пусть наше выражение «x + y * z». Префиксная форма записи:

Clauses

s_exp( plus( var ( x ), mult ( var ( y ), var ( z )))).

Д ля небольшого дерева факт, задающий его, будет следующий:

Clauses

TREE( tree( tree( empty, 3, empty ), 6, tree( tree( empty, 2, empty ), 5, tree( empty, 7, empty ) ) ) ).

Эти описания мы будем использовать дальше.

Рассмотрим ряд примеров с использованием структур.