序言并没有消除括号

问题描述 投票:2回答:1

我试图在Prolog中简化表达式,但是有一部分使我陷入困境。我想发生的是将simplify(x*(4*x),R).评估为simplify(x*4*x,R).,然后其余的将发挥作用。但我似乎无法删除原谅。这是下面的评估代码

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
1个回答
1
投票

括号用于在操作员在场的情况下更改术语解释。注意,对于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

即运算符是left-associative。这意味着例如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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.