实现用户定义的算术函数

时间:2015-03-04 12:42:14

标签: prolog expression iso-prolog

如何添加一个函数(例如,汉明重量)并在右侧出现的表达式中使用它是一些(is)/2目标?

像goal_expansion或term_expansion这样的东西可以帮助吗?

我承认这不是一个很大的功能,但它可以提高我的一些Prolog程序的可读性。

编写自定义(is)/2谓词(实现自定义表达式求值程序)是可行的,但我希望将运行时开销降低,因为我不想牺牲运行时开销的可读性。情况下。

3 个答案:

答案 0 :(得分:3)

ISO Prolog中没有这样的规定,既不延伸(is)/2也不依赖于目标扩展。并且,查看某些实现为此提供的各种实现特定功能,通常没有达成一致的方法。因此,实施自己的(my_is)/2似乎是最好的方法。

另请注意,这不仅会影响(is)/2,还会影响使用可评估仿函数的所有其他内置函数。特别是,所有算术比较内置函数(8.7算术比较)(见this overview)都会受到影响。

答案 1 :(得分:2)

我的简单(~20 LOC)语法糖,lifter,它基于goal_expansion。

有了升降器,条款

longer(A,B) :-
    length(A,º) > length(B,º).

扩展为

longer(A, B) :-
    length(A, C),
    length(B, D),
    C > D.

答案 2 :(得分:1)

您可以使用Logtalk的术语扩展机制,该机制是可移植的,可与其支持的12个Prolog编译器(*)配合使用。 Logtalk编译和加载和加载谓词接受Prolog文件,并将输出相应的Prolog扩展文件。例如,假设您要展开的文件名为source.pl,并且您的term_expansion/2goal_expansion/2谓词定义位于名为expansions.pl的文件中,您可以执行类似的操作:

% first, load the expansion hooks:
| ?- [expansions].
...

% second, expand a file using those hooks:
| ?- logtalk_compile(source, [hook(user)]).
...

您将获得扩展文件,该文件将(默认情况下)命名为source_pl.pl(在一个依赖于scratch_directory Logtalk标志值的目录中)。如果扩展包含在Prolog模块中,请使用模块名称上方而不是user。如果source.pl文件包含模块而不是普通的Prolog代码,则需要为term_expansion/2谓词定义一些子句,以避免Logtalk将模块编译为对象。但在更简单的情况下,您不使用模块,上面的两个查询就足够了。

Logtalk的术语扩展机制的一个可能有用的功能是,您可以通过使用{}/1控件构造包装来标记术语或目标,使其不被展开或进一步扩展。 / p>

(*)请注意,术语扩展机制不是标准的,并非所有Prolog实现都提供,并且实现之间存在显着差异。