【问题标题】:prefix arithmetic expressions represented as listsin prolog在序言中表示为列表的前缀算术表达式
【发布时间】:2014-04-04 01:38:31
【问题描述】:

假设表达式中可以使用四个运算符,它们是 +、-、* 和 /。所有这些运算符都是二进制的,即,它们以以下格式应用于表达式:[operator,operand1,operand2],其中“运算符”可以是 +、-、* 或 /,每个操作数可以是单个数字,或其他表达式。例如,以下都是合法输入:

[+, 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). 什么都不做

请帮忙

【问题讨论】:

    标签: prolog


    【解决方案1】:

    嵌套表达式:我回答了here一个解决此类问题的方法,请阅读。

    添加处理嵌套列表所需的规则后,您需要为错误处理添加一整套规则,检查格式错误的输入。

    请注意,正确的错误处理可能是解析中的一个困难主题。例如,在 Prolog 中,您无法随时访问“输入位置”,然后生成有意义的错误消息可能会很棘手。但对于您的情况,只需尝试输出适当的消息。例如,添加如下规则

    expr(_) --> ['%'], num(_), expr(_), { write('unrecognizable operator'), nl}.
    

    (由于% 引入了 cmets,您需要引用它,至少在大多数 - 所有? - Prologs)

    您需要尝试找到编写添加规则的正确位置。主要是把它们放在你已经拥有的东西之后,但要把它们放在一起。

    【讨论】:

      猜你喜欢
      • 2016-09-04
      • 1970-01-01
      • 2013-09-04
      • 2011-01-25
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多