我想在 Prolog 中制作一个算术求解器,它可以对 >= 2 的数字进行 +、-、*、^ 运算。其中也应该可以有一个变量 x。输入应该是列表中的前缀表达式。
我制作了一个程序,将前缀格式的算术表达式解析为语法树。以便:
?- parse([+,+,2,9,*,3,x],Tree).
Tree = plus(plus(num(2), num(9)), mul(num(3), var(x))) .
(1)在这个阶段,我想扩展这个程序,使其能够解决给定的 x 值。这应该通过添加另一个谓词评估(树,值,解决方案)来完成,该谓词给出未知 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 中的成员可以用来执行此操作。然后我必须使用也许is/2来解决它
编辑:我尝试解决它。得到错误:'未定义的过程:评估/ 3但是,有定义:评估/ 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)的任何帮助将不胜感激!