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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta