将以下规则添加到我的代码中会导致错误消息(info: operation undefined (Max-Min)):
rank_difference(Room, Deck, Diff) :-
played(Room, Deck),
Min = #min {Rank: seat(Player, Room, Deck), rank(Player, Rank)},
Max = #max {Rank: seat(Player, Room, Deck), rank(Player, Rank)},
Diff = Max - Min.played(Room, Deck)意味着至少存在一个seat(Player, Room, Deck)谓词(实际上存在3或4),而每个玩家都存在rank(Player, Rank),因此这不应该是一个空集问题。
更新-可运行的示例(没有任何约束):
#const nRounds = 4.
#const nPlayers = 13.
#const nRooms = 4.
#const nDecks = 10.
player(1..nPlayers).
room(1..nRooms).
deck(1..nDecks).
writer(1,1;2,2;3,3;4,4).
rank(Player, Player) :- player(Player).
nRounds { round(Player, 1..nDecks) } nRounds :- player(Player).
{ played(Room, Deck) } :- room(Room), deck(Deck).
3 { seat(Player, Room, Deck) : round(Player, Deck) } 4 :- played(Room, Deck).
rank_difference(Room, Deck, Diff) :-
played(Room, Deck),
Min = #min {Rank: seat(Player, Room, Deck), rank(Player, Rank)},
Max = #max {Rank: seat(Player, Room, Deck), rank(Player, Rank)},
Diff = Max - Min.发布于 2021-05-18 18:14:39
地球不能推断您的min/max集合中的集合实际上不是空的。因此,有效的解决方案(至少在接地期间)也是#sup ( #min )和#inf ( #max )。https://en.wikipedia.org/wiki/Infimum_and_supremum对这些值执行算术是未定义的。您必须显式地绑定操作的结果,因此在本例中:
rank_difference(Room, Deck, Diff) :-
played(Room, Deck),
Min = #min {Rank: seat(Player, Room, Deck), rank(Player, Rank)},
Max = #max {Rank: seat(Player, Room, Deck), rank(Player, Rank)},
rank(_, Min), rank(_, Max),
Diff = Max - Min.https://stackoverflow.com/questions/67589387
复制相似问题