我想在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为真则写入
答案 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为循环提供本机支持。但这些结构并没有官方或事实上的标准。