Используйте between/3
для генерации всех чисел от мин до макс. Используйте memberchk/2
(или member/2
), чтобы найти недостающие.
L = [1,2,4,5],
L = [M|_],
last(L, N),
between(M, N, I),
\+ memberchk(I, L).
Упражнение для читателя: заверните это в предикат.
РЕДАКТИРОВАТЬ Эффективное решение по популярному запросу:
missing([I,K|_], M) :-
I1 is I+1,
K1 is K-1,
between(I1, K1, M).
missing([_|Ns], M) :-
missing(Ns, M).
РЕДАКТИРОВАТЬ 2 : более элегантная версия вышеупомянутого, вдохновленная @chac, не обязательно очень эффективная:
missing(L,M) :- append(_, [I,J|_], L), I1 is I+1, J1 is J-1, between(I1,J1,M).