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




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

2.10. Отношения, служащие для ввода данных

Знакомые с Бейсиком наверняка знаки? предназначенные для ввода данных операторы этого языка, такие, как INPUT X или INPUT "ваше имя"; N$. С их помощью программа запрашивает у пользователя значение арифметической или символьной переменной. Полностью аналогичных средств в Прологе, естественно нет. Но в нем предусмотрено специальное отношение is-toW, позволяющее запрашивать у пользователей ту или иную информацию. Это отношение расположено в файле TOLD, который можно загрузить в оперативную память с помощью команды LOAD TOLD (все это справедливо для микроПролога ЭВМ Spectrum). Модуль, реализующий функции этого отношения, называется told-mod и занимает 1К.

Предположим, что в программе присутствует следующее отношение:

X known if

(х name) is-told.

Следующий диалог пользователя и ЭВМ показывает, как такое отношение можно использовать:

& all (x: х known) ; Запрос пользователя

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

X name ? ans Tom ; Вопрос системы и ответ пользователя

[имя X ? ответ Том]

Тот ; Ответ системы

[Том]

X name ? just Alan ; Вопрос системы и ответ пользователя

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

Alan ; Ответ системы

[Алан]

No (more) answers ; Конец диалога

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

Если данный ответ пользователя является последним, то он должен сопроводить его словом just. Кроме того" пользователь может ответить на вопрос просто nо.

Другим способом использования отношения is-told являются запросы, порождающие вопросы, на которые пользователь должен ответить "да" или "нет". Например,

& is (Sam known)

Sam name ? yes

YES

& is (Ted known)

Ted name ? no

NO

&.

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

is-told может быть использовано при определении другого отношения; тогда Пролог-система будет запрашивать данные у пользователя для того, чтобы проверить какой-нибудь факт или получить информацию;

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

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

Рассмотрим программу, анализ которой позволит понять, как is-told используется для определения отношения older:

Alan aged 15

Bill aged 42

Colin aged 28

X older Y if

X aged Z and

(Y aged x)is-told and

x LESS Z

Ниже приведен диалог между ЭВМ, выполняющей эту программу, и пользователем:

all (Colin is older than x: Colin older x)

[определить все (Колин старше чем х: Колин старше х)]

X aged Y ? ans Dave 2 ∅

[X имеет возраст Y? ответ Дейв 20]

Colin is older than Dave

[Колин старше чем Дейв]

X aged Y ? ans EriG 44

[X имеет возраст Y? ответ Эрик 44]

X aged Y ? just Fred 22

[X имеет возраст Y? только Фред 22]

Colin is older than Fred

[Колин старше чем Фред]

No (more) answers

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

При обмене вопросами и ответами Пролог-система просит пользователя сообщить ей чье-нибудь имя и возраст: X aged Y ? Если Colin старше, то печатается соответствующее сообщение. Затем запрашиваются новое имя и возраст. Так продолжается до тех пор, пока, пользователь не захочет прекратить диалог, введя по или just.

Можно было бы сформулировать запрос так:

all (x: Colin older x)

Тогда печатались бы только введенные пользователем имена тех, кто моложе, чем Колин. В связи с этим заметим, что любые константы, такие, как "Colin is older than", можно вводить в текст запроса. Такого рода константы придадут диалогу между ЭВМ и пользователем более естественную форму. Никакого влияния на процесс получения ответа на запрос они не оказывают.

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

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

Ниже приведена новая версия отношения older.

X older Y if

X aged Z and

(Y aged x) is-told and

x LESS Z and

(Y aged x) add

Терм (Y aged x) add позволяет вносить в базу данных новую информацию, полученную системой от пользователя. Например, в результате диалога:

all (Colin is older than x: Colin older x)

[определить все (Колин старше чем х: Колин старше х)]

X aged Y ? ans Том 11

[X имеет возраст Y ? ответ Том 11]

Colin is older than Tom

[Колин старше чем Том]

X aged Y ? ans Sab 42

[X имеет возраст Y ? ответ Сэм 42]

X aged Y ? no

[X имеет возраст Y ? нет]

No (more) answers

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

в базу данных будет добавлена только информация о возрасте Тома. Попробуйте объяснить, почему данные о возрасте Сэма в базу не попадут?

Упражнение 2.10

а. Объясните, по какой причине данные о людях старше Колина, полученные в ответ на вопросы, выдаваемые системой пользователю, в базу данных на заносятся?

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

Выполните упражнение 2.10 перед тем, как работать c материалом книги дальше.

В определении отношения older уеловие х LESS Z предшествует терму (Y aged x) add. Если условие х LESS Z ложно, то программа считает текущую попытку интерпретации неудачной и завершает ее. Поэтому действия, связанные с (Y aged x) add, не выполняются.

Для того чтобы новая информация всегда заносилась в базу данных, необходимо два последних терма отношения older поменять местами. Тогда отношение будет иметь вид

X older Y if

 (Y aged x) is-told and

(Y aged x) add and

X LESS Z

Строки можно удалять из отношения так же легко, как и добавлять их. Как известно, модификация информации сводится к добавлению новых данных и удалению старых.

Следующая программа позволяет модифицировать еаму себя:

Alan aged 15

Bill aged 42

Colin aged 28

X older Y if

X aged Z and

(Y aged x) is-told and

(Y aged x) add and

(Y aged y) delete and

x LESS Z

Ниже приведен протокол ее работы:

all (Colin is older than x: Colin older x)

[(Колин старше чем х: Колин старше х)]

X aged Y ? ans Alan 16

[X имеет возраст Y ? ответ Алан 16]

Colin is older than Alan

[Колин старше чем Алан]

No sentence (Alan aged X)

[Удаление предложения (Алан имеет возраст X)]

Colin is older than Alan

[Колин старше чем Алан]

X aged Y ? just Bill 43

[X имеет возраст Y ? последний ответ Билл 43]

No sentence (Bill aged X)

[Удаление предложения (Билл имеет возраст X)]

No more answers

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

Если теперь посмотреть на программу, то легко заметить, что возраст Алана и Билла изменился. Отметим, что любое имя, вводимое пользователем в ответ на запрос системы вида X aged Y? должно присутствовать в базе данных. Программа, анализируя терм Y aged х, согласует Y с введенным именем, а х с введенным возрастом. После этого происходит сравнение введенного пользователем возраста с возрастом, хранимым в базе данных.

Выполнение конструкции (Y aged у) delete приводит к реальным действиям, только если в базе существуют данные о возрасте человека, имя которого введено пользователем. Эти действия заключаются в удалении из базы данных предложения, которое связывает это имя с новым возрастом, отличным от возраста, введенного пользователем.

Очень важно, говоря об отношении is-told, помнить, что информация, вводимая пользователем в ответ на вопрос системы, не запоминается, т. е. не заносится в базу данных. Эта информация используется только во время обработки текущего запроса. В приведенных выше запросах речь шла о конкретном человеке - Колине. Соблазнительно попробовать определить с помощью запроса

all (xy: х older у)

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

all (x is older than у: х older у)

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

X aged Y ? ans Tom 22

[X имеет возраст Y ? ответ Том 22]

X aged Y ? just Ted 12

[X имеет возраст Y ? последний ответ Тед 12]

Alan is older than Ted

[Алан старше чем Тед]

X aged Y ? just Sam 40

[X имеет возраст Y ? последний ответ Сэм 40]

Bill is older than Sam

[Билл старше чем Сэм]

X aged Y ? ans Joe 27

[X имеет возраст Y ? ответ Джо 27]

Colin is older than Joe

[Колин старше чем Джо]

X aged Y ? just Fred 30

[X имеет возраст Y ? последний ответ Фред 30]

No (more) answers

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

Обратите внимание на то, что в ответ на сообщение о возрасте Тома (ans Tom 22) никакой информации получено не было, хотя известно, что и Колин, и Билл старше Тома. Это произошло потому, что Пролог-система не сравнивала возраст Тома с возрастом Колина и Билла. Сравнение производилось только с возрастом Алана. И так будет продолжаться до тех пор, пока пользователь в ответ на вопрос системы не введет либо just, либо по. После этого, получив ответ

Alan is older than Ted

Пролог-система будет сравнивать все последующие вводимые пользователям данные с данными, относящимися к Биллу. И так до тех пор, пока вновь не будет введено just или по. Тогда Пролог-система перейдет к Колину. Все это очень хорошо только тогда, когда есть уверенность, что пользователь точно знает, с каким утверждением он работает. Но, естественно, пользователь в любую минуту может об этом забыть.

Для того чтобы пользователь МОР определить, с каким утверждением он хочет работать, введен еще один вариант терма is-told. После введения этого нового терма в программу она примет вид

Alan aged 15

Bill aged 42

Colin aged 28

X older Y if

X aged Z and

(Compare with X) is-told and

(Y aged x) is-told and

x LESS Z

Ниже приведен один из возможных вариантов диалога между программой и пользователем:

all (x is older than у: х older у)

[определить все х старше чем у: х старше у]

Compare with Alan ? yes

[Сравнивать с Аланом ? да]

X aged Y ? ans Tom 4

[X имеет возраст Y ? ответ Том 4]

Alan is older than Tom

[Алан старше чем Том]

X aged Y ? ans Sam 20

[X имеет возраст Y ? ответ Сэм 20]

X aged Y ? just Ted 5

[X имеет возраст Y ? последний ответ Тед 5]

Alan is older than Ted

[Алан старше чем Тед]

Compare with Bill ? no

[Сравнивать с Биллом ? нет]

Compare-with Colin ? yes

[Сравнивать с Колином ? да]

X aged Y ? ans Tom 4

[X имеет возраст Y ? ответ Том 4]

Colin is older than Tom

[Колин старше чем Том]

X aged Y ? just Fred 40

[X имеет возраст Y ? Фред 40]

No (more) answers

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

&.

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

NAME is older than name

где NAME - имя выбранного пользователем для сравнения человека; name - только что введенное имя.

Если же ответом является по или ответ начинается с just, то система, завершив обработку ответа, переходит к утверждению, описывающему следующего человека. Такая схема лучше, чем та, которая была раньше. Но все-таки не совсем удобно просматривать утверждения базы данных одно за другим до тех пор, пока требуемое не будет найдено. Было бы лучше, если бы пользователь мог сразу же определить нужное утверждение и в елучае необходимости тотчас прекращать работу, а не вводить для этого несколько раз по. К счастью, сделать это легко. Достаточно только поменять местами фразы, содержащие терм is-told. Тогда правило, описывающее отношение older, будет выглядеть так:

X older Y if

 (Compare with X) is-told and

 X aged Z and

 (Y aged x) is-told and

 x LESS Z

Упражнение 2.11

Проанализируйте работу программы, полученной в результате последней модификации. Используйте эту программу для сравнения сначала возраста Колина, а затем возраста Билла с возрастом Теда (25 лет), Джо (30 лет) и Тома (55 лет).

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








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