2013-05-27 72 views
0

我想在SWI序言中創造的東西就像一個用於創造這樣一個在SWI序言

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 
} 
} 

我沒有任何IDEEA如何產生這一切的置換I,J在SWI序言請幫助我。

SWI序言代碼:

finish :- 
     finishL1(i,j), 

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

我想完成做檢查所有finishL1(I,J)置換就像在上面,如果有finishL1爲真,則寫

回答

1

循環Prolog中是有問題的,因爲變量不能被重新分配。你可以嘗試

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

,然而當進行提防forall/2 '釋放' 變量。請閱讀文檔,這是相當有說服力的。

0

另一種可能的解決方案中,從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,爲循環提供本地支持。但是這些結構沒有官方的或事實上的標準。