如何在prolog中进行算术表达式求值?

如何在prolog中进行算术表达式求值?,prolog,arithmetic-expressions,clpfd,Prolog,Arithmetic Expressions,Clpfd,我正在尝试用prolog(实现-EclipseProlog)解决一个算术表达式。要求解的算术表达式如下所示: A * (C + B * X) + D * X = E X是要计算的值,所有其他(A、B、C、D、E)都是数字 例如:5*(3+2*X)+2*X=39,在计算时应为X赋值2 将输入Prolog的查询(目标)将采用以下形式: ?- compute( 5*(3+2*X)+2*X = 39, Result). “结果”和“X”的值应绑定(分配)在一起。 如何编写prolog程序来实现这一点

我正在尝试用prolog(实现-EclipseProlog)解决一个算术表达式。要求解的算术表达式如下所示:

A * (C + B * X) + D * X = E
X是要计算的值,所有其他(A、B、C、D、E)都是数字

例如:5*(3+2*X)+2*X=39,在计算时应为X赋值2

将输入Prolog的查询(目标)将采用以下形式:

?- compute( 5*(3+2*X)+2*X = 39, Result).
“结果”和“X”的值应绑定(分配)在一起。 如何编写prolog程序来实现这一点


谢谢。

我假设您使用的是
fd
,而不是
ic
。它简化了一些事情

:-lib(fd).
进一步假设只有方程而没有不等式,只有一个变量X,那么可以分两步进行:

compute(L=R, X) :-
  term_variables(L, [X]),
  L #= R.
首先,从左侧提取变量,然后发布一个用于计算公式的约束。如果等式有效,这将实例化变量

编辑


使用
ic
库,使用
eval(L)#=R

谢谢你的代码片段,我测试了它,它成功了。然而,我对prolog还不熟悉,无法理解X是如何计算值的。我假设#=是一个延迟约束。你能告诉我如何计算这个解吗?谢谢。是的,
#=/2
表示整数约束。请参阅ECLiPSe的约束库手册中的第3.1节,其中解释了ic解算器。内部发生的事情是,当发布约束时,约束的传播算法开始。这将更新附加到约束的变量的域,以使它们一致。在这种情况下,这足以得到解决方案。Marriott/Stuckey的“带约束的编程”是一本很好的教科书,Apt/Wallace的“使用Eclipse的约束逻辑编程”也是一本很好的教科书。感谢这个方向,它真的很有帮助!非常感谢。