TuProlog: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 130:
 
Это запустит интерпретатор 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.
 
Теории tuProlog – это сборник Prolog положений (clauses). Пусть они и похожи, но библиотечные и теоретические утверждения по-разному воспринимаются в tuProlog. Во-первых, теоретические утверждения должны аксиоматически представлять область знаний во время выдачи решения задачи (axiomatically represent domain knowledge at the time the proof is performed). Библиотечные утверждения должны представлять то, что требуется (процедурные знания (procedural knowledge), вспомогательные утверждения (utility predicates)) для получения достоверного и эффективного решения: библиотечные утверждения представляют “точные” знания, которые прочно зафиксированы в библиотеке.
Так как библиотечные и теоретические утверждения по-разному структурированы, они по-разному обрабатываются в TuProlog, и по-разному представлены в программе, во время ее работы: из этого следует, что они по-разному отображаются при мониторинге или отладке tuProlog. Набор инструментов разработчика, tuProlog IDE, разграничивает теории, аксиомы, утверждения и загруженные библиотеки. Фаза отладки, обычно пренебрегает библиотечными утверждениями (которые, как уже было сказано выше, задуманы как более устойчивые и тщательно проверенные), в то время как теоретические утверждения остаются на всем процессе работы.
 
=== Синтаксис tuProlog ===
 
Синтаксис tuProlog в основном состоит из ISO совместимых (на данный момент ISO исключения, ISO I/O утверждения и некоторые ISO директивы не поддерживаются), и входит в состав некоторых элементов: комментариев и непечатаемых знаков. Непечатаемые знаки состоят из форм без содержания (включая табуляцию и перевод страницы), маркеров конца страницы, и комментариев. Непечатаемые знаки могут быть поставлены до и после термина, оператора, скобки или разделительного знака, но в том случае, если они не разбивают атом или число, или не разделяют функтор от открытой скобки, за которой следуют значения. Например, атом p(a,b,c) может быть записан в виде p( a , b , c ), но не как p (a,b,c)).
 
В TuProlog существует два типа комментариев: первый тип начинается с /* и заканчивается на */, второй тип начинается с % и заканчивается в конце строки (или предложения). Вложенные комментарии не поддерживаются.
 
Переменные — имя переменной начинается с заглавной буквы или подчеркивания (_), и состоит из букв, цифр, и/или подчеркиваний. Одиночное подчеркивание обозначает безымянную (анонимную) переменную.
 
Атомы — существует 4 типа атомов:
I. Набор букв, цифр, и/или подчеркиваний, начинающихся с прописной буквыr.
II. Один или несколько символов {#, $, &, *, +, -, ., /, :, <, =, >, ?, @, ^, ~}, при условии, что атом не начинается с /*.
III. Специальные атомы [] и {}.
IV. Значение в одиночных кавычках.
 
Числа — представлены 2 видами - целые и дробные. Форматы целых чисел: десятичные числа, двоичные (с префиксом 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, и их количество определяется библиотеками.
 
Запятые — запятая выполняет три функции: она разделяет аргументы функторов, она разделяет элементы списков, и она выступает как инфиксный оператор с приоритетом 1000. Так как (a,b) (без функтора в начале) является составным словом, аналогичным ’,’(a,b).
 
Круглые скобки – они могут использоваться с любым термином. Значение скобок - в упорядочении записи, они не дают нарушать порядок выполнения операций. Необходимо помнить, что операторы, заключенные в круглые скобки не выступают более в роли операторов; так 2(+)3 – это является синтаксической ошибкой.
 
=== Настройка tuProlog ===
 
Разработчики Prolog предлагают четыре способа настройки tuProlog.
 
Он может быть настроен с помошью:
 
Теории — в tuProlog теория является текстом, т.е. последовательностью положений(clauses) и/или директив (directives). Положения и директивы ограниченны точками и разделяются пробелом. Теории могут быть загружены и выгружены в с помощью библиотечных утверждений.
 
Директивы (Directives) — директива может быть записана с помощью: -/1 утверждения, которое полностью поддерживается tuProlog, и может быть использовано для настройки tuProlog (set_prolog_flag/1, load library/1, consult/1, solve/1), формата и синтаксиса read-terms (в соответствии с ISO стандартом, read-term это термин Prolog с последующим завершающим символом, состоящий из текста и точки) (op/3). На директивах я подробно остановлюсь в следующих главах.
 
Признаки — tuProlog позволяет динамично определять признаки (или свойства), которые описывают некоторые аспекты библиотек и их утверждения, и значимые функторы. Признак различается по имени (буквенно-цифровому атому), списку возможных значений, изначальному значению, и булевскому значению, которое показывает возможность изменения признака. Можно изменить значение признака (если есть такая возможность) динамично включив в список значений новое значение.
 
Библиотеки — tuProlog может быть динамично расширен за счет загрузки или выгрузки библиотек. Каждая библиотека предоставляет свой особый набор утверждений, функторов, совместимых теорий, которые делают доступными новые признаки и операторы. Библиотеки могут быть предустановленными или измененными пользователем. Библиотека может быть загружена посредством predicate load library (возможность Prolog), или method loadLibrary (возможность Java).
 
На данный момент, tuProlog не поддерживает управление исключениями: в действительности, исключение делает утверждение и (или) функтор, в котором оно присутствует, ошибочным, что может привести к ошибке работы самой программы.