Prolog 不计算括号
Prolog does not evalutate parenthesis
我正在尝试在 Prolog 中做一个表达式简化器,但有一部分让我卡住了。
我想要发生的是 simplify(x*(4*x),R).
评估为 simplify(x*4*x,R).
然后其余的将发挥其魔力。但我似乎无法删除 parens。下面是评估代码
simplify(x,x).
simplify(C*x,C*x) :- atomic(C),number(C),C\==1,C\==0.
simplify(x*C*x,W):- atomic(C),number(C), simplify(C*x^2,W).
simplify(C*x^N,C*W) :- atomic(C),number(C),atomic(N),number(N), simplify(x^N,W).
simplify(x^1,x).
simplify(x^N,x^N) :- atomic(N),number(N),N \== 1.
simplify(U*(V),R2):- simplify(U,U1),simplify(V,V1),simplify(U1*V1,R2).%why will it not return a paren less output
simplify(U*V,R2):- simplify(U,U1),simplify(V,V1),simplify(U1*V1,R2).
括号用于在存在运算符的情况下更改术语解释。请注意,对于 Prolog 解析器,simplify(U*(V),R2)
和 simplify(U*V,R2)
:
之间没有区别
| ?- write_canonical(simplify(U*(V),R2)).
simplify(*(_279,_280),_284)
yes
| ?- write_canonical(simplify(U*V,R2)).
simplify(*(_279,_280),_284)
yes
因此,最后两个子句具有相同的中心词; U*(V)
项中只有一个运算符。
现在考虑目标 simplify(x*(4*x),R)
。 (*)/2
的运算符定义为:
| ?- current_op(Priority, Type, *).
Priority = 400
Type = yfx
yes
即运算符是 左结合 。这意味着例如a*b*c
被解析为 *(*(a,b),c)
。因此:
| ?- write_canonical(simplify(x*(4*x),R)).
simplify(*(x,*(4,x)),_285)
yes
| ?- write_canonical(simplify(x*4*x,R)).
simplify(*(*(x,4),x),_285)
yes
我正在尝试在 Prolog 中做一个表达式简化器,但有一部分让我卡住了。
我想要发生的是 simplify(x*(4*x),R).
评估为 simplify(x*4*x,R).
然后其余的将发挥其魔力。但我似乎无法删除 parens。下面是评估代码
simplify(x,x).
simplify(C*x,C*x) :- atomic(C),number(C),C\==1,C\==0.
simplify(x*C*x,W):- atomic(C),number(C), simplify(C*x^2,W).
simplify(C*x^N,C*W) :- atomic(C),number(C),atomic(N),number(N), simplify(x^N,W).
simplify(x^1,x).
simplify(x^N,x^N) :- atomic(N),number(N),N \== 1.
simplify(U*(V),R2):- simplify(U,U1),simplify(V,V1),simplify(U1*V1,R2).%why will it not return a paren less output
simplify(U*V,R2):- simplify(U,U1),simplify(V,V1),simplify(U1*V1,R2).
括号用于在存在运算符的情况下更改术语解释。请注意,对于 Prolog 解析器,simplify(U*(V),R2)
和 simplify(U*V,R2)
:
| ?- write_canonical(simplify(U*(V),R2)).
simplify(*(_279,_280),_284)
yes
| ?- write_canonical(simplify(U*V,R2)).
simplify(*(_279,_280),_284)
yes
因此,最后两个子句具有相同的中心词; U*(V)
项中只有一个运算符。
现在考虑目标 simplify(x*(4*x),R)
。 (*)/2
的运算符定义为:
| ?- current_op(Priority, Type, *).
Priority = 400
Type = yfx
yes
即运算符是 左结合 。这意味着例如a*b*c
被解析为 *(*(a,b),c)
。因此:
| ?- write_canonical(simplify(x*(4*x),R)).
simplify(*(x,*(4,x)),_285)
yes
| ?- write_canonical(simplify(x*4*x,R)).
simplify(*(*(x,4),x),_285)
yes