首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数值表达式中访问系数(clpr)

在数值表达式中访问系数(clpr)
EN

Stack Overflow用户
提问于 2019-02-21 14:33:29
回答 1查看 44关注 0票数 2

我有一些子句,头代表线性方程中一组变量的名称和值,正文表示实际方程。就像这样:

代码语言:javascript
复制
:-use_module(library(clpr)).    
relation(
        independents([
            var(x1, X1),
            var(x2, X2),
            var(x3, X3)
        ]),
        dependent(
            var(y, Y)
        )
    ):- {Y = 3 + 0.5 * X1 + 0.6 * X2 + 0.7 * X3}.

有一种直接的方法(间接地)得到这个方程的系数吗?即返回coefficient(VARNAME, COEFFICIENT)的规则,例如coefficient(x1, 0.5), coefficient(x2, 0.6)等。

我知道这似乎是一个愚蠢的问题,因为只要把所有的系数都放在子句的前面就很容易了。但是在我的应用程序中,我希望这些子句的头严格地显示每个变量的值(而不是它们的系数)。即避免模棱两可。

我目前的解决方案是一个复杂而不优雅的解决方案,涉及member/2subtract/3maplist/2,并将X1、X2、X3设置为1或0以确定每个斜率。

相关问题:Representing linear functions in prolog

谢谢!

/JC

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-21 18:21:41

这是我第一次使用clpr,所以如果这对您没有帮助的话,我会疯狂地说,但对我来说,这里的关键似乎是使用dump/3将约束转换回Prolog表达式,然后像任何其他结构一样遍历它。因此,通过这样做,我再次获得了约束:

代码语言:javascript
复制
?- relation(independents([var(x1,X1),var(x2,X2),var(x3,X3)]),
            dependent(var(y,Y))), 
   dump([X1,X2,X3,Y],[x1,x2,x3,y], [y=Eqn]).
Eqn = 3.0+0.5*x1+0.6*x2+0.7*x3

我认为值得记住的是,使用write_canonical在引擎盖下面是什么样子

代码语言:javascript
复制
+(+(+(3.0,*(0.5,x1)),*(0.6,x2)),*(0.7,x3))

遍历多项式时,您应该只包含几个简单的情况;实际上,下面的情况可能是过分的:

代码语言:javascript
复制
coefficient(X=Y, Var, Coeff) :-
    coefficient(X, Var, Coeff) ; coefficient(Y, Var, Coeff).
coefficient(X+Y, Var, Coeff) :-
    coefficient(X, Var, Coeff) ; coefficient(Y, Var, Coeff).
coefficient(X-Y, Var, Coeff) :-
    coefficient(X, Var, Coeff) ; coefficient(Y, Var, Coeff).
coefficient(X*Y, X, Y) :-
    atomic(X), atomic(Y).
coefficient(X*Y, Var, Coeff) :-
    coefficient(X, Var, Coeff) ; coefficient(Y, Var, Coeff).

您的基本大小写实际上是X*Y情况,其中它们都是原子的。其余的子句实际上只是为了展开嵌套。这似乎是你想做的事:

代码语言:javascript
复制
?- relation(independents([var(x1,X1),var(x2,X2),var(x3,X3)]),
            dependent(var(y,Y))), 
   dump([X1,X2,X3,Y],[x1,x2,x3,y], [y=Eqn]), 
   coefficient(Eqn, Var, Coeff).

Eqn = 3.0+0.5*x1+0.6*x2+0.7*x3,
Var = 0.5,
Coeff = x1,
{Y=3.0+0.5*X1+0.6*X2+0.7*X3} ;
Eqn = 3.0+0.5*x1+0.6*x2+0.7*x3,
Var = 0.6,
Coeff = x2,
{Y=3.0+0.5*X1+0.6*X2+0.7*X3} ;
Eqn = 3.0+0.5*x1+0.6*x2+0.7*x3,
Var = 0.7,
Coeff = x3,
{Y=3.0+0.5*X1+0.6*X2+0.7*X3} ;
false.

要真正概括这一点,您可能需要使用maplist et。阿尔。要将独立者/受抚养人列表转换为变量,需要传递给dump/3,然后处理结果中包含多个方程的情况,但我不认为这对您来说很有挑战性。

希望这能有所帮助!

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

https://stackoverflow.com/questions/54809516

复制
相关文章

相似问题

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