首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >第一个参数索引

第一个参数索引
EN

Stack Overflow用户
提问于 2015-04-13 20:18:26
回答 4查看 1K关注 0票数 17

我想知道智能的第一参数索引是如何在各种Prolog实现上实现的。

特别是,简单的类型测试目标,如紧跟在子句"neck“后面的integer/1,可以有助于更好的索引。考虑一下:

代码语言:javascript
复制
foo(h(X),X).
foo([],nil).
foo([_|_],cons).
foo(X,Y) :- integer(X), Y = n(X).

有了这个子句排序,我希望目标foo([],_)能够继承,而不会留下任何无用的选择点。

不幸的是,SWI Prolog不能解决这个问题:

代码语言:javascript
复制
?- 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实现是否做得更好?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-26 18:46:01

YAP是另一个提供谓词子句扩展索引的Prolog系统:

代码语言:javascript
复制
$ 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索引特性的一些相关论文如下:

票数 3
EN

Stack Overflow用户

发布于 2015-04-25 01:11:34

是的,ECLiPSe系统做到了这一点。

正如您所建议的,为了索引的目的,它考虑了许多简单的内置谓词(比如integer/1, =/2, !/0)。然后,对于实例化了第一个参数的所有foo/2调用,您的示例都会确定性地执行,而不需要选择点。此外,ECLiPSe会对任何参数执行此操作,而不仅仅是第一个参数。

您可以在论文ECLiPSe - from LP to CLP中找到更多细节。

回答您的后续问题:不需要额外的VM功能,生成的VM代码如下所示:

代码语言:javascript
复制
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  
票数 6
EN

Stack Overflow用户

发布于 2019-01-27 23:55:21

我们最近在Jekejeke Prolog中添加了卫士索引。下面的保护索引已经存在一段时间了:

代码语言:javascript
复制
p(..., X, ...) :- ..., var(X), ...

我们现在将这种治疗扩展到更多的守卫。这将在即将发布的1.3.4版本中提供:

代码语言:javascript
复制
p(..., X, ...) :- ..., X = f(...), ...
p(..., X, ...) :- ..., functor(X, f, ...), ...

这些新的保护可以很好地工作,因为它们会生成附加的子句键,这些子句键已经是现有索引的一部分。

但是目前我们现有的索引不允许查找Prolog类型,只能查找原子值,所以我们目前不能实现整数(X)保护,即使检测本身并不是很困难。

实现非常简单,我们不需要查找一些指令。相反,我们可以直接搜索更简单的Jekejeke Prolog中间格式的正文:

Java开源:类索引,方法getGuard()

https://github.com/jburse/jekejeke-devel/blob/master/jekrun/headless/jekpro/model/rope/Index.java#L105

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29605132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档