【发布时间】:2014-07-14 07:49:39
【问题描述】:
我想在 Prolog 中为算术编写评估谓词,我发现 this:
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).
这很棒,但不是很干。
我也找到了this:
:- 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
这里的运算符与_匹配,参数与Left和Right匹配。
所以我想出了这个:
eval(Formula, Value) :-
Formula =.. [Op, L, R], Value is Op(L,R).
如果它只工作但它会提供Syntax error: Operator expected,那将是地狱般的干燥。
在这种情况下,Prolog 中有没有办法将运算符应用于参数?
【问题讨论】:
标签: prolog refactoring dry arithmetic-expressions