РЕДАКТИРОВАТЬ: Сначала я предположил, что проблема была в реализации, поэтому я предложил один ниже.Оказывается, учитывая, что OP позже сообщил, что это NU-Prolog, что ответ, по-видимому, заключается просто в поведении по умолчанию NU-Prolog , как согласно этому руководству, раздел 3.7 :
"Списки обычно печатаются как строки, если каждый элемент списка представляет собой целое число, для которого isPrint/1
имеет значение true."
Как isPrint/1
обозначается как встроенный для NU-Prolog, возможно, он не может быть переопределен для обеспечения другого поведения - возможно, NU-Prolog можно настроить для изменения поведения по умолчанию в этом случае, но я не уверен.
Ниже приведена реализация mod5/2
, которая теперь не имеет отношения к решению:
Если предикат mod5/2
предназначен для получения (в качестве второго аргумента) спискатерминов и вернуть (в первой позиции аргумента) список терминов в том же порядке, но где каждое число N заменяется значением N mod 5, тогда я предлагаю вам попробовать:
mod5([], []).
mod5([X|Xs], [Y|Ys]) :-
isInt(Y), !,
X is Y mod 5,
mod5(Xs, Ys).
mod5([X|Xs], [X|Ys]) :-
mod5(Xs, Ys).
Обратите внимание на защитные подцели isInt(Y), !,
(NU-PROLOG) во втором пункте mod5/2
;числовой расчет mod
через is
для замены Y
произойдет только тогда, когда Y
является числовым;в противном случае он пропускается через нетронутый последним предложением mod5
(как X
).
Выполнение этого в вашем примере с использованием SWI-PROLOG дает:
?- mod5(X,[a,16,b,c(5),[[12]],8]).
X = [a, 1, b, c(5), [[12]], 3] ;
false.