在 Prolog 中构建表达式树
我正在寻找一种在 Prolog 中构建表达式树的方法。我已经做了一些实验并提出了以下工作代码(仅处理常量和加号表达式):
const(_).
plus(_, _).
eval(const(R), R).
eval(plus(A, B), R) :- number(A), number(B), R is A+B.
eval(plus(A, B), R) :- number(A), eval(B, B_R), R is A+B_R.
eval(plus(A, B), R) :- eval(A, A_R), number(B), R is A_R+B.
eval(plus(A, B), R) :- eval(A, A_R), eval(B, B_R), R is A_R+B_R.
这种方法有没有更简单的替代方法?我是否必须为计划添加到程序中的每一个运算符定义这 4 种情况?
I'm looking for a way to build an Expression Tree in Prolog. I already did some experiments and came up with the following working code (that will only handle constants and the plus expression):
const(_).
plus(_, _).
eval(const(R), R).
eval(plus(A, B), R) :- number(A), number(B), R is A+B.
eval(plus(A, B), R) :- number(A), eval(B, B_R), R is A+B_R.
eval(plus(A, B), R) :- eval(A, A_R), number(B), R is A_R+B.
eval(plus(A, B), R) :- eval(A, A_R), eval(B, B_R), R is A_R+B_R.
Is there any simpler alternative to this approach? Will I have to define these 4 cases for each one of the operators I plan on adding to my program?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
请参阅此处的另一个模式,利用 DCG 和(一种)惰性求值:
使用语法对数据结构进行建模,这是 Prolog 中非常有用的技术。使用的语法是 PEG 的实现。 SWI-Prolog 的依赖性非常有限,只有 number//1。
See here another schema, exploiting DCG and (a kind of) lazy evaluation:
Using grammars to model data structures it's a very useful technique in Prolog. The grammar used it's an implementation of PEGs. Dependency from SWI-Prolog it's very limited, just number//1.
我认为这应该可以做到,尽管我不熟悉构造
pred1(pred2(...)...) :- ...
(我的 Prolog 非常生锈)。I think this should do it, though I'm not familiar with the construct
pred1(pred2(...)...) :- ...
(my Prolog is very rusty).