首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLPQ/R (Prolog)中一个简单的几何难题的求解

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

Stack Overflow用户
提问于 2020-07-27 00:44:50
回答 1查看 285关注 0票数 8

考虑以下正方形:

给您三个限制:

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

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

扰流警告:如果您想先自己解决这个难题,请不要继续阅读,因为有一些约束会泄露解决方案。

无论如何,我尝试用CLP(Q/R)定义这个难题(我认为包括冗余约束):

代码语言:javascript
复制
:- 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).

当被询问时:

代码语言:javascript
复制
?- solve(Eh).
false.

...makes我难过。对一个约束求解者来说真是个好例子..。有人想要解除我的悲伤吗?

增编:我使用和FindMinimum函数来检查我的约束。它似乎正在发挥作用:

代码语言:javascript
复制
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}]

答案:

代码语言:javascript
复制
{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}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-27 18:45:48

中电有一个旧的/新的条目,clpBNR。您可以在的最新版本中安装它。

我认为这需要把方程组合成一个{}。

代码语言:javascript
复制
?- 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)) .
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63107267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档