Prolog 不计算括号

标签 prolog simplify

我正在尝试在 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(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 不计算括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60357526/

相关文章:

prolog - 使用 "or"运算符和使用多个子句之间有什么区别吗?

prolog - 变量及其在序言中的设置和使用方式

prolog - 计算列表中参数的排名

javascript - 简化我的 jQuery 代码,它变得越来越庞大和冗余

python - sympy : resolving Euler's Identity 中的复数

PHP 后期静态绑定(bind)引用

prolog - SWI-Prolog 检查不同列表中的两个元素是否位于同一位置

prolog - 在 Prolog 中实现一个简单的 C 语言?

sql - Oracle SQL : Simplifying my seemingly-horrendous subquery collection

javascript - 如何简化这个js?