Вход/Регистрация
Программирование на языке пролог
вернуться

Клоксин У.

Шрифт:

?- put(104),put(101),put(108),put(108),put(111).

hello

Результатом такой конъюнкции целей является печать Прологом литер h, е, l, l, онепосредственно под вопросом, как показано выше. Мы уже видели, что имеется возможность начать печать текста с начала следующей строки, использовав для этого предикат без аргументов nl. В действительности nl «печатает» некоторые управляющие литеры, что вызывает перевод курсора на дисплее терминала на начало следующей строки. Вопрос

?- put(104),put(105),nl,put(116),put(104),put(101),put(114), put(1O1).

вызвал бы следующую печать:

hi

there

Другой предикат, с которым мы уже познакомились, - это tab(X),печатающий Xпробелов (ASCII код равен 32). Разумеется, переменной Xдолжно быть присвоено целое число. Отметим, что предикат tab(X)мог бы быть определен так:

tab(0):- !.

tab(N):- put(32), M is N-1, tab(M).

Теперь мы можем определить предикат, который мы назовем печать_строки. Если значением переменной Xявляется список кодов литер (строка), то целевое утверждение печать_строкинапечатает этот список (строку), используя putдля печати каждого элемента списка. Как и во всех подобных программах, граничным условием является появление пустого списка. Это условие мы и используем для завершения рекурсии. При непустом списке с помощью putпечатается голова списка, а затем используем печать_строки– хвост списка:

печать_строки([]).

печать_строки([Н|Т]):- put(H), печать_строки(Т).

?- печать_строки(«Чарлз V отрекся от престола в Брюсселе»).

Чарлз V отрекся от престола в Брюсселе

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

5.2.2. Ввод литер

Для ввода литер, набираемых на клавиатуре терминала, могут быть использованы предикаты get0(X)и get(X). Эти предикаты всегда согласуются с базой данных, если их аргументы неконкре-тизированы, а попытка повторного согласования всегда неудачна. При обработке целей, включающих эти предикаты, ЭВМ ожидает до тех пор, пока пользователь не наберет на клавиатуре какую-либо литеру. Указанные предикаты немного различаются тем, что get0(X)присвоит Xлюбую набранную на клавиатуре литеру независимо от ее вида. Напротив, get(X)пропустит все управляющиелитеры и присвоит Xв качестве значения первую печатаемую литеру. Как отмечалось в гл. 2, печатаемая литера – это литера, которая визуализируется на дисплее терминала.

Если Xуже присвоено значение, то целевое утверждение get(X)пропустит все управляющие литеры и сравнит следующую за ними печатаемую литеру со значением X. Доказательство согласованности целевого утверждения зависит от результата этого сравнения. Целевое утверждение get0(X)сравнивает Xсо следующей литерой и в зависимости от совпадения считается согласованным с базой данных или нет.

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

5.3. Ввод предложений

Вэтом разделе мы представим программу, которая вводит предложение с терминала и преобразует его в список атомов языка Пролог. В программе определяется предикат ввести,имеющий один аргумент. Программа должна уметь определять, где заканчивается одно вводимое слово и начинается следующее. Поэтому предположим, что слово состоит из нескольких букв, цифр или специальных литер. Буквы и цифры уже были представлены в разд. 2.1. Мы будем рассматривать одиночную кавычку ''' и дефис '-' как специальные литеры. Литеры

, ; : ? ! .

будут рассматриваться как отдельные слова. Все другие литеры являются разделителями между словами. Предложение считается законченным, когда встречается одно из слов '.', '!' или '?'. Прописные буквы автоматически преобразуются в строчные, так что одно и то же слово всегда превращается в один и тот же атом. В результате такого определения программа будет поддерживать диалог с пользователем, подобный следующему:

?- ввести(S).

The man, who is very rich, saw John's watch.

  • Читать дальше
  • 1
  • ...
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: