Произведение двух натуральных чисел - Prolog
Формулировка задачи:
Добрый день.
Возникла проблема с решением одной задачи.
Нужно определить предикат умножения через сложение.
Как это сделать через рекурсию (#1) - понятно, а вот с итерационным методом (#2) у меня возникли затруднения.
Постарался сделать по аналогии, но ничего не получилось.
#1.
#2.
Ещё есть вопрос по другой, уже решённой задаче.
Проблема заключается в том, что для каждой строки в базе данных выводится результат. И если даже у меня уже был данный режиссёр, то он опять же будет выведен в ответ, т.е. получается много мусора. Можно ли как-нибудь избежать этого момента?
Решение задачи: «Произведение двух натуральных чисел»
textual
Листинг программы
multiplication(_, 0, 0). multiplication(X, Y, R) :- Y >= 1, assert( mult(X, Y, X) ), repeat, multiplication(R), !. multiplication(X, Y, R) :- Y =< -1, Y1 is -Y, X1 is -X, multiplication(X1, Y1, R). multiplication(R) :- retract( mult(_, 1, R) ). multiplication(_) :- retract( mult(X, Y1, R0) ), YY is Y1 - 1, R1 is R0 + X, assert( mult(X, YY, R1) ), fail.
Объяснение кода листинга программы
Код решает задачу поиска произведения двух натуральных чисел.
- Условие
Y >= 1
проверяет, что второе число больше или равно 1. - Ассерция
assert( mult(X, Y, X) )
добавляет факт, что произведение чисел X и Y равно X. - Рекурсивный вызов
multiplication(R)
происходит, пока произведение не будет равно R. - Если второе число меньше или равно -1, то оно заменяется на -Y, а первое число заменяется на -X, и рекурсивный вызов
multiplication(X1, Y1, R)
происходит снова. - Если произведение чисел еще не было найдено, факт
retract( mult(_, 1, R) )
отменяется, и второе число уменьшается на 1, а результат произведения заменяется на X. - Если произведение чисел было найдено, факт
retract( mult(X, Y1, R0) )
отменяется, и второе число уменьшается на 1, а результат произведения заменяется на X + Y. - Ассерция
assert( mult(X, YY, R1) )
добавляет факт, что произведение чисел X и Y равно R1. - Если произведение чисел было найдено, происходит переход к следующему числу. Если нет, происходит отказ.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д