Prolog 谓词不工作

Prolog 谓词不工作,prolog,predicate,Prolog,Predicate,我不熟悉prolog,我真的不明白事情到底是如何运作的 从简化的社交网络中提供以下知识库: % user(nickname,email,city,friends_list) user(nick0,mail0,lisbon,[nick1,nick8]). user(nick1,mail1,lisbon,[nick0,nick3, nick5, nick9]). user(nick2,mail2,london,[nick5,nick7,nick8]). user(nick3,mail3,madrid

我不熟悉prolog,我真的不明白事情到底是如何运作的

从简化的社交网络中提供以下知识库:

% user(nickname,email,city,friends_list)
user(nick0,mail0,lisbon,[nick1,nick8]).
user(nick1,mail1,lisbon,[nick0,nick3, nick5, nick9]).
user(nick2,mail2,london,[nick5,nick7,nick8]).
user(nick3,mail3,madrid,[nick1,nick4]).
user(nick4,mail4,paris,[nick1, nick3, nick2, nick5, nick6]).
user(nick5,mail5,madrid,[nick1, nick4, nick2]).
user(nick6,mail6,lisbon,[nick3,nick2]).
user(nick7,mail7,berlin,[nick3, nick5]).
user(nick8,mail8,berlin,[nick3, nick5, nick7]).
user(nick9,mail9,london,[nick1, nick4]).
我需要一个谓词
places(NU,LC)
,它生成一个城市列表(LC),其中用户数大于或等于(NU)的城市

例如:

排名(0,LC)

LC=[(里斯本,3)、(伦敦,2)、(马德里,2)、(巴黎,1)、(柏林,2)]

我有以下代码,但它不起作用,如果你们能帮助我,我将不胜感激:

places(NU,LC):-
findall(X,user(_,_,X,_),List),
findall(Z,(user(_,_,Z,_),member(Z,List), Z>=NU),LC).

这可能是一个简单的问题,但我仍在学习prolog

当然,答案将取决于您使用的Prolog系统,因为库可以在一次调用中解决查询。要坚持使用ISO谓词(好吧,分离成员/2):


当然,答案将取决于您使用的Prolog系统,因为库可以在一次调用中解决查询。要坚持使用ISO谓词(好吧,分离成员/2):


有没有一种方法可以显示一个没有重复城市的列表?就像我上面例子中的那个?我知道替换findall的setof会给我一个列表作为唯一的解决方案,但是城市的重复本身有没有一种方法来呈现一个没有重复城市的列表?就像我上面例子中的那个?我知道替换findall的setof会给我一个列表作为唯一的解决方案,但城市会重复它们自己
places(NU, LC) :-
    setof(City, User^Mail^Friends^user(User,Mail,City,Friends), Cities),
    findall((City, Count),
        (member(City, Cities),
         findall(_, user(_,_,City,_), L),
         length(L, Count),
         Count >= NU), LC).