假设表达式中可以使用四个运算符,它们是+, - ,*和/。所有这些运算符都是二进制的,即它们以这种格式应用于表达式:[operator,operand1,operand2],其中“operator”可以是+, - ,*或/,每个操作数可以是单个数字,或另一种表达方式。例如,以下是所有合法输入:
[+, 1, 2]
[-, 6, [/, 7, 0.5]]
[*, [/, 78, [-, 67, 3.5]], [+, 4, 9.0]]
但以下不是:
[+, 1] ; missing operand
[6, -, 7] ; every expression must start with an operator
[/, +, 4, 5] ; every expression can only have one operator
[*, 6, 7, 8] ; every expression must have exactly two operands
[%, 6, 7] ; unrecognizable operator
[-, 6, A] ; illegal operator
编写一个名为“main”的谓词来检查表达式的有效性并评估表达式。以下应该是运行程序的方法:
main([+, 1, 2], X)
X = 3
main([-, 6, A], X)
error
输入[+, 1, 2]
和[-, 6, A]
的位置。如果输入是合法的,则程序应输出表达式求值的最终结果,如上例所示。如果输入是非法的,则结果是未定义的,即,您的程序假定输入是合法的
==============================
我尝试
expr(Z) --> num(Z).
expr(Z) --> [+], num(X), expr(Y), {Z is X+Y}.
expr(Z) --> [-], num(X), expr(Y), {Z is X-Y}.
expr(Z) --> [*], num(X), expr(Y), {Z is X*Y}.
expr(Z) --> [/], num(X), expr(Y), {Z is X/Y}.
num(D) --> [D], {number(D)}.
main(L, M) :- phrase(expr(M), L).
但是当我写main([-, 6, [+, 7, 0.5]], X). false.
时
当main([-, 6, A], X).
时
什么都不做
请帮助
答案 0 :(得分:2)
嵌套表达式:我回答here这个问题的解决方案,请阅读。
添加处理嵌套列表所需的规则后,您需要为错误处理添加一整套规则,检查错误输入。
请注意,正确的错误处理可能是解析时的难以主题。例如,在Prolog中,您无法随时访问“输入位置”,然后生成有意义的错误消息可能会非常棘手。但对于您的情况,只需尝试输出相应的消息。例如,添加像
这样的规则expr(_) --> ['%'], num(_), expr(_), { write('unrecognizable operator'), nl}.
(因为%
引入了评论,你需要引用它,至少在大多数情况下 - 所有? - Prologs)
您需要尝试找到编写添加规则的正确位置。主要是把它们放在你已经拥有的东西之后,但要把它们放在一起。