【问题标题】:Newbie question about the difference between integrity constraints and choice rules in ASP/Clingo?关于 ASP/Clingo 中完整性约束和选择规则之间区别的新手问题?
【发布时间】:2021-08-20 20:28:41
【问题描述】:
#const w = 2.
#const h = 1.

% Create a grid wxh
row(1..h).
col(1..w).

% Generate
% {} below indicates all rooms need not exist in the solution.
% There can be 1x1 rooms, that can be placed anywhere on the grid.
{room11(X, Y) : col(X), row(Y) }.
% 2x1 (width 2) rooms can be placed anywhere except the last column,
% because that will take it out of the grid
{room21(X, Y) : col(X), col(X+1), row(Y) }.

% Calculate what areas the generated rooms cover.
% Multiple rooms covering the same X,Y , or no room covering it,
% would indicate a invalid model.

% A 1x1 room covers its own location. 
covered(room11(X, Y), X, Y) :- room11(X, Y) .

% Put all generated rooms in a list
_r(room11(X, Y)) :- room11(X, Y) .

% A 2x1 room covers X, Y and X+1, Y
covered(room21( X, Y), X, Y) :- room21(X, Y) .
covered(room21( X-1, Y), X, Y) :- room21(X-1, Y) .

% Put all generated rooms in a list
_r(room21(X, Y)) :- room21(X, Y) .

% Each grid point can be covered by one and only one room.
% There can be only one covered(_,X,Y) in the model.
1 {covered(R, X, Y) : _r(R) } 1 :- col(X), row(Y) .

% Count the number of cover(_, X, Y) atoms for debugging
cc (X, Y, N) :- N = {covered(R, X, Y) : _r(R) } , col(X), row(Y) .

在上面的 cmets 中解释了我的想法。

我期待 2 个答案

room11(1,1) room11(2,1)

room21(1,1)

但是当我列举所有答案时,我也会得到很多其他不一致的答案。

我做错了什么?

Answer: 1
row(1) col(1) col(2) room11(1,1) _r(room11(1,1)) 
covered(room11(1,1),1,1) cc(1,1,1) covered(room11(1,1),2,1) cc(2,1,1)

原子covered(room11(1,1),2,1)是如何形成的?是1 {covered(R, X, Y) : _r(R) } 1 :- col(X), row(Y) . 造成的吗?正确的写法是什么?

Answer: 10
row(1) col(1) col(2)
room11(1,1) room11(2,1) _r(room11(1,1)) _r(room11(2,1)) room21(1,1) _r(room21(1,1))
covered(room21(1,1),1,1) covered(room21(1,1),2,1)
cc(1,1,1) cc(2,1,1)

room11(1,1) 怎么可能是真的但covered(room11(1,1),1,1) 不是真的/不存在于模型中?

【问题讨论】:

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


    【解决方案1】:

    可以推导出规则头部的所有内容。您不想无缘无故地派生covered/2。因此,您必须将 covered/2 的生成规则替换为以下规则:

    % Each grid point can be covered by one and only one room.
    % There can be only one covered(_,X,Y) in the model.
    :- 1 != {covered(R, X, Y)}, col(X), row(Y).
    

    这为您提供了 2 个预期的解决方案。

    PS:如果您想概括您的编码,您应该将房间的尺寸作为房间谓词的参数,例如room(Width,Height,PosX,PosY).

    【讨论】:

    • 谢谢!这样可行。你知道为什么1 != {covered(_, X, Y)}, col(X), roy(Y) 没问题但1 != #count {covered(_, X, Y)}, col(X), roy(Y) 抱怨不安全变量吗?两者不一样吗?
    • 对于 room(Width,Height,PosX,PosY) ,我如何为所有 X=PosX..PosX+Width, Y=PosY..PosY+Height 编写covered(X,Y) ?
    • 未命名的聚合只是我认为的旧式语法。 1 != #count {X,Y : covered(_, X, Y)}, col(X), row(Y) 命名聚合需要一个元组(在本例中为 X,Y),后跟一个条件。 1 != #sum {1,X,Y : covered(_, X, Y)}, col(X), row(Y) 与 sum 约束相同,其中 1,X,Y 是元组,而 suple 的第一个元素是元组的实际权重。在计数聚合中,每个元组都隐含权重 1。
    • room(2,3,1,1). covered(X',Y') :- room(Width, Height, X, Y), X'=X..X+Width-1, Y'=Y..Y+Height-1.
    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    相关资源
    最近更新 更多