我想知道智能的第一参数索引是如何在各种Prolog实现上实现的。
特别是,简单的类型测试目标,如紧跟在子句"neck“后面的integer/1
,可以有助于更好的索引。考虑一下:
foo(h(X),X).
foo([],nil).
foo([_|_],cons).
foo(X,Y) :- integer(X), Y = n(X).
有了这个子句排序,我希望目标foo([],_)
能够继承,而不会留下任何无用的选择点。
不幸的是,SWI Prolog不能解决这个问题:
?- length(Xs,10),
maplist(=([]),Xs),
statistics(trailused,T1),
maplist(foo,Xs,Ys),
statistics(trailused,T2).
T1 = 5792,
T2 = 5968,
Xs = [[], [], [], [], [], [], [], [], [], []],
Ys = [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] ...
其他Prolog实现是否做得更好?
发布于 2015-05-26 18:46:01
YAP是另一个提供谓词子句扩展索引的Prolog系统:
$ yap
YAP 6.3.4 (x86_64-darwin14.3.0): Wed Apr 22 22:26:34 WEST 2015
?- [user].
% consulting user_input...
foo(h(X),X).
| foo([],nil).
| foo([_|_],cons).
| foo(X,Y) :- integer(X), Y = n(X).
| % consulted user_input in module user, 1 msec 0 bytes
true.
?- foo([],_).
true.
关于YAP索引特性的一些相关论文如下:
发布于 2015-04-25 01:11:34
是的,ECLiPSe系统做到了这一点。
正如您所建议的,为了索引的目的,它考虑了许多简单的内置谓词(比如integer/1, =/2, !/0
)。然后,对于实例化了第一个参数的所有foo/2
调用,您的示例都会确定性地执行,而不需要选择点。此外,ECLiPSe会对任何参数执行此操作,而不仅仅是第一个参数。
您可以在论文ECLiPSe - from LP to CLP中找到更多细节。
回答您的后续问题:不需要额外的VM功能,生成的VM代码如下所示:
foo / 2:
switch_on_type a(1)
list: ref(L5)
structure: ref(L1)
bignum: ref(L7)
[]: ref(L4)
integer: ref(L7)
meta: ref(L0)
label(L0):
try 0 2 ref(L1)
retry 0 ref(L3)
trust 0 ref(L5)
label(L1):
get_structure a(1) h / 1 ref(L2)
write_value a(2)
ret
label(L2):
read_value a(2)
ret
label(L3):
get_nil a(1)
label(L4):
get_atom a(2) nil
ret
label(L5):
get_list a(1) ref(L6)
write_void 2
label(L6):
get_atom a(2) cons
ret
label(L7):
get_structure a(2) n / 1 ref(L8)
write_value a(1)
ret
label(L8):
read_value a(1)
ret
发布于 2019-01-27 23:55:21
我们最近在Jekejeke Prolog中添加了卫士索引。下面的保护索引已经存在一段时间了:
p(..., X, ...) :- ..., var(X), ...
我们现在将这种治疗扩展到更多的守卫。这将在即将发布的1.3.4版本中提供:
p(..., X, ...) :- ..., X = f(...), ...
p(..., X, ...) :- ..., functor(X, f, ...), ...
这些新的保护可以很好地工作,因为它们会生成附加的子句键,这些子句键已经是现有索引的一部分。
但是目前我们现有的索引不允许查找Prolog类型,只能查找原子值,所以我们目前不能实现整数(X)保护,即使检测本身并不是很困难。
实现非常简单,我们不需要查找一些指令。相反,我们可以直接搜索更简单的Jekejeke Prolog中间格式的正文:
Java开源:类索引,方法getGuard()
https://stackoverflow.com/questions/29605132
复制相似问题