在 CLPQ/R (Prolog) 中解决一个简单的几何难题

Posted

技术标签:

【中文标题】在 CLPQ/R (Prolog) 中解决一个简单的几何难题【英文标题】:Solving a simple geometric puzzle in CLPQ/R (Prolog) 【发布时间】:2020-11-16 07:24:30 【问题描述】:

考虑以下正方形:

给你三个约束:

    所有矩形(A、B、C、D 和 E)的面积相同; 它们的几何布局构成一个正方形;和 A 的高度为 2。

现在,我知道手动解决这个问题非常简单,但我认为这将是一个很好的例子,可以用 Prolog 展示 CLP(Q/R) 的功能:


剧透警告:如果您想先自己解决难题,请不要继续阅读此内容,因为存在一些限制会泄露解决方案。


无论如何,这是我用 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 = Bh * Bw,
    C = Ch * Cw,
    D = Dh * Dw,
    E = Eh * Ew ,

   (Bw + Cw) = Aw,
     Dw = Cw,
    (Ah + Bh) = Eh,
    (Ch + Dh) = Bh,
    (Aw + Ew) = Eh ,

  minimize(Eh).

查询时:

?- solve(Eh).
false.

...让我难过。这样一个约束求解器的漂亮例子......有人愿意消除我的悲伤吗?


附录:我使用 Mathematica 和 FindMinimum 函数来检查我的约束。它似乎正在工作:

domain = a >= 1 && b >= 1 && c >= 1 && d >= 1 && e >= 1 && ah == 2.0 && a == b == c == d == e && aw >= 1 && bw >= 1 && cw >= 1 && dw >= 1 && ew >= 1
rectangles = (a == ah*aw && b == bh*bw && c == ch*cw && d == dh*dw && e == eh*ew)

FindMinimum[eh, 
  domain && rectangles &&
  ((bw + cw ) == aw && dw == cw && (ah + bh) == eh && (ch + dh) == bh && (aw + ew) == eh), 
  a, b, c, d, e, ah, aw, bh, bw, ch, cw, dh, dw, eh, ew]

答案:

8., a -> 12.8, b -> 12.8, c -> 12.8, d -> 12.8, e -> 12.8, 
      ah -> 2., aw -> 6.4, bh -> 6., bw -> 2.13333, ch -> 3., 
      cw -> 4.26667, dh -> 3., dw -> 4.26667, 
      eh -> 8., ew -> 1.6

【问题讨论】:

我认为问题是约束的非线性,即A = Ah*Aw 等。在 CLP(R) 中允许非线性约束时的规则在这里:swi-prolog.org/pldoc/man?section=clpqr-non-linear 但我不知道如何解决这个问题。注意:如果您将* 更改为+,将会有结果(虽然不正确)。 (我写了一个 MiniZinc 模型来确认你的 Mathematica 结果。) 我同意这可能是由于乘法。即使这在我的 SWI-Prolog 7.2.3 上的 CLP(R) 和 CLP(Q) 中也失败了:?- X >= 1, Y >= 1, Z = X * Y , inf(Z, Inf). 看起来这些库不是解决这类难题的正确工具。 【参考方案1】:

CLP 中有一个旧/新条目,clpBNR。您可以将其安装在最新版本的 SWI-Prolog 中。

我认为需要将方程式组合成一个 。

?- pack_install(clpBNR).

:- use_module(library(clpBNR)).

solve_(Eh) :-
  Vs = [A,B,C,D,E, Aw,Bw,Cw,Dw,Ew, Ah,Bh,Ch,Dh,Eh],
  Vs::real(1,100),

   Ah == 2,

    A is Ah * Aw,
    B is Bh * Bw,
    C is Ch * Cw,
    D is Dh * Dw,
    E is Eh * Ew,

    A == B,
    B == C,
    C == D,
    D == E,

    (Bw + Cw) == Aw,
     Dw == Cw,
    (Ah + Bh) == Eh,
    (Ch + Dh) == Bh,
    (Aw + Ew) == Eh
  ,

  solve(Vs).

?- solve_(Eh).
::(Eh, ...( 8.000000)) .

【讨论】:

以上是关于在 CLPQ/R (Prolog) 中解决一个简单的几何难题的主要内容,如果未能解决你的问题,请参考以下文章

在 Prolog 中解决逻辑难题 [关闭]

在 Prolog 中解决“Feed the Golorp”难题

解决Prolog中的谜题

Clojure core.logic 的简单 Prolog

我的简单prolog代码抛出语法错误:运算符预期

Prolog 谜题面包师、肉工和木匠