将goal_expansion / 6限制为仅编译时间

时间:2016-03-30 19:53:34

标签: prolog sicstus-prolog

在SICStus Prolog中,有一个用于扩展目标的钩子:goal_expansion/6,它在编译时和运行时在metacalling期间调用。这些调用会产生相当多的运行时开销,从而减慢了metacalling的速度。我扩展的目的只是优化。从语义上讲,目标和扩展目标是等价的。

如何在运行时禁用此类调用?

(似乎我必须废除goal_expansion/6,这看起来有点粗鲁。它也会妨碍lightweight recompilation)。

2 个答案:

答案 0 :(得分:5)

惯用方法是使用带有选项load_files/3的{​​{1}}加载仅编译时代码。不幸的是,如果你想在运行你的代码的同一个过程中(重新)编译,这没有任何帮助。

使用when(compile_time)删除abolish的定义也不理想(因为如果你重新编译它就会消失)。但它并不像看起来那么糟糕/粗鲁:goal_expansion/5是每个模块,因此您可以废除它而不必担心会破坏其他模块中的某些功能。

答案 1 :(得分:4)

解决方法是调用div float: left; width: 100% - 500px; (i.e. this should take up all the remaining space) div float: right; width: 250px; div float: right; width: 250px; 谓词。 类似的东西:

prolog_load_context/2

goal_expansion(...) :- prolog_load_context(source, _), % compile-time; expand the goal ... . 谓词仅在编译时成功。