小编use*_*588的帖子

解析 Prolog 中的表达式并返回抽象语法

我必须编写 parse(Tkns, T) ,它以标记列表的形式接受数学表达式并找到 T,并返回一个表示抽象语法的语句,尊重操作顺序和关联性。

例如,

?- parse( [ num(3), plus, num(2), star, num(1) ], T ).

T = add(integer(3), multiply(integer(2), integer(1))) ;
No
Run Code Online (Sandbox Code Playgroud)

我试图实现 + 和 * 如下

parse([num(X)], integer(X)).
parse(Tkns, T) :-
  (  append(E1, [plus|E2], Tkns),
     parse(E1, T1),
     parse(E2, T2),
     T = add(T1,T2)
  ;  append(E1, [star|E2], Tkns),
     parse(E1, T1),
     parse(E2, T2),
     T = multiply(T1,T2)
  ).
Run Code Online (Sandbox Code Playgroud)

哪个找到正确的答案,但也返回不遵循关联性或操作顺序的答案。

前任)

parse( [ num(3), plus, num(2), star, num(1) ], T ). 
Run Code Online (Sandbox Code Playgroud)

也返回

mult(add(integer(3), integer(2)), integer(1))
Run Code Online (Sandbox Code Playgroud)

parse([num(1), plus, num(2), plus, num(3)], T) …
Run Code Online (Sandbox Code Playgroud)

parsing prolog dcg failure-slice

4
推荐指数
2
解决办法
2106
查看次数

标签 统计

dcg ×1

failure-slice ×1

parsing ×1

prolog ×1