Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пролог_шпоры.docx
Скачиваний:
35
Добавлен:
27.09.2019
Размер:
103.66 Кб
Скачать

14.Рекурсия и эффективность рекурсивных правил на Visual Prolog .

Смотреть вопрос 13=) найти нужное и писать) Удачи сдать тебе,человечек=)

15 Стандартные предикаты. Поточный шаблон стандартных предикатов.

Пролог имеет большой набор встроенных предикатов. Большинство стандартных предикатов выполняют несколько функций в зависимости от состояния параметров входящих в предикат. К моменту обращения к предикату каждый отдельный его параметр может быть определен или не определен. Известные параметры предиката – входные (i), неизвестные – выходные (o). Совокупность входных и выходных параметров определяет работу предиката и называется поточным шаблоном. Не для каждого варианта все возможные варианты поточного шаблона имеют смысл.

16.Стандартные предикаты ввода-вывода в Прологе.

readln(StringVariable) (string) – (o)

Считывает строку с текущего устройства ввода и связывает ее с заданной переменной StringVariable. Обычно чтение производится с клавиатуры. В качестве конца строки используется символ возврата каретки. Readln считывает до 150 символов в строке при вводе с клавиатуры и до 64К при вводе с других устройств.

readint(IntgVariable) (integer) – (o)

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

readreal(RealVariable) (real) – (o)

Читает действительное число с текущего устройства чтения и связывает его с заданной переменной RealVariable. Обычно чтение производится с клавиатуры.

readchar(CharVariable)(char) – (o)

Читает символ с текущего устройства ввода и связывает его с заданной переменной CharVariable. В отличие от inkey устанавливает режим ожидания ввода.

inkey(CharVariable)(Char) – (o)

Читает символ со стандартного устройства ввода. В отличие от предиката readchar выполнение программы не прерывается. Поэтому inkey применяют главным образом для организации циклов ожидания.

keypressed-Выполняется успешно, если нажата некоторая клавиша. В отличие от предиката inkey с помощью keypressed можно установить, нажата ли клавиша, не читая при этом введенный с клавиатуры символ.

write( Variable|Constant * )

Запись заданных значений переменных и констант в заданное активное окно на текущем устройстве вывода.

nlВызывает возврат каретки и перевод строки.

17.Отсечение в программах на Прологе.

В процессе достижения цели Пролог-система осуществляет автоматический перебор вариантов, делая возврат при неуспехе какого-либо из них. Такой перебор – полезный программе механизм, так как он освобождает пользователя от необходимости производить этот перебор самому. С другой стороны ничем не ограниченный перебор может быть источником неэффективности программы. Поэтому требуется его ограничить или исключить вовсе. Для этого предусмотрено специальное целевое утверждение(ЦУ) «!,», называемое отсечением. Отсечение реализуется следующим образом: после согласования ЦУ, стоящего перед отсечением, все предположения с тем же предикатом расположенные после отсечения не рассматриваются

Можно выделить три основных случая использования отсечения:

  1. Для устранения бесконечного цикла

( вычисление суммы 1+2+…+N)

сумма (1, 1):-,!

сумма (N, K):- N1=N-1, сумма (N1, K1), K=K1+N.

Если граничное условие будет записано в виде сумма (1, 1). , то сопоставление головы правила с запросом будет происходить успешно и при N<=0,то есть делается попытка доказать цель сумма(0, К),что в свою очередь приводит к цели сумма(-1,К) и т.д. т.е.образ-ся бескон.цикл

При программировании взаимоисключающих утверждений. Нахождение большего числа среди двух чисел X и Y можно запрограммировать в виде отношения

max( X, Y, Max ), где Max = X,

если X >= Y и Max = Y, если Y > X.

Это соответствует двум предложениям программы:

max1( X, Y, X ) :- X >= Y.

max1( X, Y, Y ) :- X < Y.

Эти предложения являются взаимоисключающими, т.е. если выполняется первое, второе обязательно терпит неудачу, и наоборот. Поэтому возможна более экономная запись при использовании отсечения

max2( X, Y, X ) :- X >= Y, !.

max2( _, Y, Y ).

3.при необходимости неудачного завершения доказательства цели; Пример: присвоение какому-либо объекту категории в зависимости от величины заданного критерия в соответствии с таблицей

Критерий

Категория

свыше 80 до 100

А

свыше 40 до 80

В

от 0 до 40

С

Возможный вариант программы:

категория( Кр, _ ) :- Кр > 100, !, fail; Кр < 0, !, fail.

категория( Кр, ‘A’) :- Кр > 80, !.

категория( Кр, ‘B’) :- Кр > 40, !.

категория( _, ‘C’).

При запросе категория( 200, Х ) произойдет сопоставление запроса с головой первого утверждения. Цель Кр > 100 будет достигнута. Затем будет доказана цель-отсечение. Но когда встретится предикат fail, который всегда вызывает состояние неудачи, то стоящий перед ним предикат отсечения остановит работу механизма возврата и в результате ответом на запрос будет No Solution (Нет решения). Комбинация !, fail вводит возникновение неудачи.