无法让代码生效。我觉得问题出在辅助函数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
答案 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/2
和my_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/2
和max_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