我试图找到列表中最小元素的索引位置,并在另一个列表中的相应索引位置打印该元素。
例如:
?- 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|_]).
,然后它就会中断。
请告诉我我哪里出错了。
答案 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谓词。我的意思是你过度复杂的事情