Нахождение людей с самым большим количеством общих предпочтений - Prolog

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

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

Доброго времени суток, Уважаемые! Есть вот такая задача: в пролог-программе заданы отношения likes(Person, Thing) (Person — человек которому нравится вещь Thing). Определить предикат mostResembling(Person1, Person2) для нахождения людей с самым большим количеством общих предпочтений. Использую SWI-Prolog. Написала вот такой код
Листинг программы
  1. likes(tom,book).
  2. likes(pam,fish).
  3. likes(ann, apple).
  4. likes(ann, cat).
  5. likes(ann, flower).
  6. likes(bob, apple).
  7. likes(bob, cat).
  8. likes(bob, flower).
  9. likes(pem, apple).
  10. likes(pem, cat).
  11. likes(pem, phone).
  12. :-dynamic likesInfo/2.
  13. changeDB(X,Y) :-
  14. (retract(likesInfo(X, C)); C = 0),
  15. C1 is C + 1,
  16. assertz(likesInfo(X, C1)).
  17. existBetter(X):-
  18. likesInfo(X,C), likesInfo(X1,C1), C1 > C.
  19. mostResembling(L):-
  20. forall(likes(X, Y), changeDB(X,Y)),
  21. findall(X, (likesInfo(X, _), not(existBetter(X))), L),
  22. retractall(likesInfo(_,_)).
Но в данный момент у меня находит список людей просто с самым большим количеством предпочтений. А вот как сравнивать сами преподчтения и выбирать самое большое количество никак не пойму. Помогит пожалуйста! Заранее благодарю!

Решение задачи: «Нахождение людей с самым большим количеством общих предпочтений»

textual
Листинг программы
  1. likes(tom,book).
  2. likes(pam,fish).
  3. likes(ann, apple).
  4. likes(ann, cat).
  5. likes(ann, flower).
  6. likes(bob, apple).
  7. likes(bob, cat).
  8. likes(bob, flower).
  9. likes(pem, apple).
  10. likes(pem, cat).
  11. likes(pem, fish).
  12. :-dynamic likesInfo/3.
  13. changeDB(X,Z,Y) :-
  14.         (retract(likesInfo(X, Z, C));  C = 0),
  15.         likes(X, Y),
  16.         likes(Z, Y),
  17.         X \= Z,
  18.         P is C + 1 ,
  19.         assertz(likesInfo(X, Z, P)).
  20. existBetter(X, Z):-
  21.         likesInfo(X,Z,C), likesInfo(X1, Z1, C1), C1 > C.
  22. mostResembling(L):-
  23.         forall((likes(X,Y), likes(Z,Y), X \= Z),  changeDB(X,Z,Y)),
  24.       findall((X,Z), (likesInfo(X,Z,_), not(existBetter(X, Z))), L),
  25.               retractall(likesInfo(_,_,_)).

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

  1. В коде описывается база данных предпочтений людей.
  2. Утверждается, что переменная likesInfo/3 является динамической.
  3. Определяется процедура changeDB/3, которая изменяет базу данных, добавляя новые записи о количестве общих предпочтений между людьми.
  4. Определяется процедура existBetter/2, которая проверяет, есть ли более подходящие общие предпочтения между двумя людьми, чем уже имеющиеся.
  5. Определяется процедура mostResembling/1, которая находит людей с наибольшим количеством общих предпочтений.
  6. В процедуре mostResembling/1 используется процедура findall/3 для сбора всех возможных комбинаций людей с наибольшим количеством общих предпочтений.
  7. В конце кода все записи о количестве общих предпочтений удаляются из базы данных с помощью retractall/1.

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


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

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

6   голосов , оценка 3.5 из 5

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

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

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