prolog - 如何模拟for循环

时间:2016-05-30 07:17:45

标签: prolog

我正在尝试生成一个列表,例如

[X1/1,X2/2,X3/3....Xn/N] with given N.

我尝试制作一个maketemplate(N,L)函数N,并返回L的列表Xn/N,其中Xn是第N个变量,N是一个整数。

作为一个更简单的示例,我最初尝试使用给定[1,2,3...N]制作N的列表,但我甚至无法使其工作。

mysolution(L,N,N).
mysolution([I|Rest],I,N):-
   I < N,
   I is I+1,
   mysolution(Rest,I+1,N). 

如何在prolog中模拟类似for循环的操作?

2 个答案:

答案 0 :(得分:0)

不要再想法了。失败循环是Prolog的方法:

seq(From,_,From).
seq(From,To,X) :-
    From<To,
    Next is From+1,
    seq(Next,To,X).

loop :-
    seq(1,10,Index),
    do_something(Index),
    fail.
loop.

do_something(Index) :-
    display(Index),nl.

故障循环具有以下asbtract结构:

loop:-
  generate(X),
  do_something(X),
  fail.
loop.

答案 1 :(得分:0)

我刚才创建列表的类似示例包含一个具有一定数量的随机元素,它可能满足您有关从内部递归获取动态值并将其用于递归之外的需求(已按注释中的内容更正):

create_list(0,X):- !, X=[].
create_list(_size,X):-
  _size>0,
  _last_size is _size-1,
  create_list(_last_size,Y),
  random(0,9,_random),
  X=[_random|Y].

有一些经验:

  1. 您不能更改具有特定值的变量,因此您不能基于变量本身进行更改,在具有有限参数的过程中获得动态(或称其为有限递归结构可能更精确)的方法是使用递归要创建无限,无限可以容纳随机数。具体来说,请使用新变量在规则定义中调用规则本身,例如我的代码中的YX。存在不同变量的地方应该相同,递归后更改值,一遍又一遍地执行 Unification 以获得内在值。
  2. 通过另一个规则或事实来定义结束条件,例如在无限远处停止,但不执行循环。
  3. 确保您的循环过程可以逆转,并且在逆转后可以获得解,这是算法的一个特征,因为通常循环是递归的逆转,而我们只能使用递归。

我经常使用序言进行研究,如果您对项目开发更感兴趣,不要认为循环可能是更好的选择。