- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我定义了具体化的变体 clpfd约束 (#<)/2
, (#=<)/2
, (#>=)/2
和 (#>)/2
:
:- use_module(library(clpfd)).
ltA(X,Y,Truth) :- X #< Y #<==> B, bool01_truth(B,Truth).
ltB(X,Y, true) :- X #< Y.
ltB(X,Y,false) :- X #>= Y.
lteA(X,Y,Truth) :- X #=< Y #<==> B, bool01_truth(B,Truth).
lteB(X,Y, true) :- X #=< Y.
lteB(X,Y,false) :- X #> Y.
gteA(X,Y,Truth) :- X #>= Y #<==> B, bool01_truth(B,Truth).
gteB(X,Y, true) :- X #>= Y.
gteB(X,Y,false) :- X #< Y.
gtA(X,Y,Truth) :- X #> Y #<==> B, bool01_truth(B,Truth).
gtB(X,Y, true) :- X #> Y.
gtB(X,Y,false) :- X #=< Y.
当然,ltA/3
和 ltB/3
是逻辑上等价的, lteA/3
和 lteB/3
, gteA/3
和 gteB/3
, 和 gtA/3
和 gtB/3
.
但是,我使用这些谓词得到的答案在大小和可读性方面有所不同。我使用 SWI-Prolog 7.1.37 运行了以下查询:
好消息,首先!
?- lteA(X,Y,Truth).
Truth = false, Y#=<X+ -1 ;
Truth = true, Y#>=X.
?- lteB(X,Y,Truth).
Truth = true, Y#>=X ;
Truth = false, Y#=<X+ -1.
?- gteA(X,Y,Truth).
Truth = false, X#=<Y+ -1 ;
Truth = true, X#>=Y.
?- gteB(X,Y,Truth).
Truth = true, X#>=Y ;
Truth = false, X#=<Y+ -1.
好的!但是另外两个呢?
?- ltA(X,Y,Truth).
Truth = false, X+1#=_G968, Y#=<_G968+ -1 ;
Truth = true, X+1#=_G912, Y#>=_G912.
?- ltB(X,Y,Truth).
Truth = true, X#=<Y+ -1 ;
Truth = false, X#>=Y.
?- gtA(X,Y,Truth).
Truth = false, X#=<_G1301+ -1, Y+1#=_G1301 ;
Truth = true, X#>=_G1243, Y+1#=_G1243.
?- gtB(X,Y,Truth).
Truth = true, Y#=<X+ -1 ;
Truth = false, Y#>=X.
不完全是!
如何使用 ltA/3
获得简洁的答案和 gtA/3
---就像lteA/3
一样和 gteA/3
?
最佳答案
这与CLP(FD)的基本思想相悖答案。由于 CLP(FD) 通常不进行高斯消元并且类似的事情。它不像计算机代数系统 (CAS)。
在 CLP(FD) 中,您基本上通过输入来对问题建模不等式,并且允许系统对此不做任何事情只要你不调用不等式labeling .
一些 CLP(FD) 实现已经检查了一些一致性输入不等式和/或已经进行简化时的度数和传播。但这不是强制性的。
在您的示例中,您有 E #= X,其中 E 是一个表达式,并且X 是一个变量。不能保证会发生在进入模型时,X 的一部分被 E 代替。
通常这不会在 CLP(FD) 中完成,因为它会吹up 输入的模型。你可以直接测试这个不简化:
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.4)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
?- use_module(library(clpfd)).
true.
?- A#=X+1, Y#=<A+ -1.
Y#=<A+ -1,
X+1#=A.
同样的事情也发生在 Jekejeke Prolog 中。中电( FD )的Jekejeke Prolog 是开源的 here .精化本身已计划但尚未实现:
Jekejeke Prolog, Runtime Library 1.0.7
(c) 1985-2015, XLOG Technologies GmbH, Switzerland
?- use_module(library(finite/clpfd)).
% 11 consults and 0 unloads in 513 ms.
Yes
?- A#=X+1, Y#=<A+ -1.
A #= 1+X,
-1+A #>= Y
典型的方程式 E #= X 只会在以下情况下导致替换E也是一个变量或常量。这也许可以解释为什么你的示例看起来因情况而异。
在这里你看到 SWI-Prolog 简化了 A #= X。我刚刚修改了上面的例子稍微让E是一个变量:
?- A#=X, Y#=<A+ -1.
A = X,
Y#=<X+ -1.
在这里你看到 Jekejeke Prolog 正在做它(Todo 错误修复:我我想我需要稍微重新排序规则,这样它给出 A = X 而不是这里的 X = A):
?- A#=X, Y#=<A+ -1.
X = A,
-1+A #>= Y
E #= X 的情况,其中 E 是常数,而 this值被传播称为前向检查。这是CLP(FD) 必须能够满足的最低要求,否则贴标签是行不通的。
但是已经是 E #= X 的情况,其中 E 是变量 a传播不是强制性的。但是上面的测试表明许多 CLP(FD) 都这样做。传播变量导致联合查找算法等。
再见
关于prolog - clpfd 中具体化的剩余约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30069099/
我正在运行一个带有 while 约束的 SQL 查询,其中包含一些“id”。例如: SELECT table.id FROM TableOne table WHERE table.id IN (1,
我正在寻找在替换其中一个元素后打印元素列表的最正确方法。我可以按如下方式做,但显然很困惑。 #!/usr/bin/python import sys file = open(sys.argv[1])
这个问题在这里已经有了答案: How wide is the default `` margin? (4 个答案) How do I remove the top margin in a web
当我尝试使用命令安装 rvm 时::(I am Using UBUNTU 12.04 LTS) curl -L https://get.rvm.io | bash -s 当我尝试与简单用户相同的命令时
我使用 GOPro 工作人员 6 个月前发送给我的命令,通过终端(在 Gopro 网络上)使用 Gopro Hero3 拍摄照片/视频。有效。但是,在过去的一个月里,我一直在尝试再次执行此操作,并且不
尽管知道我不应该关闭应用程序按钮,但我仍然这样做。完成所有 Activity 后,我调用 finish() 方法,它们调用析构函数和所有内容。用户的行为也是正确的。但我想知道为什么还有 5 个打开的线
当我在 Rest Controller 中的类级别启用 @Validated spring 注释时,会生成 2 个验证上下文(每个验证上下文都有不同的前缀)。 @Validated 注释是必需的,因为
在旧的 API 中,剩余的允许容量显然作为 X-Ratelimit-Remaining 返回HTTP header 。 然而,current version's documentation对此一无所获
我一直在使用 Service Fabric 一段时间,成功构建、部署和测试了多个服务,但我刚刚完成构建的服务在部署时失败(请参阅下面的错误)。在诊断中,我尝试使用 VS 模板(没有代码更改)创建和部署
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: Progress unit in ProgressDialog 如何覆盖进度条进度消息,即 61/100 到
我正在用 Objective-C (Cocoa) 编写命令行实用程序的前端。我需要解析输出以检查不同类型的消息。有两种基本类型;信息消息和下载状态消息。信息消息始终以以下内容之一开头:INFO:、WA
我是一名优秀的程序员,十分优秀!