我正在尝试定义一个以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 回答
这是您的代码更正 - 并使用'标准'缩进重新格式化
您的错误是将参数反转为追加/ 3 . 它返回多个解决方案的另一个问题 - 其中一些是错误的,所以你应该使用if / then / else结构,并区分2个基本情况:
但是使用一些库助手可以简化代码:
与您的解决方案不同,这个适用于任何长度列表......