访问数值表达式中的系数 (clpr)
Accessing coefficients in a numerical expression (clpr)
我有一些子句,其中头部代表线性方程中一组变量的名称和值,主体代表实际方程。像这样:
:-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}.
有没有直接的方法(间接地)得到这个方程的系数? IE。 returns coefficient(VARNAME, COEFFICIENT)
的规则,例如coefficient(x1, 0.5), coefficient(x2, 0.6)
等等。
我知道这可能看起来像一个愚蠢的问题,因为将所有系数放在子句的开头很容易。但在我的应用程序中,我希望这些条款的头部严格显示每个变量的值(而不是它们的系数)。 IE。以避免歧义。
我目前的解决方案是一个复杂且不雅的解决方案,涉及 member/2
、subtract/3
、maplist/2
并将 X1、X2、X3 设置为 1 或 0 以计算出每个斜率。
相关问题:
谢谢!
/JC
这是我第一次使用 clpr
所以如果这对你没有帮助我恳求精神错乱,但对我来说,这里的关键似乎是使用 dump/3
将约束转换回Prolog 表达式,然后像任何其他结构一样遍历它。所以我通过这样做再次获得约束:
?- 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
:
记住它在幕后是什么样子是值得的
+(+(+(3.0,*(0.5,x1)),*(0.6,x2)),*(0.7,x3))
遍历多项式你应该只被几个简单的案例所涵盖;以下实际上可能有点矫枉过正:
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 情况,其中它们都是原子的。其余的子句实际上只是为了展开嵌套。这似乎可以满足您的要求:
?- 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
等。阿尔。将您的 independents/dependents 列表转换为您需要传递给 dump/3
的变量,然后处理结果中有多个方程式的情况,但我认为这对您来说不是很有挑战性.
希望对您有所帮助!
我有一些子句,其中头部代表线性方程中一组变量的名称和值,主体代表实际方程。像这样:
:-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}.
有没有直接的方法(间接地)得到这个方程的系数? IE。 returns coefficient(VARNAME, COEFFICIENT)
的规则,例如coefficient(x1, 0.5), coefficient(x2, 0.6)
等等。
我知道这可能看起来像一个愚蠢的问题,因为将所有系数放在子句的开头很容易。但在我的应用程序中,我希望这些条款的头部严格显示每个变量的值(而不是它们的系数)。 IE。以避免歧义。
我目前的解决方案是一个复杂且不雅的解决方案,涉及 member/2
、subtract/3
、maplist/2
并将 X1、X2、X3 设置为 1 或 0 以计算出每个斜率。
相关问题:
谢谢!
/JC
这是我第一次使用 clpr
所以如果这对你没有帮助我恳求精神错乱,但对我来说,这里的关键似乎是使用 dump/3
将约束转换回Prolog 表达式,然后像任何其他结构一样遍历它。所以我通过这样做再次获得约束:
?- 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
:
+(+(+(3.0,*(0.5,x1)),*(0.6,x2)),*(0.7,x3))
遍历多项式你应该只被几个简单的案例所涵盖;以下实际上可能有点矫枉过正:
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 情况,其中它们都是原子的。其余的子句实际上只是为了展开嵌套。这似乎可以满足您的要求:
?- 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
等。阿尔。将您的 independents/dependents 列表转换为您需要传递给 dump/3
的变量,然后处理结果中有多个方程式的情况,但我认为这对您来说不是很有挑战性.
希望对您有所帮助!