【问题标题】:Predicate not working谓词不起作用
【发布时间】:2013-09-03 12:30:39
【问题描述】:

我是 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 predicate


    【解决方案1】:

    当然,答案取决于您使用的 Prolog 系统,因为库可以在单个调用中解决查询。坚持使用 ISO 谓词(好吧,除了 member/2):

    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).
    

    【讨论】:

    • 有没有办法呈现一个没有重复城市的列表?像我上面的例子一样吗?我知道替换 findall 的 setof 会给我一个列表作为唯一的解决方案,但城市会重复自己
    猜你喜欢
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2011-01-29
    • 2013-10-12
    • 2022-01-06
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多