考虑以下正方形:
您将获得三个约束:
- 所有矩形(A、B、C、D 和 E)具有相同的面积;
- 它们的几何布局构成一个正方形;和
- A 的高度为 2。
现在,我知道手动解决这个问题非常简单,但我认为这将是一个很好的例子来展示 CLP(Q/R) 与 Prolog 的功能:
剧透警告:如果您想先自己解决难题,请不要继续阅读本文,因为存在一些限制条件会泄露解决方案。
无论如何,这是我尝试用 CLP(Q/R)定义(我认为包括冗余约束)这个难题:
:- use_module(library(clpr)).
solve(Eh) :-
A = B, B = C, C = D, D = E,
{ A >= 1, B >= 1, C >= 1, D >= 1, E >= 1,
Aw >= 1, Bw >= 1, Cw >= 1, Dw >= 1, Ew >= 1 },
{ Ah = 2 },
{ A = Ah * Aw,
B …Run Code Online (Sandbox Code Playgroud) 我希望使用 Prolog 生成满足约束系统的随机向量。
例如,我们的用户可能会在运行时向我们的软件提供以下信息:
给定一个向量<x1, x2, x3, ... x30>,我们可能有两个约束:
x1 > x2 + x3 + x4
x5 <= sin(x6 + x7)
Run Code Online (Sandbox Code Playgroud)
我想做的是生成一个大致遵循以下形式的 Prolog 程序:
:- random(0.0, 1.0, X1)
:- random(0.0, 1.0, X2)
#...
# its also concievable that the bounds are different than 0 to 1
:- random(0.0, 1.0, X30)
clp(r) :- constraints {
X1 > X2 + X3 + X4,
X5 <= sin(X6 + X7)
}
?- [ X1, X2, X3, X4, ... X30 ]
Run Code Online (Sandbox Code Playgroud)
这将在 30 …
我对 CLP 在 Prolog 中的工作方式感到非常困惑。我不仅发现很难看到好处(我确实在特定情况下看到了它,但发现很难概括这些好处),而且更重要的是,我几乎无法弥补如何正确编写递归谓词。以下哪一项是 CLP(R) 方式的正确形式?
factorial(0, 1).
factorial(N, F):- {
N > 0,
PrevN = N - 1,
factorial(PrevN, NewF),
F = N * NewF}.
Run Code Online (Sandbox Code Playgroud)
或者
factorial(0, 1).
factorial(N, F):- {
N > 0,
PrevN = N - 1,
F = N * NewF},
factorial(PrevN, NewF).
Run Code Online (Sandbox Code Playgroud)
换句话说,我不确定何时应该在约束之外编写代码。对我来说,第一种情况似乎更合乎逻辑,因为PrevN并且NewF属于约束条件。但如果这是真的,我很想知道在什么情况下在递归函数中使用约束之外的谓词是有用的。
使用ECLiPSe Prolog lib(ic)我偶然发现了David H. Bailey的"解决科学计算中的数值异常"的问题.这是我在Unum书中提到的.实际上,它只是其中的一部分.首先,让我根据方程式来制定方程式(is)/2.另请注意,所有这些十进制数都在基数2浮点数(包括IEEE)中具有精确表示:
ECLiPSe Constraint Logic Programming System [kernel]
...
Version 6.2development #21 (x86_64_linux), Wed May 27 20:58 2015
[eclipse 1]: lib(ic).
...
Yes (0.36s cpu)
[eclipse 2]: X= -1, Y = 2, Null is 0.80143857*X+1.65707065*Y-2.51270273.
X = -1
Y = 2
Null = 0.0
Yes (0.00s cpu)
Run Code Online (Sandbox Code Playgroud)
所以这真的是0.0(根本没有四舍五入).但现在同样$=代替is:
[eclipse 3]: X= -1, Y = 2, Null $= 0.80143857*X+1.65707065*Y-2.51270273. …Run Code Online (Sandbox Code Playgroud) prolog floating-accuracy interval-arithmetic eclipse-clp clpr