Срок расширения рабочих процессов

Я добавляю поддержку библиотеки для общих рабочих процессов раскрытия терминов (1). В настоящее время я определил "рабочий" рабочий процесс, в котором наборы правил раскрытия терминов (2) пробуются до тех пор, пока одно из них не выполнится успешно, и "конвейерный" рабочий процесс, в котором результаты расширения из набора правил расширения терминов передаются в следующий набор в конвейере. Интересно, существуют ли другие разумные рабочие процессы расширения терминов, которые, хотя и менее распространенные, имеют практическое применение и поэтому все еще стоят поддержки библиотек.

(1) Для Logtalk текущие версии можно найти по адресу:

https://github.com/LogtalkDotOrg/logtalk3/blob/master/library/hook_pipeline.lgt https://github.com/LogtalkDotOrg/logtalk3/blob/master/library/hook_set.lgt

(2) Набор правил расширения следует понимать в этом контексте как набор предложений для term_expansion/2 пользовательский предикат хука (также возможно goal_expansion/2 определяемый пользователем предикат ловушки, хотя это менее вероятно, учитывая семантику фиксированной точки, используемую для расширения цели), определенную в модуле Prolog или объекте Logtalk (отличном от user псевдо-модуль / объект).

1 ответ

Фиксированная точка - это уже набор и конвейер на определенном уровне во время расширения. Его expand_term/2 является просто транзитивным замыканием одноэтапных предложений term_expansion/2. Но это работает только во время погружения в термин, по моему мнению, нам также нужно что-то при повторной сборке термина.

В редких случаях это транзитивное замыкание даже нуждается в проверке (==)/2, как в некоторых системах Prolog. Скорее всего, он может просто остановиться, если ни один из term_expansions/2 ничего не сделает. Итак, в основном, без проверки (==)/2:

expand_term(X, Y) :- term_expansion(X, H), !, expand_term(H, Y).
expand_term(.. ..) :- /* possibly decend into meta predicate */

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

Это согласуется с некоторыми теориями переписывания терминов, которые говорят: нормальная форма (nf) соединения является функцией нормальной формы его частей. Таким образом, инфраструктура расширения не будет иметь дело с обычными формами, а только предоставит переопределения предикатов, но инфраструктура упрощения будет выполнять обычную работу с формами:

 nf(f(t_1,..,t_n)) --> f'(nf(t_1),..nf(t_n))

Таким образом, крюк упрощения займет f(nf(t_1), .., nf(t_n)), предполагая, что expand_term при переходе в мета-предикат уже дает nf(t_1).. nf(t_n) для мета-аргументов, а затем просто дать f(nf(t_1), .., nf(t_n)) к упрощателю.

Упроститель затем вернется f'(nf(t_1), .., nf(t_n))а именно выполнить свою работу и вернуть упрощенную форму, исходя из предположения, что аргументы уже упрощены. Такой упрощатель может быть довольно мощным. Jekejeke Пролог поставляет такие как этап после расширения.

Упрощенный модуль Jekejeke Prolog и его интеграция в инфраструктуру расширения открыты здесь и здесь. Например, он используется для изменения порядка соединения, вот пример правил для этой цели:

/* Predefined Simplifications */
sys_goal_simplification((  (  A, B), C), J) :-
   sys_simplify_goal((  B, C), H),
   sys_simplify_goal((  A, H), J).

Example:
     (((a, b), c), d) --> (a, (b, (c, d)))

Упроститель Jekejeke Prolog чрезвычайно эффективен, поскольку он может работать с предположением, что он получает уже нормализованные термины. Это не излишне неоднократно будет делать сопоставление с образцом в течение всего данного термина.

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

В приведенном выше примере это два sys_simplify_goal/2 звонки, мы делаем, например, не просто вернуть новый термин с (B,C) в нем, как правило расширения будет делать. поскольку (B,C) не был частью нормализованных аргументов для sys_goal_simplification/2, мы должны сначала нормализовать это.

Но поскольку инфраструктура упрощения тесно связана с инфраструктурой расширения, я сомневаюсь, что ее можно назвать архитектурой рабочего процесса. Конкретного направления потока нет, результат - пинг-понг. Тем не менее, структура упрощения может использоваться модульно.

Упрощение Jekejeke Prolog также используется при переписывании предложения прямой цепочки. Там он генерирует из одного прямого предложения несколько предложений дельта-вычисления.

до свидания

Другие вопросы по тегам