gpt4 book ai didi

prolog - 元组的 alldifferent

转载 作者:行者123 更新时间:2023-12-01 12:28:16 25 4
gpt4 key购买 nike

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

sudoku

从表中可以看出,数字 5 在数独中的位置如下(行,列):(2,8),(4,2),(6,5)。

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

例如,上面的是行1

我所做的如下:

  • 对于每一行,使用 ic_global 中的 alldifferent 检查该行中的所有 ROW 值是否不同。
  • 执行与上述相同的操作,但然后针对 COLUMN-Values。
  • 对于每一行,检查平方数是否不同(每次使用行和列值计算),再次使用 alldifferent

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

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

编辑:添加代码

code

最佳答案

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

因此,您的问题实际上可以简化为:

How can I injectively map pairs of integers to integers?

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

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

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

练习:考虑其他可能的映射及其属性。然后将它们泛化以处理元组

关于prolog - 元组的 alldifferent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37292574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com