Ответ в теме: База даныых: социальные сети

      Комментарии к записи Ответ в теме: База даныых: социальные сети отключены
#3338

Oleg1
Участник

domains
	socialn = string
	name = string
	sex = string
	age = integer
	height = real
	time = real
	who = string
	where = string																																	
predicates
	user(integer,socialn, name)
	profile(socialn,name,sex,age,height)
	post(integer,socialn,who,time,where)
	privatesms(integer,socialn,who,time,where)
	fc(integer, integer,string)
	lfc(integer,integer)
	fcl(integer,integer,string,integer)
	pc(integer, integer,string)
	psc(integer, integer,string)
	uc(integer,integer,string)
	zapt1(string)
	zapt2
	friend(integer,socialn,who,where)
clauses
	user(1,vkontakte, oleg).
	user(2,facebook, kolya).
	user(3,facebook, sasha).
	user(4,vkontakte, dima).
	user(5,odnoklasniki, vika).
	user(6,vkontakte, masha).
	user(7,odnoklasniki, katya).
	user(8,vkontakte, igor).
	user(9,vkontakte, nikita).
	user(10, facebook,oleg).
	
	profile(vkontakte, oleg, male, 20, 1.85).
	profile(facebook, oleg, male, 20, 1.85).
	profile(vkontakte, igor, male, 22, 1.79).
	profile(vkontakte, nikita, male, 44, 1.81).
	profile(facebook, kolya, male, 20, 1.80).
	profile(facebook, sasha, male, 22, 1.77).
	profile(vkontakte, dima, male, 21, 1.79).
	profile(odnoklasniki, vika, female, 19, 1.68).
	profile(vkontakte, masha, female, 20, 1.81).
	profile(odnoklasniki, katya, female, 24, 1.72).
	
	post(1,vkontakte, oleg, 17.32, dima).
	post(2,vkontakte, dima, 18.21, oleg).
	post(3,facebook, kolya, 00.40, sasha).
	post(4,facebook, sasha, 01.13, kolya).
	post(5,vkontakte, masha, 07.08, oleg).
	post(6,odnoklasniki, vika, 13.22, katya).
	post(7,odnoklasniki, katya, 17.44, vika).
	
	privatesms(1,vkontakte, oleg, 14.55, dima).
	privatesms(2,odnoklasniki, vika, 09.22, katya).
	
	friend(1,odnoklasniki, vika, katya).
	friend(2,vkontakte, oleg, dima).
	friend(3,vkontakte, oleg, igor).
	friend(4,vkontakte, oleg, nikita).

uc(0,S,_) :- write("Social count = ", S),nl.
uc(N,S,Name) :- user(N,C,Name),S1=S+1,N1=N-1,write("Social network = ", C),nl, uc(N1,S1,Name); N1=N-1,uc(N1,S,Name).		
fc(0,S,_) :- write("Friend count = ", S),nl.
fc(N,S,Name) :- friend(N,_,Name,_),S1=S+1,N1=N-1,fc(N1,S1,Name); N1=N-1,fc(N1,S,Name).	
pc(0,S,_) :- write("Post count = ", S),nl.
pc(N,S,Name) :- post(N,_,Name,_,_), S1=S+1, N1=N-1,pc(N1,S1,Name); N1=N-1,pc(N1,S,Name).
psc(0,S,_) :- write("Privatesms count = ", S),nl.
psc(N,S,Name) :- privatesms(N,_,Name,_,_), S1=S+1, N1=N-1,psc(N1,S1,Name); N1=N-1,psc(N1,S,Name).

lfc(0,S) :- write(S),nl.
lfc(N,S) :- user(N,_,X), fcl(4,0,X,N); lfc(N,S).

fcl(0,S,_,C) :- C1=C-1,lfc(C1,S).
fcl(N,S,X,C) :- friend(N,_,X,_), S1=S+1, N1=N-1, fcl(N1,S1,X,C); N1=N-1, fcl(N1,S,X,C).

zapt1(Name) :- uc(10,0,Name), fc(4,0,Name), pc(7,0,Name), psc(2,0,Name).
zapt2 :- 	lfc(10,0).

Немного переписал код, смог реализовать первый запрос — «Вывести статистику для указанного пользователя (ввести имя с клавиатуры): в каких соц.сетях зарегистрирован, сколько друзей, постов, личных сообщений имеет.» Во втором не могу найти у кого меньше друзей.

В этих правилах я перебираю всех пользователей и нахожу количество друзей у каждого пользователя.

lfc(0,S) :- write(S),nl.
lfc(N,S) :- user(N,_,X), fcl(4,0,X,N); lfc(N,S).

fcl(0,S,_,C) :- C1=C-1,lfc(C1,S).
fcl(N,S,X,C) :- friend(N,_,X,_), S1=S+1, N1=N-1, fcl(N1,S1,X,C); N1=N-1, fcl(N1,S,X,C).

Подскажите пожалуйста, как сравнить количество друзей каждого пользователя и найти минимальное?