2014-03-30 85 views
2

我能夠從前綴表達式中獲得總和,但每當我在列表中添加一個列表時,程序就不會運行。序言前綴表達式

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]提供虛假。

我需要什麼才能讓它在列表中工作?

回答

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. 

順便說一句計算/ 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).