Clingo:操作未定义

问题描述

将以下规则添加到我的代码会导致错误消息 (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 也是 #maxhttps://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.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...