2017-04-10 71 views
1

我想定義一個謂詞,它以3個列表作爲參數,第三個列表包含其他兩個列表中的元素相同的索引。列表包含相同元素的索引

這是我試圖解決這個問題。

sameIndex(List1, List2, List3) :- findIndex(List1,List2,0, List3). 

% Helper Function 

% Base cases 
findIndex([],_,_,[]). 
findIndex(_,[],_,[]). 

findIndex([Head1|Tail1], [Head2|Tail2], Count, List4):- 
    Head1 == Head2, append([Count], List4, FinalList), NewCount is Count+1, 
    findIndex(Tail1,Tail2,NewCount,FinalList); NewCount is Count+1, 
    findIndex(Tail1,Tail2,NewCount, List4). 

樣品測試用例:

sameIndex([1,2,3,4],[6,2,4,4],列表)

應返回

列表= [1,3]

我的邏輯是:如果列表的頭部相等,則追加Count(跟蹤我們所在的索引)到我們空的List4,遞增Count並遞歸調用謂詞兩個列表的尾巴。否則,遞增計數並遞歸地用尾部調用謂詞。

我假設我的代碼在prolog中有不適當的算術用法,但我無法讓它工作。任何建議/幫助表示讚賞。

+0

你所需要的就是一個累加器模式,使得在每個遞歸步驟你正在構建的列表然後將有效索引傳遞給下一步。一旦你達到基本情況,你的'List4'應該是統一到累積列表的東西。你在這裏做的方式,List4是你最初傳入的東西,然後東西被附加到它,這不是你想要的。更不用說,即使你用變量調用它,你也不會試圖將List4和任何東西統一起來。 –

回答

0

這裏是你的代碼修正 - 並重新格式化,使用「標準」縮進

findIndex([Head1|Tail1], [Head2|Tail2], Count, List4):- 
    (Head1 == Head2, 
     append([Count], FinalList, List4), 
     NewCount is Count+1, 
     findIndex(Tail1,Tail2,NewCount,FinalList) 
    ; NewCount is Count+1, 
     findIndex(Tail1,Tail2,NewCount, List4) 
    ). 

你的錯誤是顛倒的參數追加/ 3。 另一個問題它返回多種解決方案 - 他們中的一些錯誤,所以你應該使用的if/then/else結構,並區分2基例:

findIndex([],_,_,[]) :- !. 
findIndex(_,[],_,[]). 

findIndex([Head1|Tail1], [Head2|Tail2], Count, List4):- 
    (Head1 == Head2 
    ->append([Count], FinalList, List4), 
     NewCount is Count+1, 
     findIndex(Tail1,Tail2,NewCount,FinalList) 
    ; NewCount is Count+1, 
     findIndex(Tail1,Tail2,NewCount, List4) 
    ). 

但代碼可以更簡單,使用一些庫助手:

sameIndex(List1, List2, List3) :- 
    findall(P, (nth0(P,List1,E), nth0(P,List2,E)), List3). 
從您的解決方案

不同的是,這一次將任意長度列出工作...

相關問題