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

时间:2015-12-29 09:36:07

标签: sicstus-prolog eclipse-clp

prolog中count / 3和/ 3之间有什么区别? 以及如何使用 for-loop 与递减 -1 之类的( for(I,9,0,-1) )?

  • 例如:
      

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

2 个答案:

答案 0 :(得分:3)

Prolog(ECLiPSe / SICStus)中count / 3和/ 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> = = Max

  • 模板 计数(-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 / for / 3 count / 3 迭代器所属的 do-loop 构造,尝试为迭代递归的常见情况提供紧凑符号,并以一种让人联想到程序循环符号的方式。逻辑变量的独特属性和Prolog的一般双向性质导致一些有趣的特征,例如,使用 foreach / 2 迭代器,您可以使用相同的循环代码遍历现有列表或构建新列表。在目前迭代数字的情况下,遗憾的是这种对称性没有实现,因此你要问的是两个不同的迭代器。

如何使用带有递减的for循环

没什么特别的,真的:

    ?- ( 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)

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

答案 1 :(得分:2)

首先,你的问题是关于do-loops,一种在某些系统中找到的控制结构。 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-loops中有太多这样的“特性”,因为多年来仍然没有修复,你可能想先学习没有do循环的Prolog。特别是,请考虑更高阶的结构,例如maplist/2..