取最大值和最小值列表并计算Prolog中的差异

时间:2018-04-27 05:59:06

标签: recursion prolog

无法让代码生效。我觉得问题出在辅助函数dia1中。只是想知道我犯了什么错误?

append([],L,L). 
append([H|T],L2,[H|L3])  :-  append(T,L2,L3).


dia([H|T],N):-
    dia1(H,T,null,N).

dia1(_,_,N,N).

dia1(H,[H1|T1],_,N):-
    H>H1,
    X is H-H1,
    append(T1,[H1],L1),
    dia1(H,L1,X,N).

dia1(H,[H1|T2],_,N):-
    H=<H1,
    X is H-H1,
    append(T2,[H],L2),
    dia1(H1,L2,X,N).


Example test:
dia( [ 1, 5, 3, 1 ], 4 ) 
True
dia( [ 5, 5, 5 ], 0 ) 
True

2 个答案:

答案 0 :(得分:1)

可以很快完成:

dial([H|T], R) :-
    dial(T, H, H, Min, Max),
    R is Max - Min.

dial([], Min, Max, Min, Max).

dial([H | T], Cur_Min, Cur_Max, Min, Max) :-
    H < Cur_Min
    -> dial(T, H, Cur_Max, Min, Max)
    ;  H > Cur_Max
       -> dial(T, Cur_Min, H, Min, Max)
       ;  dial(T, Cur_Min, Cur_Max, Min, Max).

例如:

?- dial( [ 1, 5, 3, 1 ], X ) .
X = 4.

使用库clfpd,我们得到:

:- use_module(library(clpfd)).


dial([H|T], R) :-
    dial(T, H, H, Min, Max),
    R #= Max - Min.

dial([], Min, Max, Min, Max).

dial([H | T], Cur_Min, Cur_Max, Min, Max) :-
    H #< Cur_Min
    -> dial(T, H, Cur_Max, Min, Max)
    ;  H #> Cur_Max
       -> dial(T, Cur_Min, H, Min, Max)
       ;  dial(T, Cur_Min, Cur_Max, Min, Max).

例如:

?- dial( [ 1, 5, 3, 1 ], X ) .
X = 4.

?- dial( [ 1, X, 3, 1 ], 4 ) .
X = -1.

?- dial( [ 1, X, 3, Y ], 4 ) .
X = 0,
Y = -1.

?- dial( [ A, B, C, D ], 4 ) .
4+D#=A,
B#=<A+ -1,
D#=<C+ -1,
C#=<B+ -1.

答案 1 :(得分:0)

你的程序非常混乱,并没有给出正确的结果。例如:

? - dia([1,5,3,1],A).
A = null
A = -4
A = 2
A = 4
A = 4
A = 2
A = 4
and so on...

它只能给A = 4

您可以简化代码创建两个谓词,例如my_maxlist/2my_minlist/2来获取列表的最小值和最大值,然后减去值,如下所示:

solve(L,Diff):-
    my_minlist(L,Min),
    my_maxlist(L,Max),
    Diff is Max-Min.

my_minlist([A],A):- !.
my_minlist([H|T],Min):-
    my_minlist_(T,H,Min).

my_maxlist([A],A):- !.
my_maxlist([H|T],Max):-
    my_maxlist_(T,H,Max).

my_minlist_([],Min,Min).
my_minlist_([H|T],CurrentMin,Min):-
    CurrentMin < H, !,
    my_minlist_(T,CurrentMin,Min).
my_minlist_([H|T],_,Min):-
    my_minlist_(T,H,Min).

my_maxlist_([],Min,Min).
my_maxlist_([H|T],CurrentMax,Min):-
    CurrentMax > H, !,
    my_maxlist_(T,CurrentMax,Min).
my_maxlist_([H|T],_,Min):-
    my_maxlist_(T,H,Min).

请注意,min_list/2max_list/2是SWI序言中library(lists)的一部分,因此已经定义,因此您只需写一下:

solve(L,Diff):-
    min_list(L,Min),
    max_list(L,Max),
    Diff is Max-Min.

查询(在两种情况下):

?- solve([4,3,1,7],D).
D = 6