Первый трюк с логическим программированием состоит в том, чтобы начать с самых маленьких случаев и продолжить.
Базовые случаи здесь просты, если в списке меньше двух элементов, ничего не пропущено.
findmissing([], []).
findmissing([_], []).
Второй трюк - делить и побеждать. Чтобы найти все, что отсутствует между каждой парой в Списке, нам понадобится предикат (скажем, числа между (X, Y, Список) / 3), который дает все числа между данной парой чисел, а затем запустить его для каждого пара в списке ввода. Используя встроенную функцию append () / 3, и пока не заботясь о том, как реализовать числа между () / 3, мы можем просто написать:
findmissing([X, Y|In], Out) :-
numbersbetween(X, Y, Between),
findmissing([Y|In], After),
append(Between, After, Out).
(Здесь нужно немного позаботиться, чтобы убедиться, что мы рассматриваем каждую пару, в списке [1,2,3] нам нужно проверить [1,2] и [2,3] - поэтому рекурсивный шаг занимает [Y | In], а не только In).
Тогда остается только определить число между () / 3. Если вам случится знать о встроенных предикатах между () / 3 (это верно, если X
numbersbetween(X, Y, List) :- setof(B, between(X, Y, B), List).
Если вам не известно об этих функциях, вы можете создать свои собственные числа между (), используя арифметику Пролога "is".