For loop 在swi prolog中创建类似for的内容

For loop 在swi prolog中创建类似for的内容,for-loop,prolog,permutation,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 } } 我希望finish检查所有finishL1(i,j)排列,就像上面一样,如果任何finishL1为true,那么Prolog中的write循环是

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

我希望finish检查所有finishL1(i,j)排列,就像上面一样,如果任何finishL1为true,那么Prolog中的write

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

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

但要注意/2在完成时“释放”变量。请阅读文档,它相当详细。

另一种可能的解决方案,取自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).
:-meta_谓词(forto_aux(*,*,*,*,*,0))。
forto_aux(计数、第一、最后、增量、目标):-
(第一个=<最后一个->
\+\+(计数=第一,呼叫(目标)),
接下来是第一个+增量,
forto_aux(计数、下一个、最后一个、增量、目标)
;是的
).
:-元谓词(forto(*,*,0))。
forto(第一个经验、最后一个经验、目标):-
第一个是FirstExp,
最后是LastExp,
forto_aux(_,第一,最后,1,目标)。
有关其他循环变体和相关谓词,请参见:

(接口) (实施)

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

:- 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).