0

我有以下知识库

team_name(1, conneticut).
team_name(2, duke).
team_name(3, memphis).
team_name(4, villanova).
team_name(5,gonzaga).

win_lose(1,22,2).
win_lose(2,24,1).
win_lose(3,23,2).
win_lose(4,20,2).
win_lose(5,21,3).

zone(west,5).
zone(south,3).
zone(east,1).
zone(east,2).
zone(east,4).

我想写一个查询,让拥有最多侧翼的球队与获胜最少的球队进行比赛,他们都在同一个区域,主队是获胜最多的球队

我有以下

canPlay(X,Y).                 Y can play X
canPlay(X,Y):-zone(zone(X)=:=Y).        Y can play X, if Y zone == X

这没用。

4

2 回答 2

0

我想我明白你想要做什么。您正在尝试将得分最高的球队与得分最差的球队配对,但仅限于同一区域内。这就是我的处理方式:

canPlay(X, Y) :-
  team_name(XId, X), team_name(YId, Y),    % let's get team X and team Y
  X \= Y,                                  % make sure they aren't the same
  zone(Zone, XId), zone(Zone, YId).        % but make sure they are in the same zone

这是一个很好的第一次尝试,但它会产生所有的组合,而不仅仅是两支球队通过胜利适当匹配的组合。

?- setof(X-Y, canPlay(X, Y), Pairings).
Pairings = [conneticut-duke, conneticut-villanova, duke-conneticut, 
            duke-villanova, villanova-conneticut, villanova-duke].

我不完全理解您的其余要求,但希望这足以让您走上正轨。

于 2013-02-28T05:19:40.990 回答
0

我认为这应该符合您的要求

canPlay(Home, Guest) :-
    % get different Zones
    setof(Zone, Team^zone(Zone, Team), Zones),

    % in a Zone
    member(Zone, Zones),

    % get ordered list
    setof(Win-Team, Lost^(zone(Zone, Team), win_lose(Team, Win, Lost)), Standings),

    % take first and last
    append([[_-HomeId],_,[_-GuestId]], Standings),

    team_name(HomeId, Home),
    team_name(GuestId, Guest).
于 2013-02-28T09:00:42.613 回答