Prolog-SWI Не могу понять, как рекурсивно умножать полиномы - PullRequest
0 голосов
/ 02 мая 2020

Вот то, что я пытался сделать

%polynomials
eval_term([C|E], X, N) :- N is (X**E)*C.

eval_poly([],[]) :- !.

eval_poly([[H|T]|[]], X, N) :-
    eval_term([H|T], X, N2),
    N is N+N2,
    !.
eval_poly([[H|T]|Rest], X, N) :-
    eval_term([H|T], X, N2),
    N is N+N2,
    eval_poly(Rest, X, N).

Вот пример того, что будет введено

?-  eval_poly([[1 | 2], [2 | 1], [3 | 0]], 2, N).

, которое выдаст 11

1 Ответ

0 голосов
/ 02 мая 2020

Чистый код лучше, поэтому здесь приведена исправленная и исправленная версия того, что вы предоставили.

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 элемента списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...