Пролог списков возвращает ложь - PullRequest
0 голосов
/ 15 ноября 2018

Я относительно новичок в Прологе. Я пытаюсь умножить и добавить все элементы списка, но это работает только для одного элемента. Что не так?

 %Basic
mult([],A,0).

mult([X|Xs],A,S) :-
   mult(Xs,A,R),
   S is (X * A),
   S is S + R.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 15 ноября 2018

Проблема со строкой S is S + R..В прологе одна переменная не может принимать разные значения в теле предложения.Здесь вы ожидаете, что значение S изменится, но это не может работать (за исключением случаев, когда R равно 0, и в этом случае S остается тем же самым; следовательно, почему оно уже работает для списков с одним элементом).

Вам нужно использовать другую переменную для хранения промежуточного результата и использовать только выходную переменную для конечного результата.Например:

mult([], _, 0).

mult([X|Xs], A, S):-
    mult(Xs, A, R),
    Tmp is (X * A),
    S is Tmp + R.

Я также позволил себе исправить предупреждение об одноэлементной переменной, которое вы получили.Хотя в этом случае это было безвредно, вы никогда не должны игнорировать их, поскольку они часто указывают на некорректную логику.

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