查找列表的较低峰

时间:2019-04-10 14:38:48

标签: 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 个答案:

答案 0 :(得分: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. 如果没有中间位置,代码需要一种从列表开头到列表结尾的过渡方式。