Найти нижние вершины списка

#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.
  

Было несколько проблем с кодом.

  1. В коде были защитные элементы, например X<Y , для одного предиката, но для соответствующего предиката требовалось либо вырезать (!), Либо, что лучше, не защищать (X<Y) .
  2. Код перешел от начала списка к середине, например lower_peaks , затем к lp2 , но не перешел к концу.
  3. Код нуждался в базовых вариантах для списка из одного элемента или без него.
  4. Коду нужен был способ перехода от начала списка к концу списка, если не было середины.