如何添加一个函数(例如,汉明重量)并在右侧出现的表达式中使用它是一些(is)/2
目标?
像goal_expansion或term_expansion这样的东西可以帮助吗?
我承认这不是一个很大的功能,但它可以提高我的一些Prolog程序的可读性。
编写自定义(is)/2
谓词(实现自定义表达式求值程序)是可行的,但我希望将运行时开销降低,因为我不想牺牲运行时开销的可读性。情况下。
答案 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/2
和goal_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实现都提供,并且实现之间存在显着差异。