Prolog 序言前缀表达式

Prolog 序言前缀表达式,prolog,expression,prefix,evaluate,Prolog,Expression,Prefix,Evaluate,我可以从前缀表达式中获得总和,但每当我在列表中添加列表时,程序都不会运行 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, []). 这是有效的:计算([+,2,-,9,8],X]

我可以从前缀表达式中获得总和,但每当我在列表中添加列表时,程序都不会运行

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, []).
这是有效的:
计算([+,2,-,9,8],X]

但是
计算([+,2,[-,9,8]],X]
给出false

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

非常简单:

...
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.
顺便说一句,calculate/3最好用短语/2表示(至少在SWI Prolog中)

但回溯时会出现错误

?- 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).
calculate(L, M) :- is_list(L), phrase(expr(M), L).