问题标签 [constraint-handling-rules]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1037 浏览

prolog - 您如何计算 Prolog SWI 或 CHR Prolog SWI 中的回溯量

我正在使用 CHR(约束处理规则)在 Prolog SWI 中创建几个解谜器

一切都很好,但是,我喜欢测试哪个求解器是最好的。因此,我想找出哪个求解器使用的回溯量最少。

有没有一种聪明的方法来找出(或打印出)求解器解决特定难题所需的回溯量?

从逻辑上讲,计数会有所帮助,但它没有 --> 回溯!<-- 。此外,由于 SWI 的 GUI,在屏幕上打印新行无效。您不能打印超过 +/- 50 行并且不能正确选择

0 投票
1 回答
221 浏览

prolog - 使用约束处理规则避免无限递归

我使用约束处理规则在 SWI-Prolog 中编写了一组简单的约束。它使用两个相对简单的推理规则:

我希望means([3,is,equal,to,4],[3,equals,4])true,但它似乎会导致无限递归:

我在这个程序中添加了一个 simpagation 规则,但它仍然导致Out of local stack错误:

是否可以重新编写推理规则,使它们不会产生无限递归?

0 投票
1 回答
106 浏览

prolog - 在约束处理规则中表示逻辑析取

我正在 Prolog 中编写一个约束求解器,它实现了一个简单的逻辑公式:

"(alive(A) and animal(A)) iff (awake(A) or asleep(A))".

我在约束处理规则中找到了一种实现它的方法,但它比原始公式要冗长得多:

是否可以使用单个语句而不是多个冗余语句来实现此公式?

0 投票
1 回答
349 浏览

c# - 在 C++ 中使用约束处理程序

我在 C# 中有一个使用 _set_invalid_parameter_handler 函数的代码。它是特定于 Windows 的,我正在尝试用标准 C++ 重写此代码,以便它在 Linux 上运行。

我不确定如何翻译此功能。我被建议使用http://en.cppreference.com/w/c/error/set_constraint_handler_s但我遵循了这个例子,并且约束处理程序的类型在 Visual Studio 2015 中也没有被识别,当我尝试编译它时在 Linux 上。将感谢使用约束处理程序或找到其他方式在标准 C++ 中复制 _set_invalid_parameter_handler 功能的帮助。

0 投票
1 回答
206 浏览

swi-prolog - 在运行时定义 CHR 约束

我正在尝试在 SWI-Prolog 中编写一个在运行时生成新约束的程序。is_true([A,means,B])旨在在运行时生成另一个约束:

但是当我键入这些查询时,is_true约束似乎没有效果。is_true([something, is, not, false])不返回true

在控制台中断言约束似乎也没有效果:

是否有另一种方法可以在运行时定义新的 CHR 约束?

0 投票
0 回答
45 浏览

prolog - 将 Eclipse CLP 中的代码转换为 CHR 的通用方法

我的问题有点笼统,但我的具体问题的答案可能会很有帮助。一般问题是“是否有任何通用方法可以将 Eclipse CLP prolog 中的代码传输到约束处理规则 (CHR) 代码?”。我知道 CHR 代码无论如何都会被编译为序言代码。

具体问题是“是否有任何算法或任何正式规则可以将Eclipse CLP 中的 N-Queens示例代码转换为 CHR 代码?”。

0 投票
1 回答
74 浏览

prolog - Prolog 中的 CHR 解决方案输出

我正在 SWI-Prolog 中运行教科书 CHR 程序。

一切正常,但我不明白为什么输出这么长

谁不仅A = 3?我可以禁用其余的吗?对于更大的价值来说,这是一个真正的不便......

0 投票
1 回答
86 浏览

prolog - SWI Prolog 中用于简单 and() 规则的 CHR 行为

我正在使用 CHR 库在 SWI-Prolog 中尝试一个简单的程序。

对查询的回答对我来说是显而易见的,但追踪让我感到困惑。

我从一个规则开始。

追踪有意义

我添加了一条新规则

现在追踪对我来说开始很奇怪。我期待一个类似的痕迹,但我得到了这个......

这是为什么and(_80150,0,_79780)?为什么Y变量与 0 匹配?

0 投票
1 回答
61 浏览

prolog - 在 CHR 和 CLP/FD 中创建双向规则

举个例子。假设红色的所有东西的值都是 5。我写了以下内容:

hasColor(moose, red)正确产生推断的输出hasColor(moose, red), hasValue(moose, 5)

但是,我希望推理也能以另一种方式工作;指定如果某物的值为 5,则它必须为红色。目前,hasValue(moose, 5)被接受为约束但不产生推论。但添加规则:

hasValue(Thing, 5) ==> hasColor(Thing, red).

导致任何调用hasValue(moose, 5)完全锁定并堆栈溢出,显然会导致无限循环,即使==>声明规则“仅调用其主体一次”。

我很感激我没有说事物只能有一种颜色或值(我不确定我将如何做到这一点),但重复添加moose具有red价值5的约束肯定不会改变约束集。

如何使系统能够在两个方向上正确执行此推理?

0 投票
2 回答
226 浏览

prolog - SWI Prolog 中的约束处理规则:“约束存储”是否仅在顶级目标处理期间存在?

我正在仔细研究约束处理规则(CHR),看看我是否能理解它们(从某种意义上说,这里计算的是什么以及经典逻辑甚至线性逻辑如何适应其中)并可能应用它们。

Thom Frühwirth于 2009 年出版的书中讨论了 CHR 的原理,但实施当然可能不同。

在这种情况下,我使用CHR 的 SWI Prolog 实现

如果我理解得很好:

  1. CHR 的实现将提供至少一个“约束存储”来表达“计算的状态”。约束存储仅包含基本原子(即正字面量)。
  2. 在典型的 CHR 会话中,首先设置具有初始状态的约束存储。一个人编写 CHR 程序,其中包含 CHR 规则。然后以约束存储作为参数运行 CHR 程序。重复应用正向链接 CHR 规则直到不再有任何规则适用,这将迭代地(并且破坏性地)将约束存储从其初始状态转换为某个最终状态。然后可以检查约束存储以找到所需的答案。
  3. 在这种情况下,只考虑不关心非确定性(“承诺选择非确定性”):当多个规则适用于任何中间状态时,任何一个都会被采用。
  4. 考虑在以后失败的情况下回溯到选择点的“不知道”非确定性——如果需要,由实现以一种或另一种方式提供它。

作为一个练习,一个使用欧几里得算法计算 GCD 并保留操作日志的最简单程序:

这一切都非常简单。SWI Prolog 中的测试运行

答案由最后两行给出: 约束存储中剩下的唯一约束是gcdpool(3),所以 3 就是答案。

在实施方面,以下似乎成立:

没有专门的“约束存储”。CHR 程序(以某种方式)被编译到 Prolog 中,并且“CHR 约束”成为“Prolog 谓词”。这样的“约束存储”是称为 Prolog 顶级目标的堆栈(它没有被具体化)。

因此,“约束存储”使用“CHR 目标”中列出的约束进行初始化,并在最终退出时消失。您也不能以逐步或交互的方式设置约束存储,但必须在一行中完成:

之后,CHR 程序立即开始工作。

事实上,谓词find_chr_constraint/1应该从约束存储中获取数据,一旦 CHR 程序运行,它什么也不返回。因为不再有约束存储。

此外,试图在“CHR 程序”本身中设置约束存储是没有意义的。因此放入logg(0,[])GCD 代码没有任何效果。你必须投入logg(0,[])CHR目标。

问题

  • 这种理解正确吗?
  • 如何将 CHR 计算结果返回 Prolog?
  • Prolog 实现提供的回溯可能性如何处理?如何将其用于 CHR?