2016-11-26 208 views
0

我正在開發一個Prolog程序,它應該將每個列表的nth元素加載到另一個列表中。例如:Prolog - 給出列表中的每個第n個元素

?- pred([a,b,c,d,e,f,g,h,i,j],3,R) => 
R = [c,f,i] 

哪裏pred是我試圖實現謂語。

但我真的不知道該怎麼做。我知道我需要一個計數器,它代表了我腦袋的當前位置,所以它將是一個/ 4謂詞,後面總結爲1/3,比如 第n個(列表,數字,結果): - 第n個(列表,數字,結果,計數器)或類似。

雖然,我不知道如何給頭部一個位置號碼,可以重置自己。因爲一旦它遇到n(假設n=3,它是列表中的c),它必須回到邏輯1並再次計數到3,發出元素,依此類推。

如何在我的實施中解決這些特定問題?

回答

1

如何實現這一點的一個例子:

nth_pos(L, N, R):- 
    nth_pos(L, 1, N, [], R). 

nth_pos([], I, N, Acc, Acc). 

nth_pos([H|T], I, N, Acc, R):- 
    I =:= N, 
    append(Acc, [H], Acc2), 
    I2 is 1, 
    nth_pos(T, I2, N, Acc2, R). 

nth_pos([H|T], I, N, Acc, R):- 
    I < N, 
    I2 is I + 1, 
    nth_pos(T, I2, N, Acc, R). 

試運行:

?- nth_pos([a,b,c,d,e,f,g,h,i,j],3,R). 
R = [c, f, i] . 

?- nth_pos([a,b,c,d,e,f,g,h,i,j],1,R). 
R = [a, b, c, d, e, f, g, h, i|...] 

但我真的不知道該怎麼做。我知道我需要一個計數器, 它代表了我腦袋的當前位置,所以它將成爲一個後面總結爲1/3的謂詞,如 第n個(列表,數字,結果): - 第n個列表,編號,結果,計數器)或 類似。

是的,你是在正確的軌道上,請注意,也使用累加器來建立列表,所以我們得到pred/5。希望能幫助到你。請注意,這不是解決問題的唯一方法。

相關問題