prolog中的count/3和for/3之间有什么区别



prolog中的count/3和for/3之间有什么区别?以及如何将用于递减-1的循环表示(I,9,0,-1))?

  • 例如:

    Dec=-2,Min_bound=0,Max_bound=9
    结果=>9,7,5,3.1

Prolog(ECLiPSe/SICStus)中的count/3和for/3之间有什么区别

区别在于"模式",即Max参数是否用作输入(+)或输出

  • (-I,+Min,+Max)的模板用于控制循环迭代次数。Max的值必须在您开始循环时已知,即它可以是一个数字

    ?- ( for(I,1,3) do writeln(I) ).
    1
    2
    3
    

    或者它可以是带有实例化变量的表达式

    ?- Next=4, ( for(I,1,Next-1) do writeln(I) ).
    1
    2
    3
    

    终止条件为I>=最大

  • 模板count(-I,+From,-To)用于计数迭代次数。在开始循环时,To通常是一个未实例化的变量,在循环结束时,它与循环迭代次数统一。在这样的设置中,迭代次数必须由其他东西控制,例如列表的长度,如本例所示:

    ?- ( foreach(X,[a,b,c]),count(I,1,N) do writeln(I-X) ).
    1 - a
    2 - b
    3 - c
    N = 3
    Yes (0.01s cpu)
    
  • 因为Prolog当然允许您使用值而不是非实例化变量,所以可以使用模板count(-I,+From,+to),但您应该注意终止条件是I=to而不是I>=to

for/3count/3迭代器所属的do循环构造试图为迭代递归的常见情况提供紧凑的表示法,并以一种让人想起过程循环表示法的方式这样做。逻辑变量的独特特性和Prolog的双向特性带来了一些有趣的特性,例如,使用foreach/2迭代器,您可以使用相同的循环代码遍历现有列表或构建新列表。在目前的数字迭代的情况下,不幸的是,这种对称性没有实现,因此您会询问两个不同的迭代器。

如何使用递减循环

没有什么特别的,真的:

    ?- ( for(I,9,0,-2) do writeln(I) ).
    9
    7
    5
    3
    1
    Yes (0.00s cpu)

或者,用于收集列表中的结果:

    ?- ( for(I,9,0,-2),foreach(I,Is) do true ).
    Is = [9, 7, 5, 3, 1]
    Yes (0.00s cpu)

编辑:有人指出,以上内容在SICStus(4.3.2)中不起作用,因为不支持for/4迭代器。您仍然可以使用通用的fromto/4迭代器进行这样的循环,但您必须自己进行一些算术运算,例如

?- ( fromto(9,I,I1,-1) do I1 is I-2, writeln(I) ).
9
7
5
3
1
Yes (0.01s cpu)

对于一般情况,这会变得有点棘手,因此您可以使用递归解决方案来获得更清晰的代码。。。

首先,您的问题是关于do循环,这是一些系统中的一种控制结构。SICStus中当前的实现具有相当不稳定的行为——在部分w.r.t.count:中

| ?- for(I,5,1), foreach(I,List) do true.
List = [] ? ;
no
| ?- count(I,5,1), foreach(I,List) do true.
**LOOPS**

文档中不清楚这种循环。但据我猜测,count总是向上计数,并期望Max的值是合法的;如果没有,它就会循环。

无论如何,do循环中有太多这样的"功能",多年来仍然没有修复,所以你可能想先学习没有do循环的Prolog。特别是,考虑像maplist/2..这样的高阶构造。

最新更新