我读了一篇关于Prolog和Logic Programming的简短文章.我很好奇逻辑程序是否可以进行代数.就像你能问出X的变量在等式5 + X = 7中得到什么并得到-2的答案?
考虑以下正方形:
您将获得三个约束:
- 所有矩形(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) 我正在使用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),但前者并没有给我我想要的结果.任何人都可以解释为什么这两种方法产生不同的结果,以及我如何让前者像后者一样行事?