НОВОСТИ   БИБЛИОТЕКА   ЮМОР   КАРТА САЙТА   ССЫЛКИ   О САЙТЕ  




предыдущая главасодержаниеследующая глава

5.1. Реляционная база знаний

Для демонстрации основных положений в настоящем разделе* будет использоваться информация о матчах команд английской футбольной лиги. Эти данные обладают хорошо упорядоченной однородной структурой, т. е. качеством, редко встречающимся в большинстве реальных баз данных, но позволяющим более просто усвоить основные принципы их построения. Между тем, описываемые ниже методы легко могут быть применены для данных других типов.

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

Информация о матчах представлена в следующем виде:

Дома

Команда p w d l f a

Arsnl 12 4 1 1 9 6

(Арсенал)

В гостях

w d l f a Очки

2 2 2 6 6 21

Для обозначения названий команд используются сокращения из пяти букв: одинаковый формат названий облегчает их вывод на экран. Для каждой команды, после общего числа сыгранных матчей (р), отдельно для игр на своем поле и в гостях (на поле соперника) перечисляются следующие данные: число выигранных матчей (w), число проигранных (1) и сведенных вничью игр (d), а также число забитых (f) и пропущенных (а) мячей. Наконец, последним в этом ряду стоит количество очков, набранных данной командой в сезоне.

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

Следует также учесть, что хранение общего числа сыгранных матчей приведет к потерям во времени при еженедельном обновлении информации. Аналогичные выводы могут быть сделаны по поводу показателя "Очки", так как он может быть вычислен по формуле w*3 + d, где w и d - общее число выигранных и сведенных вничью матчей. Для начала договоримся не запоминать указанные два показателя, а вычислять их при поступлении запросов.

Рассмотренные выше показатели каждой команды объединяются в список, состоящий из двух аналогичных друг другу подсписков, первый из которых состоит из показателей для игр, проведенных дома, а второй - для матчей на чужих стадионах. Соответствие между названиями команд и списками показателей устанавливается с помощью отношения form (сформированная-строка-показателей), например, следующим образом:

Arsnl form ((4 1 1 9 6) (2 2 2 6 6)).

Все команды лиги играют только с командами своей подгруппы. Поэтому можно для каждой подгруппы использовать отдельную программу. Такие программы будут работать быстрее, чем одна общая для всей лиги. В начале каждого сезона необходимо проводить инициализацию таблиц для каждой подгруппы. Для этой цели можно использовать отношение setup (установить-начальные-значения):

X setup if

(team X) is-told and

(X form (∅∅∅∅∅) (∅∅∅∅∅) add

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

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

all (: X setup)

[определить все (: X установить-начальные-значения)]

Team X ? ans Mnutd

[команда X ? ответ Манчестер-Юнайтед]

Team X ? ans Lpool

(команда X ? ответ Ливерпуль]

Team X ? ans Chlse

[команда X ? ответ Челси]

Team X ? just Arsnl

[команда X ? последний ответ Арсенал]

No (more) answers

[Ответов (больше) нет]

В этом случае по команде list form будет выдана следующая информация, представляющая собой начальный вариант таблицы первенства:

Mnutd form ((∅∅∅∅∅) (∅∅∅∅∅))

Lpool form ((∅∅∅∅∅) (∅∅∅∅∅))

Chlse form ((∅∅∅∅∅) (∅∅∅∅∅))

Arsnl form ((∅∅∅∅∅) (∅∅∅∅∅)) ...

После того, как подгруппа сформирована, отношение setup может быть удалено.

При вводе могут быть допущены ошибки или появится какая-либо причина для внесения исправлений в таблицу. Можно было бы воспользоваться командой редактирования для формирования таблицы, но лучше применять для этой цели специальные средства, например, приведенное ниже отношение correct (исправить):

X correct if

(team X form ((Y Z x у z) (XI Yl Zl xl yl))) is-told and

(X form ((Y Z x у z) (XI Yl Zl xl yl))) add and

(X form zl) delete

Следующий диалог демонстрирует использование данного отношения:

all (X: X correct)

[определить все (X: X изменить)]

Team X form ((Y Z х у z) (XI Yl Zl xl yl)) ? just Mnutd 6 ∅∅ 15 ∅ 5 1 ∅ 15 4

[команда X формировать ((Y Z x у z) (XI Yl Zxl yl)) ? nocледний-ответ Манчестер-Юнайтед 6∅∅ 15 ∅ 5 1 ∅ 15 41

Mnutd

[Манчестер-Юнайдет]

No (more) answers

[Ответов (больше) нет]

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

Таблица 5.1 Вариант заполнения турнирной таблицы
Таблица 5.1 Вариант заполнения турнирной таблицы

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

all (x: х form ((у | z) X) and у LESS 4)

((2 4 0 8 5) (1 2 3 7 11))

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

all (х у: х form (Y | z) X) and у LESS 4)

Mnutd 6

Lpool 6

Chlse 6

Q-P-R 5

No (more) answers

Следующий пример демонстрирует возможность использования средств Пролога для составления списков:

all (х у z: х form (X (z z z | Z)) and

у form (Y (z 7 z- Zl)) and

x LESS y) Arsnl AVlla 2

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

Упражнение 5.1

Составьте запросы для получения:

1) числа игр, проведенных данной командой дома;

2) числа игр, проведенных данной командой на чужих стадионах;

З)общего числа игр, проведенных данной командой;

4)числа очков, набранных данной командой;

5)списка команд, имеющих число забитых мячей больше, чем у команды Вест Хэм (Wsthm).

Упражнение 5.2

Составьте отношения, с помощью которых можно найти:

1) название команды, оказавшейся наиболее результативной в играх, проведенных дома;

2) название команды, оказавшейся наиболее результативной в играх, проведенных на чужих полях;

3) название команды, забившей наибольшее число мячей во всех играх.

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

Запросы получаются длинными, к тому же составлять их не так просто. Доступ к информации хорошо организованной базы данных должен быть простым и удобным для пользователя. Отношения, определенные в программе 5.1, позволяют легко делать запросы для получения информации, аналогичной той, которая требовалась в упражнениях 5.1 и 5.2.

Программа 5.1

X htop Y if

h goals Z and

Y max Z and

form (X((x y z Y X1)Y1))

X stop Y if

agoals Z and

Y max Z and

form (X(x(y z X1 Y Y1)))

X alltop Y if

allgoals Z and

Y max Z and

form (X ((x у z X1 Y1) (Z1 x1 y1 z1 X2))) and

SUM (X1 z1 Y)

h goals X if

X isall (X: form (Y ((Z x у X z) X1)))

agoals X if

X isall (X: form (Y (Z (x у z X X1))))

allgoals X if

X isall (X: form (Y ((Z x у z X1) (Y1 Z1 x1 у1 z1))) and

SUM (z у 1 X))

X max Y if

X ON Y and

(forall Z ON Y and not Z EQ X then Z LESS X) and

Приведем краткую характеристику функций, реализуемых отношениями программы 5.1:

htop - поиск команды, оказавшейся наиболее результативной в играх на своем поле;

atop - поиск команды, забившей наибольшее число голов в играх на чужих полях;

alltop - поиск наиболее результативной команды;

hgoals - получение списка, каждый элемент которого представляет собой общее число мячей, забитых командой в играх, проведенных дома;

agoals - получение списка, каждый элемент которого представляет собой общее число мячей, забитых командой в матчах на чужих полях;

allgoals - получение списка, каждый элемент которого представляет собой общее число забитых командой мячей;

max - поиск максимального элемента в произвольном cписке.

К программе 5.1 можно обратиться, например, следующим образом:

all (x у: х htop у)

[определить все (х у: х забито-наибольшее-число-мячей у) 1

Wtfrd 19

[Вутфорд 19]

No (more) answers

[Ответов (больше) нет]

Упражнение 5.3

Напишите запросы, которые позволили бы определить команду, имеющую:

1) наибольшее число забитых мячей как дома, так и в гостях;

2) наибольшее число забитых мячей во всех играх и в играх дома;

3) наибольшее число забитых мячей во всех играх и в играх на чужих полях.

В зависимости от дальнейшего использования базы данных программист может дополнить программу другими отношениями. Если понадобятся сведения о максимальных значениях других показателей, то соответствующие отношения могут быть составлены по аналогии с приведенными в программе 5.1. Однако в том случае, когда нужно получать показатели по какой-либо одной команде, в качестве образца можно взять программу 5.2. Если же необходимы оба типа информации, указанные программы могут быть объединены в одну.

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

Когда разработка программ полностью завершена, их следует оформить в виде модулей.

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

Поэтому для их записи на внешние запоминающие устройства требуется меньше времени.

Программа 5.2

(X Y) match ((XlZ)(Y|x))

(XY)match((Z|x)(y|z))if

(XV) match (xz)

result (won drew lost for against)

X hrec (Y Z) if

result x and

X form (y z) and

(YZ) match (xy)

X arec (Y Z) if

result x and

X form (y z) and

(Y Z) match (x z)

X rec(YZ)if

X hrec (Y x) and

X arec (Y y) and

В программе 5.2 отношение hrec позволяет получать показатели по играм, проведенным дома, arec - по играм на чужих . полях и, наконец, rеc - по всем играм. Ниже приведен пример использования данной программы:

all (x: Mnutd rec х)

[определить все (х : Манчестер-Юнайтед все-игры х)]

(won 11)

[побед 11]

(drew 1)

[ничьих 1]

(lost ∅)

[проигрышей ∅]

(for 3∅)

[забито 3∅]

(against 4)

[пропущено 4]

No (more) answers

[Ответов (больше) нет]

Вот другой пример использования программы 5.2, когда требуется получить для всех команд значения одного показателя:

all (x scored у goals: x Fee (for у))

[х забил у голов : х все-игры (забито у)]

Mnutd scored 30 goals

[Манчестер-Юнайтед забил 30 голов]

Lpool scored 27 goals...

[Ливепуль забил 27 голов]

и т. д.

Упражнение 5.4

С помощью программы 5.2 напишите запросы, позволяющие, определить:

1) все команды, забившие больше 20 голов;

2) все команды, забившие в играх дома голов больше, чем Эвертон (Evrtn);

3) все команды, забившие одинаковое число голов (требуется также вывести и число голов);

4) все команды, которые больше игр сыграли вничью, чем проиграли;

5) все команды, проигравшие больше матчей дома, чем Арсенал (Arsnl) выиграл на чужих стадионах.

предыдущая главасодержаниеследующая глава








© Злыгостев А.С., 2001-2019
При использовании материалов сайта активная ссылка обязательна:
http://informaticslib.ru/ 'Библиотека по информатике'
Рейтинг@Mail.ru
Поможем с курсовой, контрольной, дипломной
1500+ квалифицированных специалистов готовы вам помочь