2012-02-09 82 views
1

我想解决一个算术表达式在prolog(实现 - eclipse prolog)。要解决的算术表达式是这样的:如何在序言中进行算术表达式评估?

A * (C + B * X) + D * X = E 

X是要被计算的值,和所有其他(A,B,C,d,E)是所有数字。

例如:5×(3 + 2 * X)+ 2 * X = 39,在计算应与值2

查询(目标)将被输入到分配的Prolog X将采取形式:

?- compute(5*(3+2*X)+2*X = 39, Result). 

'结果'和'X'的值应该绑定(分配)在一起。 如何编写prolog程序来做到这一点..?

谢谢。

回答

4

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

:-lib(fd). 

进一步假设你只有方程,而不是不平等,只有一个变量X,那么你可以做的两个步骤:

compute(L=R, X) :- 
    term_variables(L, [X]), 
    L #= R. 

首先,从左侧提取变量,然后发布一个计算公式的约束。如果方程是有效的,这将实例化你的变量。

编辑

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

+0

感谢您的摘录,我测试过它的工作。然而,我对序言很陌生,无法理解X如何计算价值。我假设#=是一个延迟约束。你能指导我解决计算方法吗?谢谢。 – kallakafar 2012-02-09 10:48:09

+1

是的,'#=/2'表示一个整数约束。参见ECLiPSe的约束库手册中的3.1节,它解释了ic解算器。里面发生的事情是约束传递算法在约束被发布时开始。这将更新连接到约束的变量的域,以使它们一致。在这种情况下,这足以获得解决方案。 Marriott/Stuckey的“用约束编程”是一本很好的教科书,就像Apt/Wallace的“使用Eclipse进行约束逻辑编程”一样。 – twinterer 2012-02-09 11:33:02

+0

感谢这个方向,它确实有帮助!谢谢。 – kallakafar 2012-02-09 15:56:16