Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog中的干式算术表达式求值_Prolog_Refactoring_Dry_Arithmetic Expressions - Fatal编程技术网

Prolog中的干式算术表达式求值

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]仅指二进制运算符

我想在Prolog中为算术编写求值谓词,我发现:

这是伟大的,但不是很干燥

我还发现:

运算符与u匹配,参数与左和右匹配

所以我想到了这个:

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