For loop 在swi prolog中创建类似for的内容
我想在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循环是
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).