Prolog在最小元素列表中找到所有位置

时间:2015-11-10 16:44:21

标签: list prolog

大家好! 我在查找列表中最小元素的所有出现位置时遇到了一些问题。

我的源代码是这样的:

**

findPos([], _, []).
findPos([_],_,[1]).
findPos([H1|Tail], Pos, [Pos|Ta]):-
% "Pos" is the current position in the list 
       findMin([H1|Tail], V),
       V=[H1],
       Pos2 is Pos+1,
       findPos([Tail], Pos2, [Ta]).

findPos([H1|Tail], Pos, [Ta]):-
       findMin([H1|Tail], V),
       not(V=[H1]),
       Pos2 is Pos+1,
       findPos([Tail], Pos2, [Ta]).**

其中, findMin 作为第一个参数接收列表,并使用第二个参数(该列表的最小元素)返回。 问题在于,我会给出的每个输入列表(除了答案为[]的空格列表),答案总是1 ......我无法看到我所遗漏的内容..任何答案都会不胜感激:D谢谢!

1 个答案:

答案 0 :(得分:0)

请注意,每次重新计算剩余列表的最小值时,您的程序因此[1,7,1,2,3]列表会将[1,1,2,3]列为列表" minima"。此外,这个过程相当昂贵。

另一个方面是你在列表的语法糖方面犯了一些语法错误,这会导致错误。

解决方案是 - 在计算机科学中很常见 - 来区分问题。我建议findPos只会找到给定项目的索引。这样的findPos/3谓词可能如下所示:

findPos(X,L,Is) :-
    findPos(0,X,L,Is).

findPos(_,_,[],[]).
findPos(I,X,[Y|T],MIT) :-
    (X == Y -> MIT = [I|IT];MIT=IT),
    I1 is I+1,
    findPos(I1,X,T,IT).

谓词使用累加器I来跟踪索引,每次都递增索引。

现在你需要创建一个查找最小元素索引的谓词:

findMinPos(L,Is) :-
    findMin(L,M),
    findPos(M,L,Is).