标签: clpq

我很好奇逻辑程序是否可以进行代数

我读了一篇关于Prolog和Logic Programming的简短文章.我很好奇逻辑程序是否可以进行代数.就像你能问出X的变量在等式5 + X = 7中得到什么并得到-2的答案?

declarative algebra prolog clpfd clpq

10
推荐指数
3
解决办法
2047
查看次数

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

考虑以下正方形:

在此处输入图片说明

您将获得三个约束:

  1. 所有矩形(A、B、C、D 和 E)具有相同的面积;
  2. 它们的几何布局构成一个正方形;和
  3. 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 constraint-programming clpq clpr

8
推荐指数
1
解决办法
236
查看次数

SWI-Prolog和约束,库CLP(FD)

我正在使用clpfd库在(swi)prolog中使用约束.

我试图确定一组约束何时封装或包含另一组约束,例如X <4封装X <7,就像前者为真,后者为真.这可以使用逻辑蕴涵来轻松表示.但是,我无法让#==>运算符给我想要的结果,所以我求助于使用not(Co1#/ \#\ Co2),其中Co1和Co2是约束.这适用于个别约束,但我想将约束的连接传递给Co1和Co2.

现在这是擦.当我尝试

X#<7 #/\ #\X#<4.
Run Code Online (Sandbox Code Playgroud)

我回来了

X in 4..6,
X+1#=_G822,
X+1#=_G834,
_G822 in 5..7,
_G834 in 5..7.
Run Code Online (Sandbox Code Playgroud)

(奇怪的是,在Sicstus中执行此操作会导致分段错误)

我进去的时候

X#<7,X#<4
Run Code Online (Sandbox Code Playgroud)

我得到了理想的

X in inf..3.
Run Code Online (Sandbox Code Playgroud)

显然,我无法将后者传递给(Co1#/ \#\ Co2),但前者并没有给我我想要的结果.任何人都可以解释为什么这两种方法产生不同的结果,以及我如何让前者像后者一样行事?

constraints prolog clpfd clpq

5
推荐指数
1
解决办法
1812
查看次数