Произведение двух натуральных чисел - Prolog

Узнай цену своей работы

Формулировка задачи:

Добрый день. Возникла проблема с решением одной задачи. Нужно определить предикат умножения через сложение. Как это сделать через рекурсию (#1) - понятно, а вот с итерационным методом (#2) у меня возникли затруднения. Постарался сделать по аналогии, но ничего не получилось. #1.
Листинг программы
  1. predicates
  2. multiplication(integer,integer,integer)
  3. clauses
  4. multiplication(X,1,X):-!.
  5. multiplication(X,Y,R):-
  6. YY=Y-1,multiplication(X,YY,RR),R=RR+X.
  7. goal
  8. multiplication(4,5,R).
#2.
Листинг программы
  1. facts
  2. determ mult(integer,integer,long)
  3. predicates
  4. nondeterm multiplication(integer,integer,long)
  5. nondeterm repeat
  6. clauses
  7. repeat.
  8. repeat:-repeat.
  9. multiplication(A,B,R):-
  10. asserta(mult(A,1,A)),repeat,retract(mult(AA,BB,RR)),BBB=BB-1,RRR=RR+AA,
  11. asserta(mult(AA,BBB,RRR)),AA=A,!,retract(mult(A,B,R)).
  12. goal
  13. multiplication(4,5,R),nl.
Ещё есть вопрос по другой, уже решённой задаче.
Листинг программы
  1. domains
  2. title,director,name,rank,workplace,hero = string
  3. date,age,da = integer
  4. facts
  5. determ dfilm(da)
  6. nondeterm film(title,director,date)
  7. predicates
  8. nondeterm director_list(director,da)
  9. nondeterm lists
  10. clauses
  11. /*film("The Shawshank Redemption","Frank Darabont",1994).
  12. film("The Green Mile","Frank Darabont",1999).
  13. film("Forrest Gump","Robert Zemeckis",1994).
  14. film("Schindler's List","Steven Spielberg",1993).
  15. film("The Mist","Frank Darabont",2007).*/
  16. director_list(D,A):-
  17. assert(dfilm(0)),
  18. film(F,D,_),write(F),nl,
  19. retract(dfilm(N)),
  20. N1=N+1,
  21. asserta(dfilm(N1)),fail.
  22. director_list(D,A):-
  23. retract(dfilm(A)),nl.
  24. lists:-
  25. film(_,D,_),
  26. write("Director: ",D),nl,
  27. director_list(D,A),
  28. write("Amount:",A),nl,nl,
  29. fail.
  30. goal
  31. consult("E:\\base.dba"),artists,lists,save("E:\\base.dba").
Проблема заключается в том, что для каждой строки в базе данных выводится результат. И если даже у меня уже был данный режиссёр, то он опять же будет выведен в ответ, т.е. получается много мусора. Можно ли как-нибудь избежать этого момента?

Решение задачи: «Произведение двух натуральных чисел»

textual
Листинг программы
  1. multiplication(_, 0, 0).
  2. multiplication(X, Y, R) :-
  3.     Y >= 1,
  4.     assert( mult(X, Y, X) ),
  5.     repeat,
  6.     multiplication(R),
  7.     !.
  8. multiplication(X, Y, R) :-
  9.     Y =< -1,
  10.     Y1 is -Y,
  11.     X1 is -X,
  12.     multiplication(X1, Y1, R).
  13.  
  14. multiplication(R) :-
  15.     retract( mult(_, 1, R) ).
  16. multiplication(_) :-
  17.     retract( mult(X, Y1, R0) ),
  18.     YY is Y1 - 1,
  19.     R1 is R0 + X,
  20.     assert( mult(X, YY, R1) ),
  21.     fail.

Объяснение кода листинга программы

Код решает задачу поиска произведения двух натуральных чисел.

  1. Условие Y >= 1 проверяет, что второе число больше или равно 1.
  2. Ассерция assert( mult(X, Y, X) ) добавляет факт, что произведение чисел X и Y равно X.
  3. Рекурсивный вызов multiplication(R) происходит, пока произведение не будет равно R.
  4. Если второе число меньше или равно -1, то оно заменяется на -Y, а первое число заменяется на -X, и рекурсивный вызов multiplication(X1, Y1, R) происходит снова.
  5. Если произведение чисел еще не было найдено, факт retract( mult(_, 1, R) ) отменяется, и второе число уменьшается на 1, а результат произведения заменяется на X.
  6. Если произведение чисел было найдено, факт retract( mult(X, Y1, R0) ) отменяется, и второе число уменьшается на 1, а результат произведения заменяется на X + Y.
  7. Ассерция assert( mult(X, YY, R1) ) добавляет факт, что произведение чисел X и Y равно R1.
  8. Если произведение чисел было найдено, происходит переход к следующему числу. Если нет, происходит отказ.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы