Avaliação da expressão aritmética DRY no Prolog

Eu queria escrever um predicado de avaliação no Prolog para aritmética e descobriesta:

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).

O que é ótimo, mas não muito seco.

Eu também encontreiesta:

:- 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

O operador aqui é correspondido com _ e os argumentos são correspondidos com Esquerda e Direita.

Então, eu vim com isso:

eval(Formula, Value) :-
    Formula =.. [Op, L, R], Value is Op(L,R).

Seria SECO como o inferno se funcionasse, mas dáSyntax error: Operator expected em vez de.

Existe uma maneira no Prolog de aplicar o operador aos argumentos nesse caso?

questionAnswers(1)

yourAnswerToTheQuestion