【问题标题】:Prolog solving prefix arithmetic expression with unknown variableProlog求解具有未知变量的前缀算术表达式
【发布时间】:2013-11-23 20:26:24
【问题描述】:

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

我编写了一个程序,将前缀格式的算术表达式解析为语法树。所以:

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

(1) 在这个阶段,我想扩展这个程序,使其能够解决给定 x 值的问题。这应该通过添加另一个谓词 evaluate(Tree, Value, Solution) 来完成,该谓词给出未知 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 中的 member 可以用来做到这一点。然后我必须使用 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) 我也希望能够以后缀形式表达它。有一个谓词postfixform(Tree, Postfixlist)

例子:

?- 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) 的任何帮助!

【问题讨论】:

  • @false 是的,谢谢!我使用您的方法来实现第一部分,但我坚持使用 (1) 和 (2) 的方法。有什么想法吗?
  • 中间的部分不是很清楚。您是否允许多个变量?
  • @false 再次感谢。不,只有一个变量 x。所以在evaluate(Tree, Value, Solution)中,Value总是对应x的值。

标签: parsing prolog dcg arithmetic-expressions


【解决方案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.

【讨论】:

  • 非常感谢!我也尝试了正常的规则,但我输入了一个错字“值是……”而不是“索尔是……”现在它工作正常!
  • 当然!你能看看我的实现的其他问题吗? stackoverflow.com/questions/19959722/… 谢谢!
猜你喜欢
  • 2015-12-20
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 2014-05-23
  • 2013-09-12
  • 2023-03-20
  • 2015-10-27
  • 2016-09-04
相关资源
最近更新 更多