2017-03-14 109 views
0

嗨我是相當新的序言,並有問題搞清楚我在做什麼。 我的任務看起來相當簡單。我想從列表中檢索一個列表。從列表中獲取列表

我還想檢索列表中每個列表的Nieme(Nth)元素來構建一個列表。

第一任務例如:

ListList([[1,2],[3,4],[5,6]]) 

返回只[1,2]

第二任務例如:

ListList([[1,2],[3,4],[5,6]], N) %Where N is the index i want ex:2 

返回只[2,4,6]

謝謝

編輯:我到目前爲止:

仍在瀏覽網頁。我發現第nth1適用於我的第一項任務。還有類似的:

match([Elem|_],Num,Num,Elem) :- 
    !. 
match([_|Tail],Num,Count,MatchedNumber) :- 
    Count < Num, 
    Count1 is Count+1, 
    match(Tail,Num,Count1,MatchedNumber). 

到目前爲止還沒有任何第二項任務。我需要使用雙類遞歸

+2

謂詞不*返回任何東西。它*統一*變量... –

+0

對不起。我的意思是把它存儲在另一個我將通過該函數的參數中。類似ListList([[1,2],[3,4],[5,6]],List) – Fred

+4

(a)謂詞必須以小寫開頭;和(b)你有什麼嘗試? –

回答

0

讓我們解決第一個問題。你只需要給定列表的頭部。就這樣。列表可以寫爲[H|T],其中H是頭部(或第一個元素),而T是尾部(列表的結果,它本身就是一個列表)。

如果你有一個名單,[a,b,c]並與[H|T]統一它,Prolog會做一些有趣的事情。在Prolog提示符下試試這個:

?- [a,b,c] = [H|T]. 

觀察你得到的結果。還要注意,你可以在謂詞的頭部進行統一。

這是另一個嘗試。進入序言和輸入:

?- [user]. 
head_tail(L, Head, Tail) :- 
    L = [Head | Tail]. 

foo([H|T], H, T). 

Ctrl^D 
true. 

然後嘗試:

?- head_tail([a,b,c], H, T). 

而且還嘗試:

?- foo([a,b,c], H, T). 

,看看你會得到什麼。你可以用它來了解如何解決你的第一個問題。

在你的第二個問題中,你也可以使用統一。但是,在這種情況下,您現在正在您的列表中遞歸地走路。

match([], ...).   % Handle the empty list 
match([H|T], ...) :- % Handle the general case with recursion 
    % do something here with H and/or T 
    ... 
    match(T, ...). 

你只需要弄清楚...看起來像在每種情況下。