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

Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 592:
[http://img338.imageshack.us/img338/5286/flagje.jpg Признаки]
 
 
 
== Использование Java в tuProlog ==
 
Одним из главных преимуществ открытой архитектуры tuProlog является то, что любой компонент Java может быть напрямую использован из Prolog, легко и просто, используя библиотеку JavaLibrary: она передает все существующие возможности Java, все компоненты, в пользование tuProlog.
 
В этом случае все компоненты Java, включая отвечающие за взаимодействие (такие как Swing, JDBC, the socket package, RMI), становятся доступными для улучшения способностей взаимодействия tuProlog: “Одна библиотека за все, и все за одну ” – основной девиз.
 
=== Отображение структур данных (Mapping data structures) ===
 
Картирование двунаправлено – между примитивными типами 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).