【问题标题】:Clingo: operation undefinedClingo:操作未定义
【发布时间】:2023-03-03 15:47:02
【问题描述】:

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

【问题讨论】:

  • 您的编码看起来正确,您可以创建一个示例实例,我可以在其中重现错误吗?

标签: logic-programming answer-set-programming clingo


【解决方案1】:

grounder 无法推断出您的最小/最大聚合中的集合实际上不是空的。因此有效的解决方案(至少在接地期间)也是#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, Deck), rank(Player, Rank)},
    Max = #max {Rank: seat(Player, Room, Deck), rank(Player, Rank)},
    rank(_, Min), rank(_, Max),
    Diff = Max - Min.

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2019-05-17
    • 2018-10-14
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多