#prolog
#пролог
Вопрос:
Помогите, пожалуйста, найти нижние вершины списка. Например, учитывая массив [1,5,4,6,3]
, ответ будет [1,4,3]
lower_peaks([X,Y|T],[X|L]):-X<Y,lp2([Y|T],L).
lower_peaks([X,Y|T],L):-lp2([X,Y|T],L).
lp2([X,Y],[Y]):-Y<X.
lp2([_,_],[]).
lp2([X,Y,Z|T],[Y|L]):-Y<X,Y<Z,lp2([Y,Z|T],L).
lp2([X,Y,Z|T],L):-lp2([Y,Z|T],L).
Проблема в нескольких ответах:
?- lower_peaks([1,5,4,6,3],V).
V = [1, 4, 3] ;
V = [1, 4] ;
V = [1, 3] ;
V = [1] ;
V = [4, 3] ;
V = [4] ;
V = [3] ;
V = [] ;
false.
Ответ №1:
Полный код:
lower_peaks(L,R) :-
lower_peaks_start(L,R).
lower_peaks([_],[]).
lower_peaks([],[]).
lower_peaks_start([X,Y|T],[X|L]) :-
X<Y,
lower_peaks_middle([Y|T],L).
lower_peaks_start([X,Y|T],L) :-
(X<Y),
lower_peaks_middle([Y|T],L).
lower_peaks_middle([X,Y,Z|T],[Y|L]) :-
Y<X, Y<Z,
lower_peaks_middle([Y,Z|T],L).
lower_peaks_middle([X,Y,Z|T],L) :-
(Y<X, Y<Z),
lower_peaks_middle([Y,Z|T],L).
lower_peaks_middle([X,Y],L) :-
lower_peaks_end([X,Y],L).
lower_peaks_end([X,Y],[Y]) :-
Y<X.
lower_peaks_end([X,Y],[]) :-
(Y<X).
Пример выполнения:
?- lower_peaks([1,5,4,6,3],V).
V = [1, 4, 3] ;
false.
Было несколько проблем с кодом.
- В коде были защитные элементы, например
X<Y
, для одного предиката, но для соответствующего предиката требовалось либо вырезать (!), Либо, что лучше, не защищать(X<Y)
. - Код перешел от начала списка к середине, например
lower_peaks
, затем кlp2
, но не перешел к концу. - Код нуждался в базовых вариантах для списка из одного элемента или без него.
- Коду нужен был способ перехода от начала списка к концу списка, если не было середины.