Чистый код лучше, поэтому здесь приведена исправленная и исправленная версия того, что вы предоставили.
eval_term([C|E], X, N) :- N is (X**E)*C.
% useless
% eval_poly([],[]) :- !.
eval_poly([Mono], X, N) :-
eval_term(Mono, X, N).
eval_poly([Mono|Rest], X, N) :-
eval_term(Mono, X, MV),
eval_poly(Rest, X, RV),
N is MV+RV.
Ваша основная ошибка была N is N+N2
, что не имеет смысла в Прологе. Переменные (в данном случае N) не назначаются, а объединяются. Действительно, оператор is / 2 вводит подъязык (вычисление арифметических c выражений) в правом операнде, а объединяет результат с левым операндом. Поскольку N
используется в правильном операнде, маловероятно, что объединение может быть успешным (вы должны быть в состоянии узнать, какие значения переменных N
и N2
должны быть ограничены для этого).
Теперь для более идиоматического c решения:
eval_term_(X, [C|E], N) :- N is (X**E)*C.
eval_poly_(Poly, X, N) :-
maplist(eval_term_(X), Poly, Ps),
sumlist(Ps, N).
Обратите внимание, что аргумент X
был перемещен в первую позицию, так как maplist / 3 вызывает цель (первый аргумент) с 2 дополнительными аргументами - обработано 2 элемента списка.