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?