元组的 alldifferent
An alldifferent for tuples
我正在尝试以每个数字都有 9 个位置的观点来解决数独问题。这是我的数独游戏的代表:
从 table 你可以读到数字 5 在数独中有以下位置 (Row,Col): (2,8),(4,2 ),(6,5).
当我在解释中提到 行 时,我指的是这样的一行:
比如上面的行就是行1.
我所做的如下:
- 对于每一行,使用
ic_global
中的 alldifferent
检查该行中的所有 ROW 值是否不同。
- 执行与上面相同的操作,然后对列值进行操作。
- 对于每一行,检查平方数是否不同(每次使用行和列值计算),再次使用
alldifferent
。
以上一切正常,我得到了数独的解决方案,但不是正确的解决方案。这是因为我还必须检查一件事:每个位置必须不同。根据我求解器的当前状态,我可以获得在同一位置有多个数字的解决方案,f.e。:2 和 3 可能都在位置 (5,7) 因为我不检查所有位置是否不同。
我该如何解决这个问题?
我试图以元组形式获取一个列表中的所有位置,然后检查所有元组是否不同,但我已经苦苦挣扎了几个小时,我真的很绝望。我希望我能在这里找到解决方案。
编辑:添加代码
如您所知,all_different/1
和相关约束适用于 整数 。此外,在您的情况下,您实际上对元组的特殊情况感兴趣,即 pairs 由行和列组成。
所以,你的问题实际上可以简化为:
How can I injectively map pairs of integers to integers?
假设您有 A-B
形式的对,其中 A
和 B
都被限制为 1..9
。
我可以通过多种方式将这些对一对一对应 到整数。执行此操作的一个非常简单的函数是:9×A + B。想想看!
因此,我建议您以这种方式或类似方式将这些位置映射到整数,然后 post all_different/1
这些整数。
练习:思考其他可能的映射及其属性。然后概括它们以处理 元组 .
我正在尝试以每个数字都有 9 个位置的观点来解决数独问题。这是我的数独游戏的代表:
从 table 你可以读到数字 5 在数独中有以下位置 (Row,Col): (2,8),(4,2 ),(6,5).
当我在解释中提到 行 时,我指的是这样的一行:
比如上面的行就是行1.
我所做的如下:
- 对于每一行,使用
ic_global
中的alldifferent
检查该行中的所有 ROW 值是否不同。 - 执行与上面相同的操作,然后对列值进行操作。
- 对于每一行,检查平方数是否不同(每次使用行和列值计算),再次使用
alldifferent
。
以上一切正常,我得到了数独的解决方案,但不是正确的解决方案。这是因为我还必须检查一件事:每个位置必须不同。根据我求解器的当前状态,我可以获得在同一位置有多个数字的解决方案,f.e。:2 和 3 可能都在位置 (5,7) 因为我不检查所有位置是否不同。
我该如何解决这个问题? 我试图以元组形式获取一个列表中的所有位置,然后检查所有元组是否不同,但我已经苦苦挣扎了几个小时,我真的很绝望。我希望我能在这里找到解决方案。
编辑:添加代码
如您所知,all_different/1
和相关约束适用于 整数 。此外,在您的情况下,您实际上对元组的特殊情况感兴趣,即 pairs 由行和列组成。
所以,你的问题实际上可以简化为:
How can I injectively map pairs of integers to integers?
假设您有 A-B
形式的对,其中 A
和 B
都被限制为 1..9
。
我可以通过多种方式将这些对一对一对应 到整数。执行此操作的一个非常简单的函数是:9×A + B。想想看!
因此,我建议您以这种方式或类似方式将这些位置映射到整数,然后 post all_different/1
这些整数。
练习:思考其他可能的映射及其属性。然后概括它们以处理 元组 .