我正在为常见的术语扩展工作流程添加库支持(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
伪模块/对象之外)中定义的,但是根据目标扩展使用的定点语义,这种可能性较小。
答案 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简化器及其与扩展框架的整合是开源here和here。例如,它用于重新排序连接,以下是用于此目的的示例规则:
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计算子句。
再见