Для базы данных, содержащей информацию о футбольной турнирной таблице, необходимы средства для регулярного ее обновления. Таким средством может служить программа 5.3, позволяющая обновлять турнирные показатели, вводя информацию о сыгранных матчах с помощью строк типа:
(название команды хозяев) Н А (название команды гостей),
где Н и А - числа голов, соответственно забитых и пропущенных хозяевами.
Программа 5.8
Xadj(Y Z x y)if
(Team X score Z x Team ?) is-told and
(either (either x LESS Z and home у and. / or Z LESS x and away у and /) and / or draw у and /) and
X adj1 (Y Z x y) and
X adj2 (Y Z x y)
X adj1 (Y Z x(y z X1))if
(X form((Y1 Z1 x1 y1 z1) X2)) delete and
SUM(Z y1 Y2)and
SUM(x z1 Z2)and
SUM(y Y1 x2)and
SUM (z Z1 у2) and
SUM(X1 x1 z2)and
(X form ((x2 y2 z2 Y2 Z2) X2)) add and
/
X adj2(Y Z x(y z X1))if
(Y form (Y1 (Z1 x1 y1 z1 X2))) delete and
SUM(Z X2 Y2)and
SUM(x z1 Z2)and
SUM(y y1 x2)and
SUM (z x1 y2) and
SUM (X1 Z1 z2) and
(Y form (Y1 (z2 y2 x2 Z2 Y2))) add and
/
home (1∅)
diaw (∅ 1 ∅)
away (∅ ∅ 1)
Для работы программы 5.3 необходим модуль TOLD. Ниже приведен возможный вариант диалога с указанной программой:
all (: x adj у)
[определить все (: х текущие-изменения у)]
Team X score Y Z Team x ? ans Arsnl 1 ∅ Ipswn
[команда X счет Y Z команда х? ответ Арсенал 1∅ Ипсвич]
Team X score Y Z Team x ? just Evrtn 4 1 Wtfrd
[команда X счет Y Z команда х? последний-ответ Эвертон 4 1 Уитфорд]
No (more) answers
[Ответов (больше) нет]
Если вывести после этого на экран турнирную таблицу (т. е. все элементы отношения form), то для указанных четырех команд строки изменятся следующим образом:
Arsnl form ((5 1 1 1∅ 6) (2 2 2 6 6))
Ipswh form ((12 3 4 8) (1∅ 6 3 13))
Tin form {(5 1 1 17 6) (2 1 3 8 9))
Wtfrd form ((6 ∅ ∅ 19 4) (∅ 1 6 8 21))
С помощью отношения add Новые предложения добавляются в конец списка предложений отношения form. Однако для пoльзователя безразлично, в каком именно месте размещена информация о каждой команде. Отношение adj в программе 5.3 в зависимости от результата игры формирует строку параметров следующим образом: если выиграли хозяева поля, в строку записывается последовательность (1 ∅ ∅), если выиграли гости, то передается (∅ ∅ 1), тогда как в случае ничьей формируется последовательность (∅ 1 ∅). Далее указанная строка передается двум вспомогательным отношениям adj 1 (текущие-изменения-1) и adj2 (текущие-изменения-2). Первое из них изменяет запись, относящуюея к команде хозяев, прибавляя число голов, забитых хозяевами, и число голов, забитых гостями, к значениям соответствующих показателей.
Второе отношение выполняет аналогичную операцию, но для команды гостей. И то и другое отношение уничтожают записи со старыми показателями и добавляют соответствующие обновленные записи. Хотя обновление таблицы производится каждую неделю, за этот период накапливается много информации, что вызывает многократное выполнение операций поиска и удаления старых, а также добавления новых записей. Поэтому программа работает достаточно долго.
Для повышения эффективности работы системы программы обработки следует оформлять в виде самостоятельных модулей и хранить их отдельно от программ, содержащих данные. Это можно сделать с помощью системного модуля Пролога MODULES. Сначала его надо загрузить в оперативную память, а затем либо ввести текст программы 5.3 с клавиатуры, либо, если этот текст был предварительно записан на магнитофон, с магнитофонной кассеш.
После того, как вы удостоверитесь, что в программе содержатся только предложения adj, adjl, adj2, home, away и draw, введите еще одно дополнительное предложение:
Данное предложение содержит два списка. В первом списке, называемом списком экспорта, перечисляются имена тех отношений, которые должны стать доступными для внешних вызовов. В приведенном примере этот список состоит из одного элемента - adj, но при желании его можно было бы дополнить элементами adjl и adj2. Второй список, называемый списком импорта, содержит имена отношений, необходимых для работы программы 5.3. Отношение form берется из программ пользователя, содержащих данные (из баз данных), отношение is-told - из системного модуля TOLD и, наконец, отношения add и delete - из системного модуля SIMPLE. Отношения LESS и SUM в список импорта включать не требуется, так как они являются стандартными отношениями Пролога и доступны для всех модулей.
Теперь необходимо ввести с клавиатуры предложение "wrap ADJUST", но перед тем, как нажать клавишу "ВВОД", нужно включить магнитофон для записи модуля. После завершения записи, если не было обнаружено ошибок, на экране должно появиться сообщение о том, что рабочая область очищена ("Workspace now clear").
Для того чтобы обратиться к модулю ADJUST, нужно перемотать кассету назад и затем загрузить его. К информации о турнирных таблицах подгрупп, заранее записанных на кассету, можно обратиться с помощью запроса следующего вида:
all (: х adj у)
После ввода указанного запроса на экране должно появиться уже знакомое читателю сообщение, приглашающее вводить данные. Затем соответствующая таблица будет обновлена с помощью введенных данных и перезаписана с учетом изменений. Данная процедура может быть выполнена для турнирной таблицы каждой подгруппы, т. е. для любого файла, содержащего отношение типа