2017-05-10 64 views
0

我知道這裏有一些問題與此類似,但我沒有經驗,我不知道如何使用它們並將解決方案轉換爲我的問題;/序言 - 使用一個列表和一個列表中的元素名單

我有一個名單列表內,像這樣的: [[5],[4,7],[1,2,7],[2,6,7],[2 ,4,6,7],[2,4,7],[9,8],[3],[1]]

我需要知道例如數字3的索引。我需要知道的號碼只會出現在列表的列表中,這是調用該函數的前一個條件。我需要的索引是數字3,索引9(從1開始)。我有這個功能的草案:

given_elem_finds_pos(ListOfLists, Element, Pos):- 
    nth1(Pos, ListOfLists, [Element|_]). 

但它只返回波什如果該元素是一個子表的頭。我需要知道如何獲得例如8.

然後我做了這一個數字:

given_elem_finds_pos([[H|T]| R], Element, Ind):- 
member(Element, [H|T]), 
Ind1 is Ind + 1, 
given_elem_finds_pos(R, Element, Ind1). 

但同樣沒有成功..誰能幫助?非常感謝!

回答

0

你的第二種方法是進入正確的方向。只要想想你想描述什麼:如果Element是你想要停止的[H|T]的元素,因此不需要在這裏遞歸調用。此外,您想要返回當前索引,因此您需要額外的參數(一個用於計數器,另一個用於最終索引)。對於Element不是列表元素的情況,遞歸子句是必需的。下面是它是一個元素的情況下該條款

given_elem_finds_pos([List| R], Element, Solution,Solution):- 
     member(Element, List). 

當你需要添加你需要調用您的擴展謂詞的附加斷言額外的參數:

given_elem_finds_pos(ListOfLists, Element, Ind):- 
     given_elem_finds_pos(ListOfLists, Element,0, Solution). 

現在你只需要爲given_elem_finds_pos/4多寫一個條款,這是一個遞歸的「它不是元素」的情況。問,如果你寫這個條款有困難。

+0

感謝您的快速響應!我正在研究另一個條款,並試圖弄清楚你做了什麼,所以我不能說這一切都完成了,但告訴我一些事情:在最後一次迭代中,或上次調用given_elem_finds_pos/4時,Prolog結束了一個不斷增加的索引,對嗎?或者你不這樣做你的?因爲如果你這樣做,是不是最終值與解決方案一樣? –

+0

是的你是對的,櫃檯正在增加,如果找到搜索到的子列表,計數器等於索引。這就是爲什麼你需要額外的論據。我的代碼中的停止子句,以'given_elem_finds_pos([List | R],Element,Solution,Solution)開始: - ',用當前計數器實例化解決方案索引。 –

+0

我做到了,它的工作原理,謝謝! –

相關問題