【问题标题】:Prolog Prefix ExpressionProlog 前缀表达式
【发布时间】:2014-03-30 04:41:21
【问题描述】:

我能够从前缀表达式中得到总和,但是每当我在列表中添加一个列表时,程序就不会运行。

expr(Z) --> num(Z).
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)}.

calculate(L, M) :- expr(M, L, []).

这可行:calculate([+, 2, -, 9, 8], X]

calculate([+, 2, [-, 9, 8]], X] 给出错误。

我需要什么才能让它在列表中工作?

【问题讨论】:

    标签: prolog expression prefix evaluate


    【解决方案1】:

    很简单:

    ...
    expr(Z) --> [L], {calculate(L, Z)}.
    calculate(L, M) :- expr(M, L, []).
    

    产量

    ?- calculate([+,2,-,9,8],X).
    X = 3 ;
    false.
    
    2 ?- calculate([+,2,[-,9,8]],X).
    X = 3 ;
    false.
    

    btw calculate/3 最好用短语/2 表示(至少在 SWI-Prolog 中)

    calculate(L, M) :- phrase(expr(M), L).
    

    但是回溯时出现错误

    ?- calculate([+,2,[-,9,8]],X).
    X = 3 ;
    ERROR: Type error: `list' expected, found `8' (an integer)
       Exception: (14) expr(_G2432, [-, 9, 8], []) ? aabort
    % Execution Aborted
    

    那么我们需要一个守卫:

    calculate(L, M) :- is_list(L), phrase(expr(M), L).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-23
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      相关资源
      最近更新 更多