Мы можем точно узнать разницу между двумя отдельными числами:
diff_between( A, B, C):-
C is A - B.
Что касается списков, нам нужно объединить в последовательные элементы
pairs( G3, [A | B], C):- % G3 is a goal expecting of 3 arguments
append( D, [_], [A | B]),
maplist( call(G3), B, D, C).
Теперь мы можемполучите список различий между последовательными элементами:
consec_diffs( L, Diffs):-
pairs( diff_between, L, Diffs).
% pairs( G3, [A | B], C)
% maplist( call(diff_between), B, D, Diffs )
% consec_diffs( [a,b,c, ..., n,m], Diffs)
% =
% [ b,c, ..., n,m ]
% [ a,b, ....., n ]
% ------------------- pairwise diff_between
% Diffs = [ ............. ]
И тогда нам просто нужно выяснить, все ли они одинаковы:
is_arith_prog( A ):-
consec_diffs( A, [B | C]),
maplist( =:=(B), C).
Этот ответ в основном просто имеетценность любопытства.Это делает слишком много работы потенциально.Правильный способ что-то кодировать - это выполнять как можно меньше работы и как можно быстрее прийти к выводу.В этом случае это делается простым рекурсивным определением, обрабатывающим список сверху вниз.