我必须编写 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)