Prolog Choicepoint修剪需要剪切,但我认为编译器应该足够敏锐,可以自己完成

Prolog Choicepoint修剪需要剪切,但我认为编译器应该足够敏锐,可以自己完成,prolog,swi-prolog,prolog-cut,Prolog,Swi Prolog,Prolog Cut,我正在做一个练习,写一个需要额外步长值的介于/3之间的值 这是一个有趣的练习,快速显示: 标记整数的优点,即如果X是正整数,则使用posX而不是X来利用模式匹配 使谓词尽可能具有确定性所固有的魔力不会在序列的末尾留下一个打开的choicepoint 在这种情况下,将标志数组传递给谓词以微调行为的兴趣在于,如果序列为空,它应该抛出还是失败? 而且: 国际标准化组织(ISO)标准例外条款的未经深思熟虑的格式使用复合术语而不是列表来传递信息。。。世界跆拳道联盟! libraryerror中异常引发谓词

我正在做一个练习,写一个需要额外步长值的介于/3之间的值

这是一个有趣的练习,快速显示:

标记整数的优点,即如果X是正整数,则使用posX而不是X来利用模式匹配 使谓词尽可能具有确定性所固有的魔力不会在序列的末尾留下一个打开的choicepoint 在这种情况下,将标志数组传递给谓词以微调行为的兴趣在于,如果序列为空,它应该抛出还是失败? 而且:

国际标准化组织(ISO)标准例外条款的未经深思熟虑的格式使用复合术语而不是列表来传递信息。。。世界跆拳道联盟! libraryerror中异常引发谓词的命名为什么不调用它们throw\ux。。。人们会不会真的想调用domain_error。。。? 事实上,must_be/2不能获取关于哪个arg确切导致问题的其他位置信息为什么! 完整的代码是。。。尚未完全进行单元测试

现在我已经设置了以下谓词

between_enum(+Start,+TaggedEnd,+TaggedStep,-Value)
它发出整数递增或递减序列的下一个值。它使用标记值的模式匹配。特别是,如果序列是一个整数,而不是表示无穷大的原子,且步长为正,则案例结束值由以下匹配术语intent和posStep的子句子集给出:

无切割:

?- between(10,15,1,Value).
Value = 10 ;
Value = 11 ;
Value = 12 ;
Value = 13 ;
Value = 14 ;
Value = 15 ;      % Unsure whether this is the end?
false.            % Well, turns out it is the end, really!
编译器是否应该足够强大,以确定在between_enumStart、intent、posStep、Value之后不可能有进一步的匹配-这是标记为的系列中的最后一个

int/1位于第二位置,并且 第三个位置的1号位置? 这是SWI Prolog 8.1

编辑

可能是编译器只是对前两个参数进行索引。没有必要插嘴

between_enum(Start,int(End),neg(Step),Value)
后面只有

between_enum(Start,inf,neg(Step),Value)
以及

between_enum(Start,minf,neg(Step),Value)

因此,它可以很好地区分inf、minf和int。你对参数顺序的直觉是正确的,并且可以通过一个简单的实验得到证实

first(tag1(_),_).
first(tag2(_),_).

second(_,tag1(_)).
second(_,tag2(_)).

你关于参数顺序的直觉是正确的,可以通过一个简单的实验来证实

first(tag1(_),_).
first(tag2(_),_).

second(_,tag1(_)).
second(_,tag2(_)).

这取决于Prolog系统,取决于可用的自动索引或可用的索引指令。例如,SWI Prolog具有自动深度索引功能,但在自动多参数索引方面存在一些特性。因此,对于madgen的例子:

first(tag1(_),_).
first(tag2(_),_).

second(_,tag1(_)).
second(_,tag2(_)).
在我的系统中,两个查询都没有留下选择点:

Jekejeke Prolog 4, Runtime Library 1.4.7

?- first(tag1(1),2).
Yes

?- second(2,tag1(1)).
Yes
另一方面,在SWI Prolog中,第二个查询中留下了一个选择点:

SWI-Prolog (threaded, 64 bits, version 8.3.17)

?- first(tag1(1),2).
true.

?- second(2,tag1(1)).
true ;
false.
这可能非常烦人,而且通常需要使用facade谓词 用于重新排列参数,使其更适合
SWI Prolog特定索引。

这取决于Prolog系统,取决于可用的自动索引或可用的索引指令。例如,SWI Prolog具有自动深度索引功能,但在自动多参数索引方面存在一些特性。因此,对于madgen的例子:

first(tag1(_),_).
first(tag2(_),_).

second(_,tag1(_)).
second(_,tag2(_)).
在我的系统中,两个查询都没有留下选择点:

Jekejeke Prolog 4, Runtime Library 1.4.7

?- first(tag1(1),2).
Yes

?- second(2,tag1(1)).
Yes
另一方面,在SWI Prolog中,第二个查询中留下了一个选择点:

SWI-Prolog (threaded, 64 bits, version 8.3.17)

?- first(tag1(1),2).
true.

?- second(2,tag1(1)).
true ;
false.
这可能非常烦人,而且通常需要使用facade谓词 用于重新排列参数,使其更适合
SWI Prolog特定索引。

SWI的索引描述见。它声称对多个参数进行索引,并提到一个谓词jiti_list/1,据说它告诉您谓词的索引方式。文档没有说明此功能有多新,我的旧7.2.3版本中没有此功能。@Isabelle新手谢谢Isabelle,我会看一看。ISO样式的例外会提供您想要的。例外条款的格式总是错误/2。第一个参数是实例化错误/0或语法错误/1或域错误/2形式的术语。第二个参数可用于以您选择的任何样式传递更多信息。一般来说,这里多的是少的。@重复是的,但是。。。遗憾的是,libraryerror的抛出函数不允许设置该参数。我只想通过口授考试!但是为什么应该多一些少一些呢?这只是另一个术语,它的大小真的不重要——除非有人出于某种原因无情地抛出。如果您想要比这个库提供的更多,请直接使用throw/1。一般来说,保持简单是件好事。做一件事,把它做好。。。UNiX方式!SWI的索引描述见。它声称对多个参数进行索引,并提到一个谓词jiti_list/1,据说它告诉您谓词的索引方式。文档没有说明此功能有多新,我的旧7.2.3版本中没有此功能。@Isabelle新手谢谢Isabelle,我会看一看。ISO样式的例外会提供您想要的。例外条款总是h
保存表单错误/2。第一个参数是实例化错误/0或语法错误/1或域错误/2形式的术语。第二个参数可用于以您选择的任何样式传递更多信息。一般来说,这里多的是少的。@重复是的,但是。。。遗憾的是,libraryerror的抛出函数不允许设置该参数。我只想通过口授考试!但是为什么应该多一些少一些呢?这只是另一个术语,它的大小真的不重要——除非有人出于某种原因无情地抛出。如果您想要比这个库提供的更多,请直接使用throw/1。一般来说,保持简单是件好事。做一件事,把它做好。。。UNiX方式!