问题描述
将以下规则添加到我的代码会导致错误消息 (info: operation undefined (Max-Min)
):
rank_difference(Room,Deck,Diff) :-
played(Room,Deck),Min = #min {Rank: seat(Player,Room,rank(Player,Rank)},Max = #max {Rank: seat(Player,Diff = Max - Min.
played(Room,Deck)
意味着至少存在一个 seat(Player,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,Deck) : round(Player,Deck) } 4 :- played(Room,Deck).
rank_difference(Room,Diff = Max - Min.
解决方法
接地器无法推断最小/最大聚合内的集合实际上不是空的。因此,有效的解决方案(至少在接地期间)对于 #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,rank(Player,Rank)},Max = #max {Rank: seat(Player,rank(_,Min),Max),Diff = Max - Min.