Prolog中的干式算术表达式求值
我想在Prolog中为算术编写求值谓词,我发现: 这是伟大的,但不是很干燥 我还发现: 运算符与u匹配,参数与左和右匹配 所以我想到了这个:Prolog中的干式算术表达式求值,prolog,refactoring,dry,arithmetic-expressions,Prolog,Refactoring,Dry,Arithmetic Expressions,我想在Prolog中为算术编写求值谓词,我发现: 这是伟大的,但不是很干燥 我还发现: 运算符与u匹配,参数与左和右匹配 所以我想到了这个: eval(Formula, Value) :- Formula =.. [Op, L, R], Value is Op(L,R). 如果它能工作的话,那就太枯燥了,但它会给出语法错误:应该是运算符 在这种情况下,Prolog中是否有方法将运算符应用于参数?由于以下几个原因,几乎干涸的解决方案不起作用: 公式=。。[Op,L,R]仅指二进制运算符
eval(Formula, Value) :-
Formula =.. [Op, L, R], Value is Op(L,R).
如果它能工作的话,那就太枯燥了,但它会给出语法错误:应该是运算符
在这种情况下,Prolog中是否有方法将运算符应用于参数?由于以下几个原因,几乎干涸的解决方案不起作用:
公式=。。[Op,L,R]
仅指二进制运算符。你当然也想参考数字
- 根本不考虑参数
L
和R
Op(L,R)
不是有效的Prolog语法
另一方面,您的尝试会为变量产生一个干净的实例化错误,而positive/1
将失败,并且eval/2
循环至少比失败要好
由于您的运算符实际上与(is)/2使用的运算符完全相同,因此您可能需要先检查,然后再重新使用(is)/2
eval2(E, R) :-
isexpr(E),
R is E.
isexpr(BinOp) :-
BinOp =.. [F,L,R],
admissibleop(F),
isexpr(L),
isexpr(R).
isexpr(N) :-
number(N).
admissibleop(*).
admissibleop(+).
% admissibleop(/).
admissibleop(-).
请注意,number/1
对于变量失败-这会导致许多错误的程序。一个安全的选择是
t_number(N) :-
functor(N,_,0),
number(N).
谢谢使用(is)/2完成所有工作的好主意。我还需要对其进行一些扩展以处理变量,但这应该不是问题:)
eval2(E, R) :-
isexpr(E),
R is E.
isexpr(BinOp) :-
BinOp =.. [F,L,R],
admissibleop(F),
isexpr(L),
isexpr(R).
isexpr(N) :-
number(N).
admissibleop(*).
admissibleop(+).
% admissibleop(/).
admissibleop(-).
t_number(N) :-
functor(N,_,0),
number(N).