Нахождение людей с самым большим количеством общих предпочтений - Prolog
Формулировка задачи:
Доброго времени суток, Уважаемые!
Есть вот такая задача: в пролог-программе заданы отношения likes(Person, Thing) (Person — человек которому нравится вещь Thing). Определить предикат mostResembling(Person1, Person2) для нахождения людей с самым большим количеством общих предпочтений.
Использую SWI-Prolog.
Написала вот такой код
Но в данный момент у меня находит список людей просто с самым большим количеством предпочтений. А вот как сравнивать сами преподчтения и выбирать самое большое количество никак не пойму. Помогит пожалуйста! Заранее благодарю!
Листинг программы
- likes(tom,book).
- likes(pam,fish).
- likes(ann, apple).
- likes(ann, cat).
- likes(ann, flower).
- likes(bob, apple).
- likes(bob, cat).
- likes(bob, flower).
- likes(pem, apple).
- likes(pem, cat).
- likes(pem, phone).
- :-dynamic likesInfo/2.
- changeDB(X,Y) :-
- (retract(likesInfo(X, C)); C = 0),
- C1 is C + 1,
- assertz(likesInfo(X, C1)).
- existBetter(X):-
- likesInfo(X,C), likesInfo(X1,C1), C1 > C.
- mostResembling(L):-
- forall(likes(X, Y), changeDB(X,Y)),
- findall(X, (likesInfo(X, _), not(existBetter(X))), L),
- retractall(likesInfo(_,_)).
Решение задачи: «Нахождение людей с самым большим количеством общих предпочтений»
textual
Листинг программы
- likes(tom,book).
- likes(pam,fish).
- likes(ann, apple).
- likes(ann, cat).
- likes(ann, flower).
- likes(bob, apple).
- likes(bob, cat).
- likes(bob, flower).
- likes(pem, apple).
- likes(pem, cat).
- likes(pem, fish).
- :-dynamic likesInfo/3.
- changeDB(X,Z,Y) :-
- (retract(likesInfo(X, Z, C)); C = 0),
- likes(X, Y),
- likes(Z, Y),
- X \= Z,
- P is C + 1 ,
- assertz(likesInfo(X, Z, P)).
- existBetter(X, Z):-
- likesInfo(X,Z,C), likesInfo(X1, Z1, C1), C1 > C.
- mostResembling(L):-
- forall((likes(X,Y), likes(Z,Y), X \= Z), changeDB(X,Z,Y)),
- findall((X,Z), (likesInfo(X,Z,_), not(existBetter(X, Z))), L),
- retractall(likesInfo(_,_,_)).
Объяснение кода листинга программы
- В коде описывается база данных предпочтений людей.
- Утверждается, что переменная likesInfo/3 является динамической.
- Определяется процедура changeDB/3, которая изменяет базу данных, добавляя новые записи о количестве общих предпочтений между людьми.
- Определяется процедура existBetter/2, которая проверяет, есть ли более подходящие общие предпочтения между двумя людьми, чем уже имеющиеся.
- Определяется процедура mostResembling/1, которая находит людей с наибольшим количеством общих предпочтений.
- В процедуре mostResembling/1 используется процедура findall/3 для сбора всех возможных комбинаций людей с наибольшим количеством общих предпочтений.
- В конце кода все записи о количестве общих предпочтений удаляются из базы данных с помощью retractall/1.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д