在 Mozart/Oz 中检查变量元组是否不能进一步受到约束
您好,
这个想法可以通过一个例子来最好地给出:
假设我们有一个向量 vec(a:{FD.int 1#100} b:{FD.int 1#100} c:{FD.int 1# 100})
。 我希望能够向这个向量添加约束,直到我添加的每个附加约束 它不会添加任何更多信息,例如不会进一步约束 vec.a
、vec.b
和 vec.c
。
莫扎特/奥兹国可以做到吗?
我想这样想。
循环中:
- 访问约束存储,
- 检查是否发生变化,
- 如果没有变化则终止。
Greetings,
The idea can be best given with an example:
Suppose we have a vector vec(a:{FD.int 1#100} b:{FD.int 1#100} c:{FD.int 1#100})
.
I want to be able to add constraints to this vector, until the point that every additional constraint I add
to it does not add any more information, e.g. does not constraint vec.a
, vec.b
and vec.c
any further.
Is it possible to do it in Mozart/Oz?
I'd like to think it that way.
In a loop:
- Access the constraint store,
- Check whether it is changed
- Terminate if there is no change.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用
FD 中的函数检查有限域变量的状态.reflect
模块。 FD.reflect.dom 函数在这种情况下似乎特别有用。要获取记录中每个字段的当前域,您可以将此函数映射到记录上:
您的示例中的初始结果将是:
现在您可以比较添加约束之前和之后该函数的结果,看看是否发生了任何情况。
有两个限制:
如果您需要有关如何在循环中使用
GetDomains
函数的示例,请告诉我...编辑:使用 旧邮件列表消息,我想出了这个通用解决方案,它应该适用于所有类型的限制。它的工作原理是在从属计算空间中推测性地执行约束。
You can check the state of a finite domain variable with the functions in the
FD.reflect
module. TheFD.reflect.dom
function seems especially useful in this context.To get the current domain of every field in a record, you can map this function over records:
The initial result in your example would be:
Now you can compare the result of this function before and after adding constraints, to see if anything happens.
Two limitations:
If you need an example on how to use the
GetDomains
function in a loop, let me know...EDIT: With a hint from an old mailing list message, I came up with this general solution which should work with all types of constraints. It works by speculatively executing a constraint in a subordinate computation space.