Expresión del prefijo Prolog
expression prefix (1)
Puedo obtener la suma de la expresión del prefijo, pero cada vez que agrego una lista dentro de una lista, el programa no se ejecuta.
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, []).
Esto funciona: calculate([+, 2, -, 9, 8], X]
pero calculate([+, 2, [-, 9, 8]], X]
da falso.
¿Qué necesito para que funcione la lista dentro de la lista?
muy simple:
...
expr(Z) --> [L], {calculate(L, Z)}.
calculate(L, M) :- expr(M, L, []).
rendimientos
?- calculate([+,2,-,9,8],X).
X = 3 ;
false.
2 ?- calculate([+,2,[-,9,8]],X).
X = 3 ;
false.
btw calculate / 3 debería expresarse mejor con la frase / 2 (al menos en SWI-Prolog)
calculate(L, M) :- phrase(expr(M), L).
pero surge un error al retroceder
?- 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
entonces necesitamos un guardia:
calculate(L, M) :- is_list(L), phrase(expr(M), L).