Скачиваний:
142
Добавлен:
17.06.2016
Размер:
3.31 Mб
Скачать

Часть 2. Стандартные предикаты

Большинство стандартных предикатов Турбо Пролога теперь стали вместо

неудачного завершения выдавать сообщения об ошибках, если их функция не

будет выполнена до конца. Таким образом, все предикаты с побочным эффек-

том дадут ошибку, если побочный эффект не будет завершен. Однако стандар-

тные предикаты с чисто логическим смыслом дадут неудачное завершение, ес-

ли условия будут ложными.

Например, предикат file_string никогда не даст неудачного заверше-

ния; если не выполняется считывание с диска (или запись на диск), то про-

изойдет ошибка. Но readint даст неудачное завершение, если в считываемой

им строке не будет содержаться целое число.

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

давать неудачное завершение только в том случае, когда они полностью не

согласуются. В результате это дает ненадежные программы, в которых часть

программы не выполнялась бы, поскольку программист не включил в программу

внешние предложения обработки ошибок. Причины ошибок в таких случаях вы-

являются долго путем трассировки программы.

Из-за отсутствия средств обработки ошибок предикаты давали неудачное

завершение. Теперь в Турбо Прологе это устранено введением механизма ло-

вушек. Предикат-ловушка trap способен в любой ситуации перехватить и со-

ответственно обработать ошибку.

Arc/5 Графика

Назначение Рисует сектор круга

Обращение arc(X,Y,Начугол,Конугол,Радиус)

Домены (integer,integer,integer,integer,integer)

Шаблоны описания (вх,вх,вх,вх,вх)

аргументов

Описание arc рисует сектор круга текущего цвета в центре (X,Y)

с радиусом Радиус. Сектор располагается в углах от

Начугол до Конугол. Если Начугол равен 0 и Конугол

равен 360, тогда arc нарисует полный круг.

Углы arc подобны часовой стрелке, угол в 0 градусов

равен 3 часам, угол в 90 градусов равен 12 часам, и

т.д..

Каждый графический драйвер и графический режим имеет

свое отношение горизонтального и вертикального

масштабов. Отношение горизонтального и вертикального

масштабов используется в предикате arc для

отображения правильного круга на экране. Это

отношение может быть вычислено вызовом

getaspectratio, который возвращает горизонтальный и

вертикальный коэффициенты масштаба Xотн и Yотн.

Коэффициент масштаба по оси Y, Yотн, ограничен 10000;

для всех графических адаптеров, исключая VGA,

коэффициент масштаба Xотн меньше чем Yотн, потому что

высота пиксела больше чем ширина. В VGA, где пиксел

"квадратный", Xотн равно Yотн. В общем случае

ограничения на коэффициент масштаба выглядят так:

Yотн = 10000

Xотн <= 10000

Смотри circle,ellipse,getarccoords,getaspectratio,pieslice,

graphresult

Пример

include "GRAPDECL.PRO"

goal

/* Инициализация гpафики c автоматическим

определением драйвера */

initgraph(detect, 0,GraphDriver,GraphMode, ""),

/* Нарисовать сектор 90 градусов с радиусом 50 */

arc(150, 150, 0, 89, 50),

/* Взять координаты сектора и соединить линией */

getarccoords(X,Y,XStart,YStart,XEnd,YEnd),

line(XStart, YStart, XEnd, YEnd),

readchar(_),

closegraph.

assert/1

Назначение Включает факт в конец динамической базы данных

Обращение assert(<факт>)

Домены (<соответствующие домены динамической базы данных>)

Шаблоны описания (вх)

аргументов

Описание Использование assert дает тот же эффект,что и

использование assertz.

Пример Смотри assertz/1.

assert/2

Назначение Включает факт в конец указанной динамической базы

данных

Обращение assert(<факт>,ИмяДБД)

Домены (<соответствующие домены динамической базы данных>,

ИмяБазыданных)

Шаблоны описания (вх,вх)

аргументов

Описание Использование assert дает тот же эффект,что и

использование assertz/2.

asserta/1

Назначение Включает факт в начало динамической базы данных

Обращение asserta(<факт>)

Домены (<соответствующие домены динамической базы данных>)

Шаблоны описания (вх)

аргументов

Описание asserta включает <факт> в динамическую базу данных

перед всеми фактами для соответствующего предиката.

Факт должен быть термом, принадлежащим к домену

секции доменов динамической базы данных.

Неудачное Никогда не дает.

завершение

Ошибки Отсутствуют.

Пример

domains

name, address, cityname = string

age, zipcode = integer

database

person(name, age, address, zipcode)

city(zipcode, cityname)

goal

asserta(person("Миша", 26, "", 8600)),

asserta(person("Вова", 27, "", 8600)),

asserta(person("Саша", 23, "", 9800)),

asserta(city(8600, "Мелитополь")),

asserta(city(6800, "Кологрив")).

asserta/2

Назначение Включает факт в начало указанной динамической базы

данных

Обращение asserta(<факт>,ИмяДБД)

Домены (<соответствующие домены динамической базы данных>,

ИмяБазыданных)

Шаблоны описания (вх,вх)

аргументов

Описание asserta включает <факт> в динамическую базу данных

перед всеми фактами для соответствующего предиката.

Факт должен быть термом, принадлежащим к домену

секции доменов динамической базы данных с именем

ИмяДБД.

Неудачное Никогда не дает.

завершение

Ошибки Отсутствуют.

Пример

domains

name, address, cityname = string

age, zipcode = integer

database - persons /* Имя = persons */

person(name, age, address, zipcode)

database - cities /* Имя = cities */

city(zipcode, cityname)

goal

asserta(person("Миша", 26, "", 8600), persons),

asserta(person("Вова", 27, "", 8600), persons),

asserta(person("Саша", 23, "", 9800), persons),

asserta(city(8600, "Мелитополь"), cities),

asserta(city(6800, "Кологрив"), cities).

assertz/1

Назначение Включает факт в конец динамической базы данных

Обращение assertz(<факт>)

Домены (<соответствующие домены динамической базы данных>)

Шаблоны описания (вх)

аргументов

Описание assertz включает <факт> в динамическую базу данных

после всех фактов для соответствующего предиката.

Факт должен быть термом, принадлежащим к домену

секции доменов динамической базы данных.

Неудачное Никогда не дает.

завершение

Ошибки Отсутствуют.

Пример

domains

name, address, cityname = string

age, zipcode = integer

database

person(name, age, address, zipcode)

city(zipcode, cityname)

goal

assertz(person("Миша", 26, "", 8600)),

assertz(person("Вова", 27, "", 8600)),

assertz(person("Саша", 23, "", 9800)),

assertz(city(8600, "Мелитополь")),

assertz(city(6800, "Кологрив")).

assertz/2

Назначение Включает факт в конец указанной динамической базы

данных

Обращение assertz(<факт>,ИмяДБД)

Домены (<соответствующие домены динамической базы данных>,

ИмяБазыданных)

Шаблоны описания (вх,вх)

аргументов

Описание assertz включает <факт> в динамическую базу данных

после всех фактов для соответствующего предиката.

Факт должен быть термом, принадлежащим к домену

секции доменов динамической базы данных с именем

ИмяДБД.

Пример

domains

name, address, cityname = string

age, zipcode = integer

database - persons /* Имя = persons */

person(name, age, address, zipcode)

database - cities /* Имя = cities */

city(zipcode, cityname)

goal

assertz(person("Миша", 26, "", 8600), persons),

assertz(person("Вова", 27, "", 8600), persons),

assertz(person("Саша", 23, "", 9800), persons),

assertz(city(8600, "Мелитополь"), cities),

assertz(city(6800, "Кологрив"), cities).

attribute/1

Назначение Устанавливает или выдает отсутствующий атрибут вывода

Обращение attribute(Атр)

Домены (integer)

Шаблоны описания (вх),(вых)

аргументов

Описание attribute устанавливает или считывает текущий

атрибут вывода. Вывод при помощи write или writef

дает отображение экрана с этим атрибутом. Каждое окно

имеет свой атрибут вывода. Когда вы создаете окно,

атрибут вывода автоматически принимает значение

атрибута окна, но вы можете изменить его предикатом

attribute.

(вх)

Устанавливает текущий атрибут вывода со значением Атр

(вых)

Связывает Атр со значением текущего атрибута.

Неудачное Никогда не дает.

завершение

Ошибки Отсутствуют.

Смотри также window_attr/1

Пример

goal

attribute(1), write("\nЭта линия голубая"),

attribute(2), write("\nЭта линия зеленая"),

attribute(A), A1=A+2,

attribute(A1), write("\nЭта линия красная").

Соседние файлы в папке Документация