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
答案 0 :(得分: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(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..
。