Это можно сделать в ближайшее время:
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.