Приложение 1.
Служебные предикаты Турбо-Пролога

       В этом разделе будут описаны встроенные предикаты, которые включены в данную версию Турбо-Пролога. Встроенные предикаты избавляют программиста от необходимости самому определять некоторые стандартные действия. Для каждого предиката указаны типы данных и допустимые сочетания их потоковых типов:
i - параметр имеет определенное значение при обращении к данному предикату
o - параметр получает значение при любом обращении к предикату
io - тип может быть i или о независимо от потоковых типов остальных параметров
Например, если вызываемый предикат имеет два аргумента, то возможны такие потоковые шаблоны - (i,i), (o,o), (i,o), (o,i), или более коротко - (io,io).

1. Стандартные предикаты ввода данных.

       Турбо-Пролог предоставляет стандартные предикаты .IVLS чтения строки символов; целого, вещественного или символьного значения с клавиатуры терминала: чтения из файла. Приведенные ниже предикаты не могут непосредственно использоваться для чтения сложных объектов или списков

Синтаксис предиката
Назначение предиката
readln( СтрокоеаяПвременная )
(string) -- (о)
Читает символы из текущего входного потока, до кода "возврат каретки". Аргумент должен быть несвязанной переменной
readmt( ЦелаяПвременная )
(integer) - (о)
Читает цифры из текущего входного потока, до кода "возврат каретки". Аргумент должен быть несвязанной переменной.
readreal( ВещественнаяПеременная)
(real) - (о)
Читает вещественные символы из текущего входного потока, до кода "возврат каретки''. Аргумент должен быть несвязанной переменной.
readchar( СимвольнаяПеременная )
(char) -- (о)
Предикат readchar(...) читает один символ из текущего входного потока.
file_str(ИмяФайла,СтроковаяПеременная)
File <-> String (string,string) - (i.io)
Предикат file_str(...) читает символы (максимум 64 К) из файла в строку, пока не встретится ASCII-код "конец файла".

2. Предикаты преобразования данных

       char_int ( СимвольныиПараметр , ЦелыйПараметр )
( char , integer ) - (i,o) (o,i) (i,i)
Предикат char_int(...) в случаях:
(i,o) - связывает второй аргумент с десятичным АSСII-кодом первого аргумента:
(o,i) - связывает первый аргумент с символом, имеющим ASCII-код второго аргумента;
(и) - является успешным, если второй аргумент связан с ASCII-кодом первого.

       str__int ( СтроковыйПараметр , ЦелыйПараметр )
( string , integer ) -- (i,o) (o,i) (i,i)
Предикат str_int(...) в случаях:
(i,o) - связывает второй аргумент с двоичным эквивалентом десятичного целого, с которым связан первый аргумент,
(о,i) - связывает первый аргумент со строкой десятичных цифр, представляющих значение, с которым связан второй аргумент;
(i,i) - является успешным, если второй аргумент связан с двоичным эквивалентом десятичного целого, с которым связан первый аргумент.

       str_char ( СтроковыйПараметр , СимвольныйПараметр )
( string , char ) - (i,o) (o,i) (i,i)
Предикат str_char(...) в случаях:
(i,o) - связывает второй аргумент с единственным символом, содержащимся в первом аргументе, который связан с этим символом;
(о,i) - связывает первый аргумент со вторым;
(i,i) - будет истинным, если оба аргумента связаны с одним и тем же символом.

       str_real ( СтроковыйПараметр , ВещественныйПараметр )
( string , real) - (i,o) (o,i) (i,i)
Предикат str_real(...) в случаях:
(i,0) - связывает второй аргумент с двоичным эквивалентом десятичного вещественного числа, с которым связан первый аргумент;
(o,i) - связывает первый аргумент со строкой десятичных цифр, представляющих значение, с которым связан второй аргумент;
(i,i) - является успешным, если второй аргумент связан с двоичным эквивалентом десятичного вещественного, с которым связан первый аргумент.

       upper_lower ( СтрокаВерхнРег , СтрокаНижнРег )
( string , string ) - (i,i) (i,o) (o,i)
Предикат upper_lower(...) в случае:
(i,o) - связывает второй аргумент со значением первого на нижнем регистре;
(о,i) - связывает первый аргумент со значением второго на верхнем регистре;
(i,i) - предикат успешно выполняется, если аргументы связаны со значением одной и той же строки, но первый - на верхнем регистре, а второй - на нижнем.

3. Предикаты работы с окнами.

Синтаксис предиката
Назначение предиката
makewindow( НомерОкна , ЦветЭкрана, ЦветРамки , ЗаголовокРамки , Строка , Столбец , Высота , Ширина )
( integer, integer, integer, string, integer, integer, integer, integer) - (i,i,i,i,i,i,i,i)
Определяет область экрана как окно. Окно идентифицируется по номеру. Параметр ЦветРамки ограничивает область окна рамкой указанного цвета. Значения Строка и Столбец определяют верхнюю позицию окна, а Высота и Ширина - его размеры. Параметр ЦветЭкрана определяет цвет окна и символов.
shiflwindow( НoмepOкнаi )
(integer) - (io)
Устанавливает или возвращает номер текущего окна.
removewindow
Удаляет текущее окно с экрана.
clearwitidow
Удаляет текст из текущего окна.
windowstr( ЭкраннаяСтрока )
(siring) -- (io)
В случае (i) - связывает аргумент со строкой, выводимой в текущем окне. ЭкраннаяСтрока имеет то же количество линий (строк), сколько их в окне. Д"1ина каждой строки определяется последним символом, отличным от пробела. В случае (u) - ар1умецч выводится в окно. Если в аргументе больше строк, чем в окне, то выводятся только те, которые помещаются в окне. Если в строке аргумента символов больше, чем в окне, то они усекаются
windowattr( Атрибут )
(integer) - (i)
Устанавливает значение атрибута для текущего окна.

4. Предикаты работы с файлами.

       Турбо-Пролог определяет текущий входной данных, из которого производится чтение всех вводимых данных, и текущий выходной поток, в который производится запись данных. Обычно с текущим выходным потом связывается дисплей, а с текущим входным потоком - клавиатура.

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

       Когда файл открыт, Турбо-Пролог связывает символическое {СимволИмяФайла) имя файла с действительным именем файла {ИмяФайла) используемым в каталоге ДОС. Символическое имя файла должно быть атомом и должно быть описано в программе в разделе domains как стандартный тип file. В программе тип file может встречаться в разделе domains один раз.

Синтаксис предиката
Назначение предиката
opcnread( СимволИмяФайла , ИмяФайла )
( file , string ) - (i,i)
Открывает файл для чтения.
openwrite( СимволИмяФайла, ИмяФайла )
( file , string ) -- (i,i)
Открывает файл для записи. Если такой файл уже существовал в каталоге, то содержимое его уничтожается.
ореnаppend(СимвалИмяФайла,ИмяФайла)
( file . string ) - (i,i)
Открывает дисковый файл для добавления информации.
ореnmodify (СимволИмяФайла,ИмяФаила)
( file , string ) - (i,i)
Открывает файл для чтения и записи.
readdevice( СимволИмяФайла )
( file ) -- (io)
Переключает текущий входной поток данных на файл с указанным именем. Аргумент должен быть связанным и открыт для чтения, иначе происходит связывание СимволИмяФайла с именем активного читающего устройства.
writedevice( СимволИмяФайла)
( file ) -- (io)
Определяет текущий входной поток при условии, что указанный файл открыт либо для записи, либо для добавления информации.
closefile( СимволиИмяФайла )
( file ) -- (i)
Предикат closefile(...) закрывает файл.
filepos( СимволИмяФайла , Позиция , Режим )
( file , real , integer ) -- (i,io,i)
Изменить место чтения или записи в указанном файле, который должен быть открыт для чтения и записи. Параметр Режим указывает позицию места чтения/записи относительно: начала файла (0), текущей позиции (1), конца файла (2)
eof(СимволИмяФайла)
( me ) -- (i)
Проверяет является ли текущая позиция в процессе чтения концом файла.
existfile( ИмяФайла )
( string ) -- (i)
Проверяет наличие файла в текущем каталоге. Используется перед попыткой открыть файл.
deletefile( ИмяФайла )
( string ) - (i)
Уничтожает файл с именем ИмяФайла из каталога ДОС.
renamefile( СтароеИмя , НовоеИмя )
( string , string ) - (i,i)
Переименовывает файл, если НовоеИмя нет в каталоге и оба имени корректны.
disk( Путь_к_каталогу )
( string ) -- (io)
Устанавливает текущее устройство и каталог.

       Стандартные имена устройств для readdevice и writedevice следующие: printer, screen, keyboard.

       Для записи в файл необходимо сменить текущий выходной поток данных так, чтобы им был файл, в который будут записываться данные. Позиция в файле, в которой имели место чтение или запись, может управляться предикатом filepos.

5. Предикаты управления экраном.

Синтаксис предиката
Назначение предиката
scr_char( Строка, Столбец , Символ )
(integer.integer.integer) - (i,i,io)
Выводит символ на экран с текущим атрибутом в позицию, указанную номером строки и столбца. В случае (о) - возвращает значение символа
scr_attr( Строка , Столбец , Атрибут )
(mteger,mteger,integer) - (i,i,io)
Устанавливает или возвращает атрибут символа на экране в позиции, указанной строкой и столбцом. Атрибут положительное целое число, определяющее цвет и мерцание символа
field_str( Строка , Столбец , Длина , СтроковаяПеременная)
(integer,iriteger,intcger,strmg) - (i,i,i,io)
Если строка и столбец указывают на позицию внутри текущего окна, и поле данной длины, начинающееся с этой позиции, может быть помещено в это окно, то значение, с которым сцеплен аргумент СтроковаяПеременная, будет занесено в эту позицию, причем будет записано столько символов, сколько указано аргументом Длина. В случае (о) предикат возвращает значение поля.
field_attr( Строка, Столбец , Длина , Атр )
(integer,integer,integer,integer) - (i,i,i,i)
Если строка и столбец указывают на позицию внутри текущего окна, и поле данной длины, начинающееся с этой позиции, может быть помещено в это окне. то все позиции этого поля будут иметь атрибут Атр
cursor( Строка , Столбец )
(integer,integer) - (i,i) (o,o)
Помешает курсор в указанную позицию текущего окна или возвращает позицию
attribute< Атрибут )
(integer) - (io)
Устанавливает значение атрибута Атрибут по умолчанию для всех позиций экрана.

6. Предикаты обработки строк.

       frontchar ( Строка , ПервыйСимвол , ОстатокСтроки )
( string , char , string ) - (i,io,io) (o,i,i)
Предикат действует так, как если бы было определено равенство
Строка = ПервыйСимвол + ОстатокСтроки, и либо Строка - связанная переменная, либо оба последних параметра - связанные переменные. В случае (i,i,i) предикат истинен, если это равенство справедливо.

       fronttoken ( Строка , Знак , ОстатокСтроки )
( string , string , string ) -- (i,io,io) (o,i,i)
Здесь Строка = Знак + ОстатокСтроки либо связанная переменная, либо оба последних параметра - связанные переменные. Предикат успешно выполняется, если второй apгумент связан с первым знаком строки, а третий аргумент - с ее остатком.
Под знаком подразумевается последовательность символов, являющаяся - либо именем, соответствующим синтаксису Пролога; либо числом (предшествующий ему знак +,- и т.п. рассматривается отдельно); либо символом, но не пробелом.

       frontstr ( Длина , ВходнаяСтрока , НачалоСтроки , ОстатокСтроки )
( integer , string , string , string ) - (i,i,o,o)
Предикат разделяет ВходнуюСтроку на две части. НачалоСтроки будет содержать столько символов, сколько указано первым аргументом, при этом ОстатокСтроки будет связан с оставшимися символами.

       concat ( Строка1, Строка2, Строка3 )
( string , string , string ) - (i,i,о) (i,o,i) (io,i,i)
Предикат осуществляет конкатенацию первого и второго apгументов; результат связывается с третьим аргументом (Строка3=Строка1+Строка2). Аргументы Строка1 и Строка2 должны быть связанными.

       str_len ( Строка,Длина )
( string , integer ) - (i,i),(i,o)
Предикат выполняется успешно, если в случае (i,i) первый аргумент имеет столько символов, сколько указано вторым, в случае (i,o) второй аргумент будет связан с числом символов Строки.

       isname ( Строка) ( string ) - (i)
Предикат выполняется успешно, если аргумент является именем, соответствующим синтаксису Турбо-Пролога.

7. Предикаты работы с графикой.

       Графические возможности Турбо-Пролога реализованы для двух уровней: пунктирной графики, когда используются команды вида "начертить линию, проходящую через указанные точки" и графики построения "от руки", с помощью цветного пера. Перед тем как использовать команды графики Турбо-Пролога, Вы должны установить экран в графический режим, а по его окончании очистить экран и вернуться к текстовому режиму. Заметим, что текст и графика могут вместе использоваться внутри окна и на полном экране. Графический предикат имеет форму:

       graphics ( Режим , Палитра, ЦветФона ) ( integer , integer , integer ) - (i,i,i)

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

Режим
Кол-во столбцов
Кол-во строк
Описание
1
2
3
4
5
320
640
320
640
640
200
200
200
200
350
Среднее разрешение, 4 цвета
Высокое разрешение, черно-белый экран
Среднее разрешение, 16 цветов
Высокое разрешение, 16 цветов
Сверхвысокое разрешение

       Во всех случаях графика начинается с очистки экрана и установки курсора левом верхнем углу. Цвет фона выбирается из условий:

Черный
Синий
Зеленый
Голубой
Красный
Сиреневый
Коричневый
Белый
Серый
Ярко-синий
Ярко-зеленый
Ярко-голубой
Ярко-красный
Ярко-сиреневый
Желтый
Ярко-белый
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

       Имеются два основных графических предиката- dot u line (точка и линия).

       dot( Строка , Столбец , Цвет )
(mteger,integcr,integer) -- (i,i,io)
Предикат dot(...) помещает точку цвета, указанного третьим параметром, в позицию определяемую первыми двумя параметрами, которые являются целыми от 0 до 31999 и не зависят от текущего режима экрана.

       linе( Строка1 , Столбец1 , Строка2 , Столбец2, Цвет )
(integer, integer, integer, integer, integer) - (i,i,i,i,i)
Предикат line(...) чертит линию через точки, позиции которых указаны параметрами строки и столбца, цвет линии определяется последним аргументом.

       В Турбо-Прологе есть предикаты, которые реализуют графику построения "от руки", с помощью цветного пера. Основными элементами графики этого уровня являются: изображенное на экране треугольное перо, так называемая "черепаха" и простые направляющие команды типа "вперед", "вправо" и т.п.

       При входе в графический режим экран очищается, появляется "черепаха", "перо" находится в хвосте. Направляется "черепаха" при помощи стандартных предикатов, а "перо" оставляет след на экране. Действие этих предикатов зависит от позиции "черепахи", направления, включено "перо" или нет, от цвета "пера". Основные предикаты черепашьей графики:

       pendown - активизирует "перо"
       penup - дезактивизирует "перо"
       репсоlоr(Цвет) - определяет цвет следа
       forward(Шаг) (integer) - (integer) - (i) (i)- указывает число шагов "черепашки" из текущей
       back(Шаг) (integer) -- действует противоположным образом
       right(Угол) (integer) - (i) (i) - поворачивает "черепашку" направо.

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

       left(Угол) (integer) - (i) - аналогично поворачивает "черепашку" налево.

8. Разные предикаты.

       findall( Переменнал, <атом> , СписковаяПеременная )
       Предикат findall используется для сбора значений, полученных при возврате, в список, если атом является предикатом с аргументами, представленными действительными для Пролога именами переменных, а Переменная одна из переменных этого предиката, то входящая в предикат СпистюваяПеременъая будет связана со списком значений для этой переменной, которая получается когда предикат успешно выполняется. Пример использования этого предиката можно иллюстрировать программой:
domain
name , address = string
age = integer
list = age*
predicates
pcrson( name , address , age)
sumlist( list , age , integer )
goal
findall( Age , Person(_,_,Age) , L ) , sumlist ( L , Sum , N)
Age = Sum / N ,
write("\n\nЭта программа находит средний возраст лиц") ,
write ("\nСредний возраст = ",Age) , nl , nl .
clauses
sumlist( [] , 0 , 0 ).
sumlist( [H п T],Sum,N := sumlist( T,S1,N1),Sum=H+S1,N=1+N1.
person("Петров" ."Попова, 5",22).
регsоn("Иванов, 5",20)
       random (ВещественнаяПеременная) (real) - (о)
Предикат возвращает вещественное число X, удовлетворяющее условию 0 <= Х < 1

       sound (Продолжительностъ,Частота) (integer.integer) - (i,i)
Предикат вызывает звучание сигнала нужной частоты и заданной длительности.

       date (Год,Месяц,День) (integer,integer,integer) - (0,0,0) (i,i,i)
В случае (о,о,о) читает дату из компьютера, а в случае (i,i,i) - устанавливает ее.

       time (Часы,Минуты, Секунды,Миллисекунды) (integer,integer,integer,integer)- (0,0,0,0) (i,i,i,i) В случае (i,i,i,i)
Устанавливает время в компьютере, а в случае (о,о,о,о) читает его.

       system (КоманднаяСтрока) (string) - (i) Аргумент предиката может быть любой командой ДОС или выполняемым файлом.

       consult(ИмяФайла) - Загрузить базу данных из файла Имяфайла.

       save(ИмяФайла) - Выгрузить базу данных в файл Имяфайла.

       exit - Возврат к системе меню

       fail - Всегда имеет значение false u вызывает возврат

       nl - Переход на новую строку

       beep - Короткий звук

       free(Переменная) - Успех, если Переменная не связана ни с каким значением

       bound(Переменная) - Успех, если Переменная связана с каким-либо значением