Предикат write для вывода информации

ЛАБОРАТОРНАЯ РАБОТА

Тема: Управление вводом-выводом с помощью встроенных предикатов

Цель работы: Приобретение навыков, необходимых для разработки диалоговых программ на Прологе

Встроенные предикаты

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

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

Процесс согласования таких встроенных предикатов имеет следующие особенности:

1. Успешное согласование встроенного предиката не требует присутствия в базе данных сопоставимого с ним утверждения.

2. Процедура согласования реально выполняется как вызов соответствующей процедурной библиотечной программы.

3. Для встроенных предикатов пересогласование при возврате (бэктрекинге) не производится.

Различие в выполнении обычных и встроенных предикатов можно проиллюстрировать с помощью модели портов. При согласовании обычного предиката модель портов предполагает, что, если цель успешно согласована (при входе вход через Call) или пересогласована (при входе через Redo), то происходит выход через порт Exit, в противном случае — через Fail.

Предикат write для вывода информации

Для большинства встроенных предикатов (ввод-вывод или, например, для предиката listing) модель функционирования портов будет следующей:

Предикат write для вывода информации

Предикаты ввода-вывода

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

Если задается основной вопрос (т.е. вопрос, не содержащий переменных), то ответ выводится просто в виде yes или no.

Если вопрос содержит переменные, то интерпретатор, помимо yes или no, автоматически выдаст на экран значения всех переменных, участвующих в вопросе.

ЗАДАНИЕ 1 (исследование особенностей вывода информации интерпретатором)

1. Создать файл со следующей программой:

add(1,1,2). add(1,2,3). add(2,1,3).

add(X,0,X). add(0,X,X).

Запустить интерпретатор, ввести запрос и получить все возможные решения (как это сделать?):

?–add(X,Y,3).

Сколько решений удается найти? Каким будет последний ответ, yes или no, и почему?

2. Добавить в программу правило.

q1(X,Y):-add(X,Y,3).

Задать вопрос:

?– q1(X,Y).

Есть ли различие в поведении программы в сравнении с предыдущим пунктом?

3. Добавить в программу правило.

q2:-add(X,Y,3).

Задать вопрос

?– q2.

Есть ли различия в поведении программы по сравнению с заданиями пунктов 1.1 и 1.2? Если есть, то какие?

Предикат write для вывода информации

С точки зрения логического программирования любое задание интерпретатор воспринимается как задачу, выяснить является ли утверждение, составляющее вопрос, следствием логической программы?. Поэтому ответ интерпретатора всегда либо да (yes), либо нет (no).

Однако для пользователя обычно больший интерес представляет, при каких значениях переменных, входящих в вопрос, получено это решение (т.е. при какой подстановке пример вопроса выводим из программы). Поэтому, если вопрос содержит переменные, то интерпретатор выводит также значения этих переменных (подстановку), при которых вопрос является следствием логической программы. Так было в заданиях 1.1 и 1.2. Однако в задании 1.3 вопрос основной (не содержащий переменных). Поэтому интерпретатор ничего, кроме yes, не вывел.

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

В Прологе имеется предикат write/1, который позволяет выводить на экран один терм. Предикат write может быть включен в правило (т.е. в программу)

q(X):- write(X).

в конъюнктивный вопрос, например, для вывода значения атома

?- X=’abc’,write(X).

или даже просто сам использован в вопросе, например, для вывода текстовой строки:

?- write($Результаты:$).

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

Замечание

Имеется предикат writeq (q от англ. quote — ставить кавычки), который отличается от write только тем, что при выводе атомов и строк он сохраняет соответственно ограничивающие их апострофы и знаки доллара.

Предикаты


Похожие статьи.

Понравилась статья? Поделиться с друзьями: