TuProlog

## Что такое tuProlog

TuProlog - это основанная на Java, упрощенная версия Prolog, созданная для работы с интернет приложениями. tuProlog создан простым в установке, малообъемным, динамично настраиваемым и напрямую интегрированным в Java. Установка tuProlog во многом схожа с Java. Требования по установке tuProlog не велики - присутствие standard Java VM, и возможность запуска JAR-файла посредством Java. Конструкция TuProlog довольно проста. Ядро tuProlog - это небольшой объект Java, который содержит лишь самые главные части движка Prolog. Только стандартные инструменты Prolog (такие как, ISO соответствие, I/O Предикаты, DCG операторы) могут быть добавлены или удалены из движка tuProlog. Простота tuProlog делает его легко настраиваемым. При работе с TuProlog необходимо постоянно загружать и выгружать предикаты, функторы, и операторы, причем как статично, так и динамично: это возможно благодаря библиотекам Prolog. Библиотеки могут находиться в стандартном дистрибутиве, или могут быть собственноручно добавлены пользователем. Библиотека tuProlog может быть создана как при помощи Prolog, так и Java, и может настраивать движок tuProlog как во время запуска, так и при ручной загрузке динамично, в любое время, пока приложение запущено.

Интеграция с Java была достигнута почти во всех областях.

Изменения со стороны Prolog - любой объект Java (объект, класс, пакет) может быть представлен как термин Prolog. Например, Java-пакеты, такие как Swing и JDBC могут быть непосредственно извлечены из Prolog, открывая tuProlog доступ к графическим возможностям и базам данных. Со стороны Java - движок tuProlog может быть использован как простой Java-объект. Java-приложение может использовать множество различных движков tuProlog, несмотря на то, что все они могут быть настроены под отдельные библиотеки и базы знаний. Совместимость достигнута в двух главных направлениях: стандартные шаблоны Internet и координационные модели. TuProlog поддерживает взаимодействие посредством TCP/IP и RMI, и также может использовать CORBA-сервис. Вдобавок, tuProlog поддерживает tuple-based coordination. Компоненты tuProlog могут быть организованы на основе Java-ориентированных tuple spaces, logic tuple spaces, и ReSpecT tuple centres. Также tuProlog может использовать LuCe и TuCSoN.

TuProlog разработан исследовательской группой aliCE, университета Alma Mater Studiorum—Universit`a di Bologna, site of Cesena; tuProlog является свободно распространяемым ПО, и выпускается согласно лицензии LGPL, позволяя использовать его для коммерческих целей.



## Установка tuProlog

Собственно для работы необходим дистрибутив tuProlog, его можно скачать с официального сайта: http://tuprolog.alice.unibo.it Последняя версия находится во вкладке Downloads. Загрузочный файл будет иметь формат 2p-X.Y.Z.zip, где X.Y.Z обозначает версию tuProlog.

После загрузки файла, необходимо разархивировать содержимое в любую папку; при этом в папке появятся следующие каталоги:

- Lib,
- doc,
- api,
- test,
- src.

Папка lib содержит tuProlog Java бинарники (binaries) в JAR формате:

• 2p.jar содержит ядро API, Агентное приложение, библиотеки, IDE инструменты и другие дополнения.

• Три JAR файла, которые являются вспомогательными (helper packages) для пользователей, которые хотят использовать особые возможности tuProlog:

– tuprolog.jar содержит ядро API, агентное приложение и стандартные библиотеки. – tuprolog-ide.jar содержит только инструменты IDE. –tuprolog-extensions.jar содержит дополнительные библиотеки и другие расширения tuProlog.

Папка doc содержит руководство (tuprolog-guide.pdf) и Java документацию о tuProlog API. Папка test содержит исходный код и тестер на совместимость с ПО, и примеры использования библиотек. Папка src содержит исходники Java для движка tuProlog.

После скачивания и распаковки, tuProlog можно установить его различными путями:

• tuProlog можно запускать из корневой папки (например, с диска C:\), или из папки, куда вы обычно устанавливаете программы. После этого вам необходимо добавлять опцию -cp <jar file> всякий раз, когда вызывается интерпретатор Java, определяющий путь к 2p.jar. Например, мы разархивировали 2p-2.0.zip в папку java/tools и нам необходимо запустить приложение ApplicationClass с помощью tuProlog; вызываем интерпретатор Java:

java -cp /java/tools/2p-2.0/lib/2p.jar ApplicationClass

• tuProlog можно использовать из текущей папки. В данном случае необходимо скопировать 2p.jar файл из папки lib в рабочую папку. Далее, посредством терминала (terminal) или командной строки ввести:

java -cp 2p.jar ApplicationClass

Это приведет к вызову интерпретатора Java и позволит использовать классы tuProlog.

• Можно непосредственно использовать файлы, содержащиеся в архиве 2p.jar. В данном случае, скопировав JAR файл в любую папку, необходимо открыть его с помощью дистрибутива Java. Например, открыв терминал или командную строку из той папки, ввести:

jar -xvf 2p.jar

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

## Как начать работу с tuProlog

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

### Способ для программистов

Программисту, использующему Prolog, следует ознакомиться с возможностями tuProlog, запуская свои программы, написанные на языке Prolog. Уже готовые программы запускаются как исходные текстовые файлы (source text files) используя tuProlog Agent tool. Этот инструмент считывает имя текстового файла содержащего теорию, и задачу которую необходимо выполнить, и затем он запускает демонстрацию (demonstration). После установки tuProlog в папку dir, можно использовать следующий шаблон для вызова Agent tool из командной строки:

java -cp dir /2p.jar alice.tuprolog.Agent PrologTextFile {Goal }

Например, текстовый файл носит имя hello.pl и содержит следующий текст:

go :- write(’hello, world!’), nl.

Для запуска этой программы нужно набрать:

java -cp dir /2p.jar alice.tuprolog.Agent hello.pl go.

Затем, Agent tool попытается выполнить программу, следуя инструкциям, указанным в теории hello.pl. В результате, надпись “hello, world!” должна появиться на экране.

### Способ для разработчиков

Разработчику, следует начать знакомство с TuProlog с Графического Пользовательского Интерфейса (GUI, Graphical User Interface) включенного в дистрибутив tuProlog. ГПИ выводится следующей командой:

java -cp dir /2p.jar alice.tuprologx.ide.GUILauncher

Среда разработчика, созданная на основе ГПИ, делает стандартные возможности Prolog легкодоступными:

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

Также, она дает возможность просматривать и редактировать текущие теории Prolog, содержащиеся в движке, и наблюдать за работой tuProlog во время решения конкретных задач. Наконец, она предлагает средства для динамичной загрузки и выгрузки Предикатных библиотек содержащихся в tuProlog. Так же следует опробовать интерактивное окружение движка tuProlog. В данном случае, вам необходимо вызвать подсказку tuProlog, используя оболочку командной строки, которая находится в дистрибутиве. Вызывается она с помощью:

java -cp dir /2p.jar alice.tuprologx.ide.CUIConsole

Это запустит интерпретатор tuProlog через консоль, наподобие пользовательского режима командной строки. Чтоб выйти из консоли tuProlog, вам необходимо обратится к команде стоп (halt).

## Основы tuProlog

Данная глава повествует об основных элементах и структурах tuProlog, включая синтаксис, средства разработки программ и встроенные предикаты.

### Структура tuProlog

TuProlog имеет ярусную структуру, где предикаты имеют 3 категории:

Встроенные Предикаты (built—in predicates) — содержатся в любой версии tuProlog. Неважно, что изменяется во время работы программы, это не затрагивает количество и свойства встроенных предикатов.

Библиотечные предикаты (library predicates) — загружаются в tuProlog посредством библиотеки tuProlog. Библиотеки могут быть загружены и выгружены из tuProlog во время загрузки ОС, или во время работы TuProlog. Набор библиотечных предикатов не фиксирован, и может варьироваться от одной версии к другой, даже в одной и той же версии предикаты могут изменяться на всем протяжении работы. Библиотеки могут создаваться при совмещении Java и Prolog. Библиотечные предикаты Prolog могут быть переписаны теоретическими предикатами (theory predicates). Библиотечные предикаты и Java и Prolog не могут быть выгружены частично — если необходимо выгрузить одну библиотеку, то придется выгружать все библиотеки содержащие этот предикат.

Теоретические предикаты — загружаются в tuProlog с помощью теорий. Теории могут быть загружены и выгружены во время загрузки ОС, или во время работы. Набор теоретических предикатов не фиксирован, и может варьироваться от версии к версии, даже в одной и той же версии они могут изменяться на всем протяжении работы.

Теории tuProlog – это сборник Prolog клаузов (clauses). Они похожи, но библиотечные и теоретические предикаты по—разному воспринимаются в tuProlog. Во-первых, теоретические предикаты должны представлять область знаний во время выдачи решения задачи (axiomatically represent domain knowledge at the time the proof is performed). Библиотечные предикаты должны представлять то, что требуется (процедурные знания (procedural knowledge), вспомогательные предикаты (utility predicates)) — получение достоверного и эффективного решения: библиотечные предикаты представляют “точные” знания, которые прочно зафиксированы в библиотеке.

Так как библиотечные и теоретические предикаты по-разному структурированы, они по-разному обрабатываются в TuProlog, и по-разному представлены в программе: из этого следует, что они по-разному отображаются при мониторинге или отладке tuProlog. Набор инструментов разработчика, tuProlog IDE, разграничивает теории, аксиомы, предикаты и загруженные библиотеки. Фаза отладки, обычно пренебрегает библиотечными предикатами (которые, как уже было сказано выше, задуманы как более устойчивые и тщательно проверенные), в то время как теоретические предикаты остаются на всем процессе работы.

### Синтаксис Prolog

Синтаксис tuProlog в основном состоит из ISO совместимых (на данный момент ISO исключения, ISO I/O предикаты и некоторые ISO директивы не поддерживаются), и некоторых элементов: комментариев и непечатаемых знаков.

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

Например, атом p(a,b,c) может быть записан в виде p( a , b , c ), но не как p (a,b,c)).

В TuProlog существует два типа комментариев:

1. Начинается с /* и заканчивается на */

2. Начинается с % и заканчивается в конце строки.

Вложенные комментарии не поддерживаются.

Переменные — имя переменной начинается с заглавной буквы или подчеркивания ( _ ), и состоит из букв, цифр, и/или подчеркиваний. Одиночное подчеркивание обозначает безымянную (анонимную) переменную.

Атомы — существует 4 типа атомов:

I. Набор букв, цифр, и/или подчеркиваний, начинающихся с прописной буквыr.

II. Один или несколько символов {#, $, &, *, +, —, ., /, :, <, =, >, ?, @, ^, ~}, при условии, что атом не начинается с /*.

III. Специальные атомы [] и {}.

IV. Значение в одиночных кавычках.

Числа — представлены двумя типами — целые и дробные. Форматы целых чисел: десятичные числа, двоичные (с префиксом 0b), восьмеричные (с префиксом 0o), и шестнадцатеричные (с префиксом 0x). Формат кода символа для целых чисел (с префиксами 0’) используется лишь с буквенно-цифровыми значениями, пробелами и символами {#, $, &, *, +, —, ., /, :, <, =, >, ?, @, ^, ~}. Диапазон значений целых чисел от —2147483648 до 2147483647; диапазон дробных от —2E+63 до 2E+63—1. Дробные числа могут выражаться экспонентой (—3.03E—05, 0.303E+13). Минус ставиться перед числом, делая его отрицательным; -3.4 – это число, а - 3.4 — выражение.

Строка — набор символов ASCII, заключенных в одинарные (’) или двойные (") кавычки. Если в предложении имеется одинарная кавычка, то в машинной записи она заменяется двойной (’don’’t forget’). Обратный слеш (\) в конце строки обозначает, что на следующей строке следует продолжение:

’this is \ an single line’ – это соответствует ’this is a single line’, только без разрыва строки.

Также, обратный слеш может обозначать особые символы: \n новая строка

\r возвращение без новой строки

\t табуляция

\\ обратный слеш

\’ одиночная скобка

\" двойная скобка

Составное слово — обычно они записываются в виде функторов (как и атомы), запись делается в круглых скобках, без пробелов, по необходимости отделенная запятыми: f(a,b,c). Такой вид записи также характерен и для функторов, которые записаны в виде, 2+2 = ’+’(2,2). Списки определяются как вложенные структуры (rightward-nested structures), сделанные с использованием оператора ’.’; например:

[a] = ’.’(a,[]) [a,b] = ’.’(a,’.’(b,[])) [a,b|c] = ’.’,(a,’.’(b,c))

Может использоваться только одна (|) в списке, без запятых после нее. Любой термин, заключенный в {} обрабатывается как аргумент специального функтора ’{}’:

{hotel} = ’{}’(hotel), {1,2,3}=’{}’(1,2,3).

Операторы — характеризуются именем, спецификатором (specifier) и приоритетом. Имя оператора — представляет собой атом, который не является двусмысленным: т.е. один и тот же атом может выступать в роли оператора в различных классах, с использованием инфиксов и префиксов знака минус. Спецификатор оператора — это строка; например xfy, которая выступает как класс (инфикс, постфикс и префикс), ассоциативность: xfy показывает, что первым делом выполняется группирование справа (grouping on the right), yfx — слева, xfx – без разницы. Приоритет оператора – неотрицательное целочисленное значение от 0 (максимальный приоритет) до 1200 (минимальный).

Операторы могут быть определены как op предикат (Приоритет, Спецификатор, Имя) или: — op (Приоритет, Спецификатор, Имя). Предопределенные операторы не входят в состав стандартной версии tuProlog, и их количество определяется библиотеками.

Запятые — запятая выполняет три функции:

1. Разделяет аргументы функторов

2. Разделяет элементы списков

3. Выступает как инфиксный оператор с приоритетом 1000. Так как (a,b) (без функтора в начале) является составным словом, аналогичным ’,’(a,b).

Круглые скобки — могут использоваться с любым термином. Значение скобок — в упорядочении записи, они не дают нарушать порядок выполнения операций. Необходимо помнить, что операторы, заключенные в круглые скобки не выступают более в роли операторов; так 2(+)3 – является синтаксической ошибкой.

### Настройка tuProlog

Разработчики TuProlog предлагают четыре способа настройки:

Теории — в tuProlog теория является текстом, т.е. последовательностью клаузов и/или директив. Клаузы и директивы ограниченны точками и разделяются пробелом. Теории могут быть загружены и выгружены в с помощью библиотечных предикатов.

Директивы — записываются с помощью:

1. Предиката, который полностью поддерживается tuProlog, и может быть использован для настройки tuProlog (set_prolog_flag/1, load library/1, consult/1, solve/1)

2. Формата и синтаксиса read—terms (термин Prolog с последующим завершающим символом, состоящий из текста и точки).

Признаки — tuProlog позволяет динамично определять признаки, которые описывают некоторые аспекты библиотек и их предикатов, и значимые функторы. Признак различается по имени (буквенно-цифровому атому), списку возможных значений, изначальному значению, и булевскому значению, которое показывает возможность изменения признака. Можно изменить значение признака (если есть такая возможность) включив в список значений новое.

Библиотеки — tuProlog может быть расширен за счет загрузки или выгрузки библиотек. Каждая библиотека предоставляет свой особый набор предикатов, функторов и теорий, которые делают доступными новые признаки и операторы. Библиотеки могут быть предустановленными или измененными пользователем. Библиотека может быть загружена посредством predicate load library, или method loadLibrary.

На данный момент, tuProlog не поддерживает управление исключениями: в действительности, исключение делает предикат и/или функтор, в котором оно присутствует, ошибочным, что может привести к ошибке работы самой программы.

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

Данный раздел содержит список встроенных предикатов, которые содержатся в tuProlog.

В описании встроенных аргументов (built—in argument) операция выполняется согласно следующему правилу, символ “+” перед обозначает исходный аргумент, “-” обозначает итоговый аргумент, “?” обозначает исходный или итоговый аргумент, “@” обозначает исходный аргумент, который должен быть несвободным (связанным).

#### Управление настройками

• true/0

true — истина.

• fail/0

fail — ложь.

• ’,’/2

’,’(Первый аргумент, Второй аргумент) истинно только в том случае, если и первый и второй аргументы истинны.

• !/0

! — истинно. Удаляются все пункты выбора между сокращенной (cut) и исходной (parent) задачей цели. Результатом операции будет, использование текущего оператора и подстановок, используемых в сокращенной задаче.

• ’$call’/1

’$call’(Goal) истинно тогда, когда задача (Goal) истинна. Это действие нельзя сократить.

Операция выполняется согласно следующему правилу: call(+callable term(вызываемый термин))

• halt/0

halt завершает выполнение программы Prolog и возвращается к системе, которая вызвала процессор (processor).

• halt/1

halt(X) завершает выполнение программы Prolog и возвращается к системе, которая вызвала процессор, минуя значение X.

Операция выполняется согласно следующему правилу: halt(+int)

#### Унификация терминов и управление

• is/2

is(X, Y) истинно, если X можно объединить со значением выражения Y.

Операция выполняется согласно следующему правилу: is(?term, @evaluable)

• ’=’/2

’=’(X, Y) истинно, если X и Y объединяемы.

Операция выполняется согласно следующему правилу: ’=’(?term, ?term)

• ’\=’/2

’\=’(X, Y) истинно, если X и Y нельзя объединить.

Операция выполняется согласно следующему правилу: ’\=’(?term, ?term)

• ’$tolist’/2

’$tolist’(Составное слово, Список) истинно, если Составное слово – составное термин, и Список – списковое представление составного слова.

Операция выполняется согласно следующему правилу: ’$tolist’(@struct, —list)

• ’$fromlist’/2

’$fromlist’(Составное слово, Список) истинно, если Составное слово, объединяемо со списковым представлением списка.

Операция выполняется согласно следующему правилу: ’$fromlist’(—struct, @list)

• copy term/2

copy term(Термин1, Термин2) истинно, если Термин2 объединяем с переименованной копией Термина1.

Операция выполняется согласно следующему правилу: copy term(?term, ?term)

• ’$append’/2

’$append’(Элемент, Список) истинно, если Список это список (List is a list).

Операция выполняется согласно следующему правилу: ’$append’(+term, @list)

#### Управление базой знаний

• ’$find’/2

’$find’(Клауз, Список клаузов (ClauseList)) истинно, если Список клаузов является списком, а Клауз — клаузом, при этом все клаузы базы данных соответствующие Клаузу прикреплены к списку.

Операция выполняется согласно следующему правилу: ’$find’(@clause, @list)

• abolish/1

abolish(PI) полностью удаляет динамичный предикат, соответствующий Индикатору предиката (predicate indicator PI).

Операция выполняется согласно следующему правилу: abolish(@term)

• asserta/1

asserta(Клауз) истинно, при этом Клауз добавляется в начало базы данных.

Операция выполняется согласно следующему правилу: asserta(@clause)

• assertz/1

assertz(Клауз) истинно, при этом Клауз добавляется в конец базы данных.

Операция выполняется согласно следующему правилу: assertz(@clause)

• ’$retract’/1

’$retract’(Клауз) истинно, если база данных содержит, по крайней мере, один клауз объединенный с Клаузом. При этом клауз удаляется из базы данных. Повторное выполнение операции не возможно.

Операция выполняется согласно следующему правилу: ’$retract’(@clause)

#### Управление операциями и признаками

• op/3

op(Приоритет, Спецификатор, Оператор) истинно. Всегда выполняется, изменяя таблицу операторов. Если приоритет равен 0, тогда оператор удаляется из таблицы операторов. Иначе, Оператор добавляется к таблице операторов, с приоритетом — Приоритет и ассоциативностью определяемой Спецификатором. Если оператор, с одинаковым символом Оператора и Спецификатора уже существует в таблице операторов, предикат модифицирует его приоритет в соответствии с аргументом Приоритета.

Операция выполняется согласно следующему правилу: op(+integer, +specifier, @atom or atom list)

• flag list/1

flag list(Список признаков) истинно, если Список признаков содержит признаки определяемые в ядре TuProlog.

Операция выполняется согласно следующему правилу: flag list(—list)

• set prolog flag/2

set prolog flag(Признак, Значение) истинно, и ассоциируется со значением признака, где значение находится в пределах допустимых значений (implementation defined range of values for Flag).

Операция выполняется согласно следующему правилу: set prolog flag(+flag, @nonvar)

• get prolog flag/2

get prolog flag(Признак, Значение) истинно, если Признак поддерживается TuProlog и Значение ассоциируется с ним. get prolog flag/2 не обратимо.

Операция выполняется согласно следующему правилу: get prolog flag(+flag, ?term)

#### Управление библиотеками

• load library/1

load library(Имя Библиотеки) истинно, если Имя Библиотеки соответствует библиотеке tuProlog, которая доступна для загрузки. Определенные библиотеки загружаются автоматически. Имя Библиотеки, это имя класса Java предоставляющего библиотеку.

Операция выполняется согласно следующему правилу: load library(@string)

• unload library/1

unload library(Имя Библиотеки) истинно, если Имя Библиотеки соответствует библиотеке tuProlog, которая доступна для выгрузки. Определенные библиотеки выгружаются автоматически. Имя Библиотеки, это имя класса Java предоставляющего библиотеку.

Операция выполняется согласно следующему правилу: unload library(@string)

#### Директивы

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

В tuProlog, директивы не компонуемы: каждый запрос должен содержать только одну директиву. Если возникает необходимость использования нескольких директив, необходимо использовать множественные запросы.

• :- op/3

op(Приоритет, Спецификатор, Оператор) добавляет оператор в таблицу операторов, с приоритетом — Приоритет и ассоциативностью определяемой Спецификатором.

Операция выполняется согласно следующему правилу: op(+integer, +specifier, @atom or atom list)

• :- flag/4

flag(Имя признака, список допустимых значений (ValidValuesList), исходное значение (DefaultValue), возможность модификации (IsModifiable)) добавляет новый признак, определяемый Именем Признака, с допустимыми значениями указанными в списке с исходным значением.

Операция выполняется согласно следующему правилу: flag(@string, @list, @term, @true, false)

• :- initialization/1

initialization(Задача) устанавливает задачу, которая запускается сразу после проверки теории.

Операция выполняется согласно следующему правилу: initialization(@goal)

• :- solve/1

Синоним инициализации/1.

Операция выполняется согласно следующему правилу: solve(@goal)

• :- consult/1

consult(Имя файла) немедленно загружает теорию содержащуюся в указанном файле.

Операция выполняется согласно следующему правилу: consult(@string)





## Библиотеки ISO

Библиотеки ISO зависят от наличия базовых библиотек. Эти библиотеки содержат почти все встроенные предикаты и функторы, которые являются частью стандарта ISO, и которые не являются непосредственно частью ядра tuProlog или библиотек ядра.

### Предикаты

#### Типовые описания

• bound/1

bound(Term) синоним ground/1 предиката из BasicLibrary.

Операция выполняется согласно следующему правилу: bound(+term)

• unbound/1

unbound(Term) истинно если Term не является базовым (элементарным) термом (ground term).

Операция выполняется согласно следующему правилу: unbound(+term)

#### Обработка Атомов

• atom length/2

atom length(Atom, Length) истинно, если целочисленное Length соответствует количеству символов в имени Atom.

Операция выполняется согласно следующему правилу: atom length(+atom, ?integer)

• atom concat/3

atom concat(Start, End, Whole) истинно, если Whole - атом полученный путем конкатенации (объединения) символов с End до First.

Если Whole представлено примером, тогда все разложение Whole может быть получено путем backtracking (перебора с возвратами; отслеживания).

Операция выполняется согласно следующему правилу: atom concat(?atom, ?atom, +atom)

Операция выполняется согласно следующему правилу: atom concat(+atom, +atom, -atom)

• sub atom/5

sub atom(Atom, Before, Length, After, SubAtom) истинно, если SubAtom является субатомом Atom, с длинной Length, с Before - символами перед субатомом и After -символами за ним.

Является перевыполняемым.

Операция выполняется согласно следующему правилу: sub atom(+atom, ?integer, ?integer, ?integer, ?atom)

• atom chars/2

atom chars(Atom,List) выполняется, если List - список, чьи элементы являются одно-символьными атомами (one character atoms), в сумме создающие атом.

Операция выполняется согласно следующему правилу: atom chars(+atom, ?character list)

Операция выполняется согласно следующему правилу: atom chars(-atom, ?character list)

• atom codes/2

atom codes(Atom, List) выполняется, если List - список, чьи элементы – коды символов, соответствующие символам атома.

Операция выполняется согласно следующему правилу: atom codes(+atom, ?character code list)

Операция выполняется согласно следующему правилу: atom chars(-atom, ?character code list)

• char code/2

char code(Char, Code) выполняется, если Code – код символов, соответствующий символам Char.

Операция выполняется согласно следующему правилу: char code(+character, ?character code)

Операция выполняется согласно следующему правилу: char code(-character, +character code)

• number chars/2

number chars(Number, List) выполняется, если List – список, чьи элементы одно-символьные атомы, которые в сумме создают Number.

Операция выполняется согласно следующему правилу: number chars(+number, ?character list)

Операция выполняется согласно следующему правилу: number chars(-number, ?character list)

• number codes/2

number codes(Number, List) выполняется, если List – список, чьи элементы являются кодами одно-символьных атомов, которые в сумме создают Number.

Операция выполняется согласно следующему правилу: number codes(+number,?character code list)

Операция выполняется согласно следующему правилу: number codes(-number,?character code list)

### Функторы

• Тригонометрические: sin(+expr), cos(+expr), atan(+expr).

• Логарифмические: exp(+expr), log(+expr), sqrt(+expr).

• Модульные: abs(+expr), sign(+Expr).

• Округляющие: floor(+expr), ceiling(+expr), round(+expr), truncate(+expr), float(+expr), float integer part(+expr), float fractional part(+expr).

• Деление целых чисел: div(+expr, +expr), mod(+expr, +expr), rem(+expr, +expr).

### Операторы

### Признаки



## Использование Java в tuProlog

Одним из главных преимуществ открытой архитектуры tuProlog является то, что любой компонент Java может быть напрямую использован из Prolog, легко и просто, используя библиотеку JavaLibrary: она передает все существующие возможности Java, все компоненты, в пользование tuProlog.

В этом случае все компоненты Java, включая отвечающие за взаимодействие (такие как Swing, JDBC, the socket package, RMI), становятся доступными для улучшения способностей взаимодействия tuProlog: “Одна библиотека за все, и все за одну ” – основной девиз.

### Отображение структур данных

Картирование двунаправлено – между примитивными типами Java и типами данных tuProlog.

По умолчанию, tuProlog целочисленные отображены в Java int или long соответственно, в то время как byte and short отображены в tuProlog как Int данные.

Только двойные числа (double numbers) Java используются, чтобы отобразить натуральные числа tuProlog, но числа с плавающей точкой возвращаются как результат метода вызова (method invocations) или область значений (field accesses) при этом без утраты информации.

Булевы значения в Java отображаются в особые константы tuProlog.

Символьные (char) Java отображены как атомы Prolog, но атомы отображаются в Java как (Strings) по умолчанию.

Любая переменная ( ) может быть использована для описания нулевого значения в Java.

### Предикаты

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

#### Вызов методов, создание объектов и классов

• java object/3

java object(ClassName, ArgList, ObjId) истино если ClassName - полное имя класса Java, класса доступного на любой файловой системе, ArgList – список аргументов которые могут использованы как пример объекта класса, и ObjId может быть использован как пример такого объекта; в результате, создается объект Java и отождествляется с ObjId.

ObjId может быть переменной Prolog (с соответствующей привязкой к термину).

Согласно значению признака объект java перевыполняем (retractable), связь, что установлена между термином ObjId и объектом Java не уничтожается выслеживанием (backtracking) (false value, default case) или уничтожается вовсе (true value).

Шаблон:

java object(+full class name,+list,?obj id)


• destroy object/1

destroy object(ObjId) истинно и образует связь между ObjId и объектом, с некоторй вероятность уничтожения предыдущих предикатов.

Шаблон:

destroy object(@obj id)


• java class/4

java class(ClassSourceText, FullClassName, ClassPathList, ObjId)- истинно если ClassSouceText - source string описывающая допустимое объявление классов Java, класса чье полное имя FullClassName,соответсвующееклассам найденным в ClassPathList, и ObjId может использоваться как ссылка для java.lang.Class объект представляющий данный класс.

Шаблон:

java class(@java source,@full class name,@list,?obj id)


• java call/3

java call(ObjId, MethodInfo, ObjIdResult)истинно если ObjId является ground term ссылающимся на объект Java, который предоставляет метод чье имя – имя функтора или термина MethodInfo и допустимые значения - значения MethodInfo,и ObjIdResultможет использоваться как ссылка на объект Java.

Безымянная переменная использованная как аргумент в MethodInfo представлена как нулевое значение в Java.

Шаблон:

java call(@obj id,@method signature,?obj id)


• ’<-’/2

’<-’(ObjId, MethodInfo)истинно если ObjId is a ground term ссылпющийся на объект Java, который предоставляет метод чье имя является функтором термина MethodInfo.

Безымянная переменная использованная в MethodInfo интерпретирована как нулевое значение в Java.

Шаблон:

’<-’(@obj id,@method signature)


• return/2

return(’<-’(ObjId,MethodInfo),ObjIdResult)истинно если ObjId is a ground term который ссылается на объект Java, предоставляющий метод, чье имя является именем функтора термина MethodInfo.

Безымянная переменная использованная как аргумент MethodInfo интерпретирована как нулевое значение в Java.

Этот предикат аналогичен предикату вызова в java (java call).

Шаблон:

return(’<-’(@obj id,@method signature),?obj id)



#### Управление массивами Java

• java array set/3

java array set(ObjArrayId,Index,ObjId) истинно если ObjArrayId является ground term, который ссылается на объект массива Java, Index допустимый индекс массива и ObjId является ground term, который ссылается на объект Java который может быть добавлен как элемент массива Безымянная переменная использованная как ObjId интерпретирована как нулевое значение в Java.

Этот предикат может быть использован для массивов объектов Java:

для массивов чьи элементы являются примитивными типами Java (такие как int,float, и т.д.) следующие предикаты имеют место, используя семантику массивов java но используя пределенный термин как термин tuProlog:

java array set int(ObjArrayId,Index,Integer)

java array set short(ObjArrayId,Index,ShortInteger)

java array set long(ObjArrayId,Index,LongInteger)

java array set float(ObjArrayId,Index,Float)

java array set double(ObjArrayId,Index,Double)

java array set char(ObjArrayId,Index,Char)

java array set byte(ObjArrayId,Index,Byte)

java array set boolean(ObjArrayId,Index,Boolean)

Шаблон:

java array set(@obj id,@positive integer,+obj id)


• java array get/3

java array get(ObjArrayId, Index, ObjIdResult) истинно если ObjArrayId является ground term который ссылается на объект массива Java, Index допустимый индекс массива, и ObjIdResult может использоваться как допустимая ссылка на объект массива Java.

Этот предикат может быть использован для массивов объектов Java:

для массивов чьи элементы являются примитивными типами Java (такие как int,float, и т.д.) следующие предикаты имеют место, используя семантику массивов java но используя определенный термин как термин tuProlog:

java array get int(ObjArrayId,Index,Integer)

java array get short(ObjArrayId,Index,ShortInteger)

java array get long(ObjArrayId,Index,LongInteger)

java array get float(ObjArrayId,Index,Float)

java array get double(ObjArrayId,Index,Double)

java array get char(ObjArrayId,Index,Char)

java array get byte(ObjArrayId,Index,Byte)

java array get boolean(ObjArrayId,Index,Boolean)

Шаблон:

java array get(@obj id,@positive integer,?obj id)


• java array length/2

java array length(ObjArrayId, ArrayLength) истинно если ArrayLength – длинна массива Javaопределяемого термином ObjArrayId.

Шаблон:

java array length(@term,?integer)



#### Предикаты

• java object string/2

java object string(ObjId,String) истинно если ObjId термин ссылающийся на объект Java и PrologString (в соответствии с семантикой метода String).

Шаблон:

java object string(@obj id,?string)



### Функторы

Библиотеки JavaLibrary не предоставляют никаких функторов.



### Операторы

Name Assoc. Prior.

<- xfx 800

returns xfx 850

as xfx 200

. xfx 600

### Признаки

Flag Name Default Value Possible Values

Java_object_backtrackable true,false false





## Создание новых библиотек

С помощью библиотекe tuProlog возможно достичь необходимые характеристики минималистичности, динамичной настраиваемости и прямой интеграции Prolog-Java.

Библиотеки являются симметричными, т.е могут быть созданы как на Prolog так и на Java: другие языки также могут использоваться, но не напрямую а через JNI (Java Native Interface).

Со стороны tuProlog, использование библиотеки написанной на Java не требует ни специального описания, ни выполнения каких-либо операций: Все что необходимо – присутствие соответствующего класса (.class) в файле библиотеки, в соответствующем месте на жестком диске.



### Реализация действий

Синтаксически, библиотека разработанная в Java должна расширят базовый класс alice.tuprolog.Library, и определять новые предикаты и/или поддающиеся оценке функторы и/или директивы в форме методов, соответсвующие простому подписанию условных обозначений (signature convention).В общем, новые предикаты должны удовлетворять этим обозначениям:

public boolean <pred name > <N >(T1 arg1, T2 arg2, ...,Tn argN)

в то время как доступные функторы - форме:

public Term <eval funct name > <N >(T1 arg1, T2 arg2, ...,Tn argN)

и диреткивы тоже:

public void <dir name > <N >(T1 arg1, T2 arg2, ..., Tn argN)


где T1, T2, ... Tn термины или одельные классы, такие как Struct, Var, Long, и т.д., определенные в tuProlog, соответсвующие аналогам Java соответсвующих типов данных Prolog.

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

Библиотека определяет также, новые данные теории, которые собранны движком Prolog , хотя вызов библиотечного метода String getTheory().

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

Только несущественное представление библиотечной теории вынужденно быть в форме String; сама имплементация (implementation) может быть выбрана разработчиком библиотеки на свое усмотрение.

Однако, используя Java String для обработки кода библиотек Prolog гарантирует автономность при загрузке библиотек через удаленные устройства, такие как RMI.



### Имя библиотеки

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

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

Например:

package acme; import alice.tuprolog.*; public class MyLib_ver00 extents Library {public String getName(){return “MyLibrary”;}…}


Этот класс определяет библиотеку названную MyLibrary.

Она может быть загружена в Prolog используя метод loadLibrary используя Java, или с помощью load library встроенного предиката Prolog, определяющего полное имя класса (acme.MyLib ve00).

Оно может быть выгружено с помощью метода unloadLibrary (или соответствующего встроенного предиката), указав вместо имени библиотеки (MyLibrary).