Произведение двух натуральных чисел - Prolog
Формулировка задачи:
Добрый день.
Возникла проблема с решением одной задачи.
Нужно определить предикат умножения через сложение.
Как это сделать через рекурсию (#1) - понятно, а вот с итерационным методом (#2) у меня возникли затруднения.
Постарался сделать по аналогии, но ничего не получилось.
#1.
#2.
Ещё есть вопрос по другой, уже решённой задаче.
Проблема заключается в том, что для каждой строки в базе данных выводится результат. И если даже у меня уже был данный режиссёр, то он опять же будет выведен в ответ, т.е. получается много мусора. Можно ли как-нибудь избежать этого момента?
Листинг программы
- predicates
- multiplication(integer,integer,integer)
- clauses
- multiplication(X,1,X):-!.
- multiplication(X,Y,R):-
- YY=Y-1,multiplication(X,YY,RR),R=RR+X.
- goal
- multiplication(4,5,R).
Листинг программы
- facts
- determ mult(integer,integer,long)
- predicates
- nondeterm multiplication(integer,integer,long)
- nondeterm repeat
- clauses
- repeat.
- repeat:-repeat.
- multiplication(A,B,R):-
- asserta(mult(A,1,A)),repeat,retract(mult(AA,BB,RR)),BBB=BB-1,RRR=RR+AA,
- asserta(mult(AA,BBB,RRR)),AA=A,!,retract(mult(A,B,R)).
- goal
- multiplication(4,5,R),nl.
Листинг программы
- domains
- title,director,name,rank,workplace,hero = string
- date,age,da = integer
- facts
- determ dfilm(da)
- nondeterm film(title,director,date)
- predicates
- nondeterm director_list(director,da)
- nondeterm lists
- clauses
- /*film("The Shawshank Redemption","Frank Darabont",1994).
- film("The Green Mile","Frank Darabont",1999).
- film("Forrest Gump","Robert Zemeckis",1994).
- film("Schindler's List","Steven Spielberg",1993).
- film("The Mist","Frank Darabont",2007).*/
- director_list(D,A):-
- assert(dfilm(0)),
- film(F,D,_),write(F),nl,
- retract(dfilm(N)),
- N1=N+1,
- asserta(dfilm(N1)),fail.
- director_list(D,A):-
- retract(dfilm(A)),nl.
- lists:-
- film(_,D,_),
- write("Director: ",D),nl,
- director_list(D,A),
- write("Amount:",A),nl,nl,
- fail.
- goal
- consult("E:\\base.dba"),artists,lists,save("E:\\base.dba").
Решение задачи: «Произведение двух натуральных чисел»
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. - Если произведение чисел было найдено, происходит переход к следующему числу. Если нет, происходит отказ.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д