元组的 alldifferent

An alldifferent for tuples

我正在尝试以每个数字都有 9 个位置的观点来解决数独问题。这是我的数独游戏的代表:

从 table 你可以读到数字 5 在数独中有以下位置 (Row,Col): (2,8),(4,2 ),(6,5).

当我在解释中提到 时,我指的是这样的一行:

比如上面的就是行1.

我所做的如下:

以上一切正常,我得到了数独的解决方案,但不是正确的解决方案。这是因为我还必须检查一件事:每个位置必须不同。根据我求解器的当前状态,我可以获得在同一位置有多个数字的解决方案,f.e。:23 可能都在位置 (5,7) 因为我不检查所有位置是否不同。

我该如何解决这个问题? 我试图以元组形式获取一个列表中的所有位置,然后检查所有元组是否不同,但我已经苦苦挣扎了几个小时,我真的很绝望。我希望我能在这里找到解决方案。

编辑:添加代码

如您所知,all_different/1 和相关约束适用于 整数 。此外,在您的情况下,您实际上对元组的特殊情况感兴趣,即 pairs 由行和列组成。

所以,你的问题实际上可以简化为:

How can I injectively map pairs of integers to integers?

假设您有 A-B 形式的对,其中 AB 都被限制为 1..9

我可以通过多种方式将这些对一对一对应 到整数。执行此操作的一个非常简单的函数是:9×A + B。想想看!

因此,我建议您以这种方式或类似方式将这些位置映射到整数,然后 post all_different/1 这些整数。

练习:思考其他可能的映射及其属性。然后概括它们以处理 元组 .