2018-11-25 22:55:00 +00:00
|
|
|
# O que é isto?
|
2018-11-25 23:01:51 +00:00
|
|
|
Este documento pretende tornar mais claro o funcionamento do polymani.pl.
|
|
|
|
Para isso explicamos brevemente a estrutura e realçamos algumas
|
|
|
|
particularidades de alguns predicados que de outro modo poderiam parecer
|
|
|
|
"abstratos".
|
2018-11-25 22:55:00 +00:00
|
|
|
|
2018-11-25 22:59:03 +00:00
|
|
|
## Algumas palavras sobre a estrutura e o frontend
|
2018-11-25 23:01:51 +00:00
|
|
|
O polymani divide-se em frontend e backend. O backend tem todos os predicados
|
|
|
|
usados para interação conforme especificado no assignment1.pdf.
|
2018-11-25 22:55:00 +00:00
|
|
|
|
2018-11-25 23:01:51 +00:00
|
|
|
Por outro lado, para que uma melhor experiência de utilização fosse possível,
|
|
|
|
tomamos a liberdade de implementar dois predicados auxiliares que, para inputs
|
|
|
|
inválidos, disponibilizam uma explicação mais amigável do erro.
|
2018-11-25 22:55:00 +00:00
|
|
|
|
2018-11-25 22:59:03 +00:00
|
|
|
## Backend
|
2018-11-25 22:55:00 +00:00
|
|
|
Abaixo descrevem-se alguns predicados selecionados com vista a tornar a
|
2018-11-25 23:01:51 +00:00
|
|
|
compreensão dos mesmos mais rápida e simples destacando-se algumas
|
|
|
|
particularidades que poderiam não ser evidentes numa primeira leitura.
|
2018-11-25 22:55:00 +00:00
|
|
|
|
2018-11-25 22:59:03 +00:00
|
|
|
### power
|
2018-11-25 22:55:00 +00:00
|
|
|
As comparações CLPFD permitiram-nos comparar se uma determinada variavel
|
|
|
|
pertencia um determinado domínio sem para isso termos de sacrificar a
|
|
|
|
reversibilidade das variáveis. CLPFD stands for Constraint Logic Programming
|
|
|
|
over Finite Domains.
|
|
|
|
|
2018-11-25 22:59:03 +00:00
|
|
|
### term
|
2018-11-25 23:18:48 +00:00
|
|
|
Um termo é um produto de monómios.
|
2018-11-25 22:55:00 +00:00
|
|
|
Este é um elemento fundamental deste programa tendo sido extensivamente testado.
|
|
|
|
|
|
|
|
O primeiro predicado valida números reais definidos.
|
|
|
|
|
2018-11-25 23:18:48 +00:00
|
|
|
O segundo predicado valida números indefinidos, usando a CLPR. A verificação de que
|
2018-11-25 22:55:00 +00:00
|
|
|
N não é um compound é necessária para assegurar que N não é uma potencia (estas
|
2018-11-25 23:18:48 +00:00
|
|
|
são tratadas pelo terceiro e quarto predicado).
|
2018-11-25 22:55:00 +00:00
|
|
|
|
|
|
|
O quinto predicado faz chamadas recursivas para validar uma multiplicação de
|
|
|
|
monómios.
|
|
|
|
|
2018-11-25 22:59:03 +00:00
|
|
|
### simplify_term
|
2018-11-25 22:55:00 +00:00
|
|
|
Começamos por convert um termo numa list de monómios.
|
|
|
|
|
|
|
|
Ordenamos os monómios do por ordem crescente (isto é, de menor grau para maior
|
|
|
|
grau).
|
|
|
|
|
|
|
|
Se existir um zero na lista (um dos monómios é zero), sabemos que a qualquer
|
2018-11-25 23:18:48 +00:00
|
|
|
coisa a multiplicar por zero (recorde-se a definição de termo) é zero. Assim
|
2018-11-25 22:55:00 +00:00
|
|
|
unificamos Term_Out com zero e terminamos a rotina com um green cut.
|
|
|
|
|
|
|
|
Se não,
|
2018-11-25 23:01:51 +00:00
|
|
|
se existir apenas um elemento na lista, esta já se encontra simplificada;
|
|
|
|
se não, aplicamos as seguintes regras de simplificação:
|
2018-11-25 23:18:48 +00:00
|
|
|
eliminar todos os monómios que têm a constante 1,
|
2018-11-25 23:01:51 +00:00
|
|
|
juntar monómios semelhantes (com a mesma variável)
|
2018-11-25 22:55:00 +00:00
|
|
|
|