在swi prolog中创建类似于for的东西

时间:2013-05-27 15:21:09

标签: for-loop prolog permutation

我想在swi prolog中创建类似for的东西

for(int i=1;i<8;i++)
{
for(int j=1;j<11;j++)
{
//do something with i and j
//finish(i,j) in swi prolog 
if any finish is true write a message
}
}

我没有任何想法如何生成所有这些排列i,j在swi prolog中请帮助我。

swi prolog代码:

finish :-
        finishL1(i,j),

    write('Game Over, Player1 won!'),nl,
    start.

我想完成检查所有finishL1(i,j)排列,如上所述,如果任何finishL1为真则写入

2 个答案:

答案 0 :(得分:2)

Prolog中的循环是有问题的,因为变量无法重新分配。你可以试试

forall(between(1,8,I),
   forall(between(1,11,J), (
      % place your code
   )
),

但请注意forall / 2'在完成时释放'变量。请阅读文档,这是相当明确的。

答案 1 :(得分:1)

另一种可能的解决方案,取自Logtalk标准库:

:- meta_predicate(forto_aux(*, *, *, *, 0)).
forto_aux(Count, First, Last, Increment, Goal) :-
    (   First =< Last ->
        \+ \+ (Count = First, call(Goal)),
        Next is First + Increment,
        forto_aux(Count, Next, Last, Increment, Goal)
    ;   true
    ).

:- meta_predicate(forto(*, *, 0)).
forto(FirstExp, LastExp, Goal) :-
    First is FirstExp,
    Last is LastExp,
    forto_aux(_, First, Last, 1, Goal).

有关其他循环变体和相关谓词,请参阅:

https://github.com/LogtalkDotOrg/logtalk3/blob/master/library/loopp.lgt(界面) https://github.com/LogtalkDotOrg/logtalk3/blob/master/library/loop.lgt(实施)

其他一些Prolog编译器,例如B-Prolog和ECLiPSe为循环提供本机支持。但这些结构并没有官方或事实上的标准。