Evaluación de expresión aritmética DRY en Prolog
Quería escribir un predicado evaluador en Prolog para aritmética y encontréesta:
eval(A+B,CV):-eval(A,AV),eval(B,BV),CV is AV+BV.
eval(A-B,CV):-eval(A,AV),eval(B,BV),CV is AV-BV.
eval(A*B,CV):-eval(A,AV),eval(B,BV),CV is AV*BV.
eval(Num,Num):-number(Num).
Lo cual es genial pero no muy SECO.
También he encontradoesta:
:- op(100,fy,neg), op(200,yfx,and), op(300,yfx,or).
positive(Formula) :-
atom(Formula).
positive(Formula) :-
Formula =.. [_,Left,Right],
positive(Left),
positive(Right).
?- positive((p or q) and (q or r)).
Yes
?- positive(p and (neg q or r)).
No
El operador aquí se corresponde con _ y los argumentos se corresponden con Izquierda y Derecha.
Entonces se me ocurrió esto:
eval(Formula, Value) :-
Formula =.. [Op, L, R], Value is Op(L,R).
Sería SECO como el infierno si solo funcionara pero daSyntax error: Operator expected
en lugar.
¿Hay alguna manera en Prolog de aplicar operador a argumentos en tal caso?