术语扩展工作流程

时间:2015-11-16 15:13:30

标签: prolog logtalk

我正在为常见的术语扩展工作流程添加库支持(1)。目前,我已经定义了一个" set"工作流程,其中尝试了一组术语扩展规则(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 个答案:

答案 0 :(得分:3)

在扩展期间,fixpoint既已经是一个集合,也是某个级别的管道。它的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在降级为元谓词时为meta参数产生nf(t_1) .. nf(t_n),然后简单地给出{{1}简化器。

然后,简化器将返回f(nf(t_1), .., nf(t_n)),即完成其工作并返回简化形式,基于参数已经简化的假设。这种简化器可以非常强大。 Jekejeke Prolog在扩张后提供了诸如舞台。

Jekejeke Prolog简化器及其与扩展框架的整合是开源herehere。例如,它用于重新排序连接,以下是用于此目的的示例规则:

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

Jekejeke Prolog简化器非常有效,因为它可以假设它接收到已经标准化的术语。在整个给定的术语中,不会不必要地重复进行模式匹配。

但它需要一些重写系统的通用实践来编写simplfication规则。简化规则应该在构造新术语时调用简化。

在上面的例子中,这两个是/* 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))) 次调用,例如我们不会简单地返回一个带有sys_simplify_goal/2的新术语,就像扩展规则一样。由于(B,C)不是(B,C)的规范化参数的一部分,我们必须首先将其标准化。

但是由于简化框架与扩展框架交织在一起,我怀疑它可以被称为工作流架构。没有具体的流向,结果是乒乓球。然而,simplfication框架可以以模块化的方式使用。

Jekejeke Prolog简化器也用于正向链接条款重写。它确实从一个前导子句生成多个delta计算子句。

再见