TermWare: Описание Семантики
DocumentId:GradSof-TermWare-r-Sm-20.06.2001-4


August 18, 2008

Contents

1 Введение (Introduction)
2 Формальная модель (Formal Model)
 2.1 Алфавит (ABC)
 2.2 Термы (Terms)
 2.3 Операции (Operations)
 2.4 Упорядоченные множества правил
 2.5 Действия (Actions)
 2.6 Терминальная система со взаимодействием (term system with actions)
3 Язык TermWare (Language)
 3.1 Иерархическая система имен
 3.2 Встраиваемые парсеры других языков
4 Java API
 4.1 Работа с термами
  4.1.1 Term
  4.1.2 TermFactory
  4.1.3 ITermTransformer
  4.1.4 ITermRewritingStrategy
  4.1.5 IFacts
  4.1.6 IEnv
  4.1.7 TermSystem
 4.2 Воспомогательные классы
  4.2.1 TermWare
  4.2.2 TermWareInstance
  4.2.3 IParser, IParserFactory
  4.2.4 IPrinter, IPrinterFactory
5 Перечень изменений

1 Введение (Introduction)

Termware - система компьютерной алгебры, предназначенная для встраивания в системы языковой обработки. В этой статье определяется формальная модель, лежащая в основании семантики языка, бегло описывается синтаксис языка TermWare и внутреннее строение Java API. Текст рассчитан на знакомство читателя как с практикой объектно - ориентированного и функционального программирования, так и с основами математической логики. Впрочем, если Вы — программист, думающий использовать TermWare в своих проектах, то чтение первой части можно заменить чтением ее первого параграфа.

2 Формальная модель (Formal Model)

Здесь построена обычная терминальная алгебра, где объектами языка являются термы (выражения вида fi(x1xn), переменные и элементарные типы данных, такие-же как во всех языках функционального программирования) с одним отличием от стандартного подхода: конструктор упорядоченного множества является выделенным термом и операции подстановки на этих термах сохраняют порядок.

Остаток раздела посвятим обычному утомительному построению:

2.1 Алфавит (ABC)

  1. Множество примитивных типов (внимание, это не многосортная алгебра)

    Σpt = {CHAR,SHORT,INT,BigDecimal,BigInteger,BOOL,STRING,ATOM}

  2. Множество типизированных констант Σcpt = {cipt}, с каждой константой связанно значение, на множестве соответствующего примитивного типа, т. е. val : Σcpt- > Dompt, где
  3. Множество терминальных символов Σt = {ti}
  4. Множество подстановочных символов Σx = {xi}
  5. Скобки ’(’ и ’)’ и знак зяпятой ’,’
  6. Множество модельных функциональных символов Σf = {fi}

2.2 Термы (Terms)

Определим множество конкретных термов Tc :

И множество подстановочных термов Tv

Терм, принадлежащий Tv∕Tc будем называть термом со свободными переменными, для каждого терма T множество входящих в него подстановочных символов будем называть множеством свободных переменных этого терма и обозначать как v(T).

2.3 Операции (Operations)

Определим на нашей системе термов следующие модельные функции:

Правило переписывания это тройка: (X,tin,tout) где:

Семантика действия переписывания определяется следующим выражением:

apply(t,tin,tout) = subst(tout,free_unify(tin,t))

Расширим действия переписывания на множество правил:

apply(t,{r1...rn}) = {apply(t,r1)...apply(t,rn)}

и на множество свободных термов1 :

apply({t1...tn},R) = ∪apply(ti,R )

Естественно, само правило может быть представленно в виде терма: rule(vars,tin,tout) где:

Будем говорить, что множество термов x переписывается в множество термов y, если существует цепочка z1zn такая, что

z1 = x∧ zn = y ∧ ∀i ∈ {1...n}zn+1 ∈ apply(zn,R)

Наконец, будем говорить что множество термов T сходится относительно множества правил R если существует неподвижная точка уравнения:

Множество правил R называется сходящимся, относительно конечного множества термов T, если apply*(T,R) - конечно.

Множество правил обладает свойством нетеровости если

∀t ∈ T;r1,r2 ∈ Rapply(t,r1)! = apply(t,r2)∃R * ∈ R :
apply(apply(t,r1),R*) = apply(apply(t,r2),R*)∧ apply(t1,R*)

Таким образом мы приходим к широко известной теории переписывающих правил, с некоторыми отличиями от канонических формулировок:

Эти отличия не добавляют ничего существенного нового к математическим свойствам алгебры кроме того, что чисто технически с нею удобно работать.

2.4 Упорядоченные множества правил

Мы можем расширить семантику применения правил не ненетеровы системы, фиксируя порядок применения правил в несводимых критических парах. Т. е. правила p, s образуют критическую пару, если существует такой терм t, что apply(p,t)apply(s,t). Для сходящихся систем для любого терма t существует общая редукция apply(p,t) и apply(s,t). Однако много практически интересных вещей лучше описываются с помощью локально-неконфлюэнтных правил с фиксированным порядком применения.

Введем частичное упорядочивания переписывающих правил по ’степени конкретности’ их входных образцов. Будем писать t1ct2 когда t1 ’более конкретно’ чем t2. А что такое ’более конкретно’ ? - это означает что t1 может быть представлен как частичный случай t2, т. е. существует подстановка переменных s такая, что subst(t2,s) t1. Эквивалентное определение: t : free_unify(t,t1) free_unify(t,t2).

Далее, пусть p = (inp outp) и s = (ins outs) два правила, формирующие критическую пару. Мы говорим, что p cs if inpcins, и определим порядок применения как "более конкретный образец применяется первым", т. е.

              (
              {  apply(p,t)             p ≤c s
apply({p,s},t) =   apply(s,t)             s ≤c p
              (  ι{apply(p,t),apply(s,t)}  p ~c s
где ι – операторо недерменисткого выбора, зависящий от стратегии переписывания.

Легко показать что для каждого набора правил r1rn, где i,j : ij ⇒⁄ ri ~crj может быть построена эквивалентная система правил без ограничений на порядок применения.

2.5 Действия (Actions)

Следующий вопрос, который следует рассмотреть - это представление вычислений над термами. Обычный подход (множество правил, преобразующих входное множество термов в выходное) нас не устраивает, так как в реальном мире нам нужно несколько больше:

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

Следовательно, нам необходимо определить операционную семантику, включив в нее в явном виде взаимодействие с внешней средой и изменение набора правил в зависимости от состояния.

Терминальная машина это четверка: < S,E,ϕse > где:

Поведение терминальной машины определяется следующим преобразованием за единицу дискретного времени:

< S,E, X > - >< ϕs(X,E, S)|S,ϕe(ϕs(X,E, S)|Y)

(тут x|Y обозначает проекцию x на координату Y в обычном теоретико-множественном смысле).

Нижеприведенная диаграмма может быть более ясна для понимания.

          phi_s  
 <S,E,X> ----------> <S’,Y’>   phi_e  
    |                       ----------> E’  
    ---------------------E

2.6 Терминальная система со взаимодействием (term system with actions)

Какие изменения нам требуются внести для отражения требований операционной семантики в систему переписывания термов - просто добавить некоторый синтаксис взаимодействия со средой :

Пара вход/выход (X : x y) заменяется на четверку (X : (x,ein) (y,eout), где

Будем обозначать эту четверку как x[ein] y[eout]. Выражение x[ein] для терма t можно интерпретировать как сопоставление с образцом x при выполнении subst(ein,snd(free_unify(t,x))) (пусть snd(free_unify(t,x)) = s), y[eout] - как подстановка унификации в y и выполнения subst(eout,s).

3 Язык TermWare (Language)

Лексемы: