我正在尝试定义一个以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中使用算法不正确,但我无法让它工作。任何建议/帮助表示赞赏。
答案 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).
与您的解决方案不同,这个适用于任何长度列表......