首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog约束逻辑程序设计中的未知数顺序

Prolog约束逻辑程序设计中的未知数顺序
EN

Stack Overflow用户
提问于 2018-08-27 00:16:20
回答 2查看 339关注 0票数 3

我有:

代码语言:javascript
复制
:-use_module(library(clpr)).
comp(X, Y, Z):-
    {X = Y * Z, Y = Z, Y > 0, Z > 0}.

该查询包括:

代码语言:javascript
复制
?-comp(X,3,Z).

收益率:

代码语言:javascript
复制
X = 9.0,
Z = 3.0

不出所料。但为什么不

代码语言:javascript
复制
comp(9,Y,Z).

还给我Y和Z的值吗?我得到的结果是:

代码语言:javascript
复制
{Z>0.0,Y=Z,9-Y*Z=0.0},
{9-Y*Z=0.0},
{9-Y*Z=0.0}

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-30 03:19:14

使用this模块可以更好地处理有限域上的约束:

代码语言:javascript
复制
:-use_module(library(clpfd)).
comp(X, Y, Z):-
    X #= Y * Z, Y #= Z, Y #> 0, Z #> 0.

使用

代码语言:javascript
复制
comp(9,Y,Z).

我得到了:

代码语言:javascript
复制
Y = Z, Z = 3
票数 1
EN

Stack Overflow用户

发布于 2018-08-27 07:51:36

这可能是使用的CLP(R)的一个弱点,即二次情况不能很好地工作。在Y= Z之后,很明显X= Y**2,然后当X=9且Y> 0时,您应该很容易得到Y= 3。您使用哪种CLP(R)?

CLP(R)不仅需要支持线性等式和不等式。例如,使用Gröbner基算法,CLP(R)可以做更多的事情,甚至在代数上。一些计算机代数系统可以很容易地做到这一点。

所以我猜这不是Prolog本身的问题,而是库的问题。严格地说,CLP( X )只表示一个域X。对于实数域R,有各种各样的位势方程和不等式求解器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52028079

复制
相关文章

相似问题

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