Предикат read читает следующий терм, набираемый пользователем на клавиатуре терминала. После вводимого терма должны следовать точка '.' и непечатаемая литера, такая как пробел или RETURN . Если переменная X не конкретизирована, то целевое утверждение read(X) приведет к вводу следующего терма и этот терм будет присвоен в качестве значения переменной X , Как и другие предикаты ввода-вывода, с которыми мы уже сталкивались, предикат read выполняется лишь один раз. Если в момент рассмотрения целевого утверждения read(X) его аргумент конкретизирован, то попытка доказать согласованность этого целевого утверждения с базой данных вызовет чтение следующего терма и попытку сопоставления его с аргументом, заданным в read. Согласованность цели с базой данных зависит от результата этого сопоставления.
Используя предикаты read и phh, как они были определены выше, мы можем написать программу для печати краткого содержания исторических событий, хранящихся в базе данных, с помощью фактов с предикатом событие. Эта программа имеет вид:
обращение:-
phh(['Какая',дата,вас,'интересует?'!),read(D),coбытиe(D,S),pph(S).
Мы определили предикат обращение, не имеющий аргументов. Когда мы обращаемся к системе с вопросом
?- обращение.
Пролог напечатает
Какая дата вас интересует?
и будет ждать ответа. Предположим, что мы ввели с клавиатуры
1523.
Обратите внимание на то, что после 1523 необходимо ввести точку, так как этого требует предикат read. И, как обычно, мы должны нажать клавишу RETURN , чтобы сообщить ЭВМ, что мы закончили ввод строки текста. После этого Пролог ответит
Кристиан II покинул Данию
Обратите внимание, что в первой строке тела правила обращение используется предикат phh, хотя в этом случае печатается не краткое содержание исторического события. Это просто показывает, что phh вполне подходит для печати произвольного списка атомов независимо от того, откуда он взялся.
|