найти индекс элемента min в списке и получить элемент в соответствующей позиции индекса в другом списке в Прологе - PullRequest
1 голос
/ 27 июля 2011

Я пытаюсь найти позицию индекса минимального элемента в списке и напечатать элемент на соответствующей позиции индекса в другом списке.

Например:

?- 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 ]

2 голосов
/ 27 июля 2011

Так как вы впервые пишете факт (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).

Не могу попробовать (потому что я в настоящее время на работе).Но я думаю, что это должно быть что-то вроде этого.

0 голосов
/ 29 июля 2011

Чтобы дать вам немного больше, мое определение самых маленьких в противоположном порядке, например 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. Я имею в виду, что вы слишком усложняете вещи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...