Prolog用未知变量求解前缀算术表达式

时间:2013-11-11 21:38:45

标签: parsing prolog dcg arithmetic-expressions

我想在Prolog中创建一个算术求解器,它可以对数字> = 2进行+, - ,*,^运算。还应该有一个变量x。输入应该是列表中的前缀表达式。

我制作了一个程序,将前缀格式的算术表达式解析为语法树。那样:

?- parse([+,+,2,9,*,3,x],Tree).
Tree = plus(plus(num(2), num(9)), mul(num(3), var(x))) .

(1)在这个阶段,我想扩展这个程序,以便能够为给定的x值解决它。这应该通过添加另一个谓词 evaluate(树,值,解决方案)来完成,该谓词给出了未知x的值,计算解决方案。

示例:

?- parse([*, 2, ^, x, 3],Tree), evaluate(Ast, 2, Solution).
Tree = mul(num(2), pow(var(x), num(3))) ,
Solution = 16.

由于我缺乏Prolog技能,我不确定如何解决这个问题,但我需要一种方法将var(x)设置为num(2),就像在这个例子中一样(因为x = 2)。也许Prolog中的成员可用于执行此操作。然后我必须使用是/ 2

来解决它

修改:我试图解决它。获取错误:'未定义的过程:evaluate / 3但是,有以下定义:evaluate / 5 '

evaluate(plus(A,B),Value,Sol) --> evaluate(A,AV,Sol), evaluate(B,BV,Sol), Value is AV+BV.
evaluate(mul(A,B),Value,Sol) --> evaluate(A,AV,Sol), evaluate(B,BV,Sol), Value is AV*BV.
evaluate(pow(A,B),Value,Sol) --> evaluate(A,AV,Sol), evaluate(B,BV,Sol), Value is AV^BV.
evaluate(num(Num),Value,Sol) --> number(Num).
evaluate(var(x),Value,Sol) --> number(Value).

(2)我也希望能够以后缀形式表达它。具有谓词后缀(树,后缀列表)

示例:

?- parse([+, *, 2, x, ^, x, 5 ],Tree), postfix(Tree,Postfix).
Tree = plus(mul(num(2), var(x)), pow(var(x), num(5))) ,
Postfix = [2, x, *, x, 5, ^, +].

(1)(2)的任何帮助都将受到高度赞赏!

1 个答案:

答案 0 :(得分:1)

您不需要像这样使用语法。你应该使用正常的规则。

这是您需要遵循的模式。

evaluate(plus(A,B),Value,Sol) :- 
   evaluate(A, Value, A2),
   evaluate(B, Value, B2),
   Sol is A2+B2.

evaluate(num(X),_Value,Sol) :- Sol = X.
evaluate(var(x),Value,Sol) :- Sol = Value.