包含相等元素索引的列表

时间:2017-04-10 22:58:49

标签: list indexing prolog

我正在尝试定义一个以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],List)

应该返回

列表= [1,3]

我的逻辑是:如果列表的头部相等,则将Count(跟踪我们所处的索引)追加到我们的空List4,递增Count,并用两个列表的尾部递归调用谓词。否则,递增Count并使用tails递归调用谓词。

我假设我的代码在prolog中使用算法不正确,但我无法让它工作。任何建议/帮助表示赞赏。

1 个答案:

答案 0 :(得分: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).

与您的解决方案不同,这个适用于任何长度列表......