prolog中的比较

prolog中的比较,prolog,Prolog,我有以下知识库 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(

我有以下知识库

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

它不起作用。

我想我明白你想做什么。你试图将得分最好的球队与得分最差的球队配对,但只能在同一区域内。我会这样做:

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

我不完全理解您的其他要求,但希望这足以让您走上正确的道路。

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

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

我理解你所做的,这对我更有意义。只有一个问题,这是如何检查得分最高的球队是否与同一区域得分最低的球队比赛的。康涅狄格州可能会打维拉诺瓦,但不应该打杜克,因为维拉诺瓦的获胜次数比杜克少。你看过答案了吗?“这是一次很好的第一次尝试,但它将产生所有组合,而不仅仅是两支球队以胜利相匹配的组合。”