Пролог не оценивает скобки - PullRequest
2 голосов
/ 23 февраля 2020

Я пытаюсь упростить выражения в Прологе, но одна часть застряла. Я хочу, чтобы simplify(x*(4*x),R). перевелось в simplify(x*4*x,R)., тогда все остальное сработает со своими волхвами c. Но я не могу удалить парни. Вот код оценки ниже

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

1 Ответ

2 голосов
/ 23 февраля 2020

Круглые скобки используются для изменения толкования термина при наличии операторов. Обратите внимание, что для синтаксического анализатора 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
...