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




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

3.4. Правила или знания

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

В качестве примера рассмотрим новый формат отношения stat:

Bill stat ((25 1 1943 Leeds) ...)

Многоточие свидетельствует о том, что оставшаяся часть отношения не изменилась. К каждому из элементов данных в принципе егко обратиться, но для определения возраста теперь требуется эполнительное отношение. Кроме того, должна быть известна текущая дата.

Новые правила, предназначенные для работы с данными о дате эждения, будут теперь иметь вид

X birth Y if

X stat(Y|Z)

X birthdate(YZx)if

X birth(YZx|y)

X birthplace Y if

X birth (ZxyY|z)

Обратите внимание на то, что в правилах предусмотрена воз-ожность увеличения числа данных.

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

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

- ту же самую операцию надо проделать, если номера месяцев совпадают, а номер текущего дня больше или равен номеру дня рождения;

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

Напомним, что отношение меньше или равно имеет следующий вид:

X leq Х

X leq Y if

X LESS Y

Ниже приведены правила, позволяющие вычислить возраст человека:

X age Y if

X birthdate (Z х у) and

date now (z X1 Y1) and

(either x LESS X1 and / or x leq XI and Z leq z) and

SUM(YyY1)

X age Y if

X birthdate (Z x y) and

date now (z X1 Y1) and

(either X1 LESS x and / or X1 leq x and z LESS Z) and

SUM(Z1yY1)and

SUM (Y1 Z1)

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

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

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

date now (8 10 1985)

[текущая дата (8 10 1985)]

all (x у: х age у)

[определить все (х у: х имеет возраст у)]

Bill 42

Ted 31

Helen 29

Betty 35

Tom 24

Joe 67

No (more) answers

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

date now (9 10 1985)

[текущая дата (9 10 1985)]

all (x у: х age у)

[определить все (х у: х имеет возраст у)]

Bill 42

Ted 31

Helen 29

Joe 68

Betty 35

Tom 24

No (more) answers

[Ответов (больше) нет] date now (21 3 1985)]

[текущая дата (21 2 1985)]

all (x born on у and now aged z: x birthdate у and x age z)

[определить все (Дата рождения х-у и его возраст в данный момент z: х родился у и х имеет возраст z)]

Bill born on (25 1 1943) and now aged 42

[Дата рождения Билла - (25 1 1943) и его возраст в данный момент 42]

Tom born on (3 11 1960) and now aged 24

[Дата рождения Тома - (3 11 1960) и его возраст в данный момент - 24]

Ted born on (9 3 1954) u now aged 31

[Дата рождения Теда - (9 3 1954) и его возраст в данный момент - 24]

Helen born on (39 8 1956) end now aged 28

[Дата рождения Элен - (30 8 1956) и ее возраст в данный момент - 28]

Joe born on (9 10 1917) and now aged 67

[Дата рождения Джо - (9 10 1917) и его возраст в данный момент - 67]

Betty born on (3 5 19|0) and now aged 34

[Дата рождения Бетти - (3 5 1950) и ее возраст в данный момент - 34]

No (more) answers

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

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








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