在列表中找到min元素的索引&将元素放在Prolog中另一个列表中的相应索引位置

时间:2011-07-27 00:28:44

标签: list prolog

我试图找到列表中最小元素的索引位置,并在另一个列表中的相应索引位置打印该元素。

例如:

?- min2(X,Y,[a,b,c],[5,3,7]).
X= b
y= 3

代码:

min2(A,B,[A|_],[B|_]).
min2(A,B,[X|T1],[Y|T2]) :- smallest(W,[Y|T2]),  % using a predicate to find the min element in the list
                           B is W,              % setting B to the result of above(i.e the min element)
                           min2(A,B,T1,T2).     % looking up position corresponding to min element in list1

在列表中查找min元素的谓词是:

smallest(Head, [Head]).
smallest(Element, [Head|Tail]) :- smallest(E, Tail), Head =< E, Element is Head.
smallest(Element, [Head|Tail]) :- smallest(E, Tail), E < Head , Element is E.

我得到的结果是:

X = a,
Y = 5 ;
X = b,
Y = 3 ;
false.

它还以某种方式挑选了第一个元素。我的基础案例可能是错的?我尝试将基本案例更改为min2(A,B,[A|_],[B|_]).,然后它就会中断。

请告诉我我哪里出错了。

2 个答案:

答案 0 :(得分:2)

由于您首先编写事实(A,B,[A|_],[B|_]).,因此它首先返回2列表的头元素。 你需要修剪列表的头部,直到第二个列表的头部等于B.一旦你发现list2的头部等于B,你就需要返回list1的头部。

也许你想试试这个:

min2(A,B,[A],[B]).  %base case
min2(A,B,[X|T1],[Y|T2]) :- smallest(W,[Y|T2]), B is W, min2(A,B,T1,T2), !. 
min2(A,B,[H1|T1],[H2|T2]):- B=:=H2 -> A = H1 ; min2(A,B,T1,T2).

无法尝试(因为我目前在工作)。但我认为它应该是这样的。

答案 1 :(得分:0)

为了给你更多的东西,我对相反顺序的最小值的定义,比如min_list:

smallest([A], A).
smallest([A, B|C], D) :- A > B, smallest([B|C], D), !.
smallest([A, _|B], C) :- smallest([A|B], C).

我认为更简单(你的也是副本,而不是你自己的代码)。相应的谓词就像我在DaniWeb中发布的一样:

corresponding(A, B, [A|_], [B|_]).
corresponding(A, B, [_|C], [_|D]) :-
    corresponding(A, B, C, D).

通过在自我明显的最小规则中组合这些,你得到你的min2谓词。我的意思是你过度复杂的事情