0

我是 ASP 的完整初学者。

adj(c11,c12). adj(c12,c13). adj(c13,c14).
adj(c21,c22). adj(c22,c23). adj(c23,c24).
adj(c31,c32). adj(c32,c33). adj(c33,c34).

adj(c11,c21). adj(c12,c22). adj(c13,c23). adj(c14,c24).
adj(c21,c31). adj(c22,c32). adj(c23,c33). adj(c24,c34).

adj(c11,c22). adj(c12,c21). adj(c12,c23). adj(c13,c22). adj(c13,c24). adj(c14,c23).
adj(c21,c32). adj(c22,c31). adj(c22,c33). adj(c23,c32). adj(c23,c34). adj(c24,c33).

{mine(F)} <= 1 :- adj(F,C).
:- #count {mine(F) : adj(F,X)} <= 2.

所以我正在生成一个扫雷游戏。目前,我将地雷生成到不同的单元格中。但是我的#Count 不起作用,如何<=在每个答案集中将每个地雷限制为 2?

4

1 回答 1

0

回答问题

目前对地雷的定义是:

{mine(F)} <= 1 :- adj(F,C).   % generation
:- #count {mine(F) : adj(F,X)} <= 2.   % restriction

一代人说:对于原子 F 的第一个参数中找到的所有图块,有一个或零个 mine限制是说:对于原子 F 的第一个参数中找到的所有图块,有一个或零个 mine,这总是正确的,因为如果有地雷或没有地雷。

计数约束应写为:

:- #count{F: mine(F)} > 2.

或者,更简单地说:

:- {mine(_)} > 2.

替代(更简单)的方式

为了在该领域获得 between mand nmines,然后我们应该让出 between mand natom mine(F)whereF是一个瓦片名称。(如c12)。这可以通过没有限制的生成来完成:

% tile(T) holds for all identifier used in adj/2 atoms.
tile(T):- adj(T,_).
tile(T):- adj(_,T).

% yield between m and n mines (with m=0 and n=2)
0 {mine(F): tile(F)} 2.

这将输出包含 0、1 或 2 个地雷的 79 个模型。

于 2017-01-13T13:24:40.877 回答