prolog - 什么会导致 Prolog 在匹配中成功,但在要求标记输出时失败?

标签 prolog gnu-prolog

我正在尝试解决a logic puzzle使用 Prolog 作为学习练习,我认为我已经使用 GNU Prolog 有限域求解器正确地映射了问题。

当我运行求解函数时,Prolog 会返回:yes 以及全部限制在 0..1 范围内的变量列表( bool 值,因为我对它们进行了限制)。问题是,当我尝试添加 fd_labeling(Solution) 子句时,Prolog 关于面孔并吐出:不。

我是这门语言的新手,在我真正要求它标记答案之前,我似乎找不到任何攻击方法来弄清楚为什么一切似乎都有效......

最佳答案

显然,您没有“正确”地将问题映射到 FD,因为当您尝试标记变量时得到“否”。

您在约束逻辑编程中所做的就是建立一个约束模型,其中包含具有域的变量(在您的例子中 bool 值具有域[0,1]),以及这些变量之间的许多约束。每个约束都有一个传播规则,该规则试图实现发布约束的变量域的一致性。不一致的值将从域中删除。一致性有多种类型,但它们有一个共同点:约束本身通常不会为您提供完整的解决方案,甚至不会告诉您约束模型是否存在解决方案。

举个例子,假设你有两个变量 X 和 Y,都具有域 [1..10],并且约束 X < Y。那么传播规则将从 Y 的域中删除值 1 并删除 10然后它将停止,因为域现在是一致的:对于一个域中的每个值,另一个域中存在一个值,以便满足约束。

为了获得解决方案(其中所有变量都绑定(bind)到值),您需要标记变量。每个标签都会唤醒附加到标签变量的约束,触发另一轮传播。这将导致解决方案(所有变量都绑定(bind)到值,答案:是)或失败(在搜索树的每个分支中,某些变量以空域结束,答案:否)

由于每个约束仅旨在使其所发布的变量域的一致性,因此在传播阶段可能不会检测到由约束组合引起的不可行性。例如,具有域 [1..2] 的三个变量 X、Y、Z 和成对不等式约束。这似乎发生在您的约束模型中。

如果你确信这个难题一定有一个解决方案,那么你的约束模型就包含了一些不可行性。也许敏锐地观察一下约束就足以发现它。

如果您没有看到任何明显的不可行性(例如,一些相互矛盾的约束,如上面的不等式示例),则需要调试您的程序。如果可能的话,不要使用内置标签谓词,而是编写自己的标签谓词。然后,您可以添加一些输出谓词,使您可以跟踪实例化了哪些变量以及这导致了 bool 决策变量的哪些变化,或者是否导致了失败。

关于prolog - 什么会导致 Prolog 在匹配中成功,但在要求标记输出时失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8032611/

相关文章:

open-source - GNU Prolog 的同义反复检查器

prolog - 在 Prolog 中编写区间内数字总和的程序

reflection - 如何列出具有特定原子的所有谓词?

prolog - CLP Prolog - 逻辑编程

list - `predsort/3` 的可能行为

debugging - gprolog : Getting a stacktrace after an exception

prolog - Prolog 中 bagof/3 的问题

module - 无法在 GNU 序言中加载库(readutil)模块?

prolog - 使用 prolog 程序创建新变量

c++ - 在C程序中集成Prolog