Return 序言中的用户列表
Return the list of users in prolog
我的目标是return具有与特定用户相同的 T 标签的 X 用户列表,其中一个是强制性的。
我有这个知识库:
%node(Id, Name, ListOfTags)
node(1,ana,[nature,cat,dog,sw,csharp]).
node(11,antonio,[cat,nature,car,sport,city]).
node(22,isabel,[nature,cat,test,dog,c]).
node(23,john,[nature,dog,sw,csharp,city]).
node(24,maria,[nature,e,b,c,d]).
基于这个谓词:
suggest_group(Name, NumberOfUsers, MandatoryTag, ListOfGroup)
当问题 ?- suggest_group(ana, 3, cat, LGroup)
被问到时,结果必须是 LGroup = []
,因为没有 3 人组的强制标签 cat with ana.
如果我提出问题 suggest_group(ana, 2, cat, LGroup)
,结果必须是 LGroup = [antonio, isabel]
,因为它们具有与 ana 相同的强制性标签 cat。
我有这个:
users_x_common_tags(CurrentUser,NumberOfTags, NumberOfUsers, MandatoryTag, List_Result):-
node(_,CurrentUser,Tags),
findall(User,(node(_,User,_),User \== CurrentUser),Users),
users_x_common_tags2(NumberOfTags, NumberOfUsers, MandatoryTag, Tags,Users,List_Result).
users_x_common_tags2(_,_,_,_,[],[]):-!.
users_x_common_tags2(X,N,M,Tags,[U|Users],Result):-
node(_,U,User_Tags),
intersection(Tags, User_Tags,Commun),
member(M,Commun),
length(Commun, Size),
Size >= X, !,
users_x_common_tags2(X,N,M,Tags,Users,Result1),
append([U], Result1, Result).
users_x_common_tags2(X,N,M,Tags,[_|Users],Result):-
!,
users_x_common_tags2(X,N,M,Tags,Users,Result).
如果长度为 NumberOfUsers,我如何 return 列表,否则 return 一个空列表?
欢迎任何帮助。
这不是我写过的最漂亮的代码,但我认为它有效:
node(1,ana,[nature,cat,dog,sw,csharp]).
node(11,antonio,[cat,nature,car,sport,city]).
node(22,isabel,[nature,test,dog,cat]).
node(23,john,[nature,dog,sw,csharp,city]).
node(24,maria,[nature,e,b,c,d]).
suggest_group(Name, NumberOfUsers, MandatoryTag, ListOfGroup) :-
findall((X,Xs),(node(_,X,Xs),X \== Name,member(MandatoryTag,Xs)),Zs),
(collapse(Zs,(ListOfGroup,_)),length(ListOfGroup,NumberOfUsers);ListOfGroup=[]).
collapse([(U,Ts)],([U],Ts)).
collapse([(U,Ts)|Rs],([U|Us],Xs)) :-
collapse(Rs,(Us,Ws)),
intersection(Ts,Ws,Xs).
?- suggest_group(ana, 3, cat, LGroup).
LGroup = [].
?- suggest_group(ana, 2, cat, LGroup).
LGroup = [antonio, isabel] .
我的目标是return具有与特定用户相同的 T 标签的 X 用户列表,其中一个是强制性的。
我有这个知识库:
%node(Id, Name, ListOfTags)
node(1,ana,[nature,cat,dog,sw,csharp]).
node(11,antonio,[cat,nature,car,sport,city]).
node(22,isabel,[nature,cat,test,dog,c]).
node(23,john,[nature,dog,sw,csharp,city]).
node(24,maria,[nature,e,b,c,d]).
基于这个谓词:
suggest_group(Name, NumberOfUsers, MandatoryTag, ListOfGroup)
当问题 ?- suggest_group(ana, 3, cat, LGroup)
被问到时,结果必须是 LGroup = []
,因为没有 3 人组的强制标签 cat with ana.
如果我提出问题 suggest_group(ana, 2, cat, LGroup)
,结果必须是 LGroup = [antonio, isabel]
,因为它们具有与 ana 相同的强制性标签 cat。
我有这个:
users_x_common_tags(CurrentUser,NumberOfTags, NumberOfUsers, MandatoryTag, List_Result):-
node(_,CurrentUser,Tags),
findall(User,(node(_,User,_),User \== CurrentUser),Users),
users_x_common_tags2(NumberOfTags, NumberOfUsers, MandatoryTag, Tags,Users,List_Result).
users_x_common_tags2(_,_,_,_,[],[]):-!.
users_x_common_tags2(X,N,M,Tags,[U|Users],Result):-
node(_,U,User_Tags),
intersection(Tags, User_Tags,Commun),
member(M,Commun),
length(Commun, Size),
Size >= X, !,
users_x_common_tags2(X,N,M,Tags,Users,Result1),
append([U], Result1, Result).
users_x_common_tags2(X,N,M,Tags,[_|Users],Result):-
!,
users_x_common_tags2(X,N,M,Tags,Users,Result).
如果长度为 NumberOfUsers,我如何 return 列表,否则 return 一个空列表?
欢迎任何帮助。
这不是我写过的最漂亮的代码,但我认为它有效:
node(1,ana,[nature,cat,dog,sw,csharp]).
node(11,antonio,[cat,nature,car,sport,city]).
node(22,isabel,[nature,test,dog,cat]).
node(23,john,[nature,dog,sw,csharp,city]).
node(24,maria,[nature,e,b,c,d]).
suggest_group(Name, NumberOfUsers, MandatoryTag, ListOfGroup) :-
findall((X,Xs),(node(_,X,Xs),X \== Name,member(MandatoryTag,Xs)),Zs),
(collapse(Zs,(ListOfGroup,_)),length(ListOfGroup,NumberOfUsers);ListOfGroup=[]).
collapse([(U,Ts)],([U],Ts)).
collapse([(U,Ts)|Rs],([U|Us],Xs)) :-
collapse(Rs,(Us,Ws)),
intersection(Ts,Ws,Xs).
?- suggest_group(ana, 3, cat, LGroup).
LGroup = [].
?- suggest_group(ana, 2, cat, LGroup).
LGroup = [antonio, isabel] .