Prolog 找到列表中较低的峰值

Prolog 找到列表中较低的峰值,prolog,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(

请帮助查找列表中较低的峰值。例如,给定一个数组
[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(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).
代码有几个问题

  • 代码有防护装置,例如
    X
    
    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.