首页 文章

包含相等元素索引的列表

提问于
浏览
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],List)

应该回来

清单= [1,3]

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

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

1 回答

  • 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).
    

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

相关问题