相关疑难解决方法(0)

在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.
Run Code Online (Sandbox Code Playgroud)

这种方法有没有更简单的替代方案?我是否必须为我计划添加到程序中的每个操作员定义这4个案例?

prolog expression-trees dcg

3
推荐指数
2
解决办法
2219
查看次数

Prolog DCG:匹配链上的不同符号

我试图匹配一些句子(例如001 [0,0,1],(1 +(1/0))['(',1,+,'(',1,/,0,')' ,')'], 等等.

我已经让自己跟随小型DCG了.

g3 --> s3.
s3 --> e3.

e3 --> eAdd.
e3 --> eMin.
e3 --> eMul.
e3 --> eDiv.
e3 --> n3.

eAdd --> ['('],e3,['+'],e3,[')'].
eMin --> ['('],e3,['-'],e3,[')'].
eMul --> ['('],e3,['*'],e3,[')'].
eDiv --> ['('],e3,['/'],e3,[')'].


n3 --> d3.
n3 --> n3,d3.
d3 --> [0].
d3 --> [1].
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,它与使用 - ,*或/的句子不匹配,但它仅适用于使用+的递归句子.

例如:

phrase(g3,['(',1,'+','(',1,'+',1,')',')']).
Run Code Online (Sandbox Code Playgroud)

会工作,但是

phrase(g3,['(',1,'+','(',1,'/',1,')',')']).
Run Code Online (Sandbox Code Playgroud)

不行.

任何帮助将不胜感激,谢谢!

recursion prolog left-recursion dcg failure-slice

3
推荐指数
1
解决办法
108
查看次数