2017-04-10 72 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). 
从您的解决方案

不同的是,这一次将任意长度列出工作...

相关问题