1

我想在 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
}
}

我不知道如何在 swi prolog 中生成所有这些排列 i,j 请帮助我。

swi序言代码:

finish :-
        finishL1(i,j),

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

我想完成检查所有的finishL1(i,j)排列,如果有任何finishL1为真,那么写

4

2 回答 2

2

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

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

但要注意forall /2 'release' 完成后的变量。请阅读文档,它相当详细。

于 2013-05-27T15:31:11.433 回答
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,为循环提供本地支持。但是这些结构没有官方或事实上的标准。

于 2013-05-27T21:49:48.017 回答