para os "nerds" da programação

paio pires

Banido
olaré

epah, tenho um projecto para a cadeira de inteligencia artificial em Lisp, que basicamente consiste em criar um função que simplifique expressões algébricas eliminando os elementos neutros e assim....por exemplo recebendo,

(((5+ 0)*1)^1)/1

deve devolver apenas 5

atenção que não é fazer o calculo, é apenas simplificar a expressão...

agora, ignorando a linguagem em que vou ter que trabalhar, como é que poderei resolver este problema; qual a melhor forma de abordar; que tipo de progaramação usar?

thks!
 
Uma maneira, deixa cá pensar,

era por exemplo, conseguires pegar na expressao como deve ser,

p.e. usando essa

((((5+ 0)*1)^1)/1)^2

e construias ao lado uma nova

inicialmente com 5

depois vias a operação seguinte: 5 + 0 = 5 ? então esquece o zero

depois multiplicava por 1 = 5 ? então ignora o 1

(...)

^2 = 25 != 5, acrescenta o ^2

devolve 5^2

Agora em List... (defun naosei (conta) (newconta)) [:p]
 
Uma maneira, deixa cá pensar,

era por exemplo, conseguires pegar na expressao como deve ser,

p.e. usando essa

((((5+ 0)*1)^1)/1)^2

e construias ao lado uma nova

inicialmente com 5

depois vias a operação seguinte: 5 + 0 = 5 ? então esquece o zero

depois multiplicava por 1 = 5 ? então ignora o 1

(...)

^2 = 25 != 5, acrescenta o ^2

devolve 5^2

Agora em List... (defun naosei (conta) (newconta)) [:p]
hmmm....parece uma boa ideia.:p

mas como é que eu corro a expressão original?

uso um while com "ifs" lá dentro?.....ou tens uma ideia melhor :p?
 
Isso agora, uma maneira eficiente de fazeres isso é que não sei, alem que tenho o Lisp muito enferrujado e já nem me recordo de como aceder a campos de parâmetros, e dado a minha aversão natural a lisp/scheme nem vou fazer um esforço, só aquela notação prefixa [:vm)]:sh)

tens de ter atenção ao pormenor de expressões dentro de expressões.


((((5+ 0)*1)^1)/(0 + 2))^2

ou mesmo:

((((5+ 0)*1)^1)/(0 + 1 + 1))^2
aquele 0 , o zero tem de desaparecer, desta maneira, tens mesmo de separar todas as expressões, analisares à parte, e só depois juntares.

Boa sorte com isso
 
Isso agora, uma maneira eficiente de fazeres isso é que não sei, alem que tenho o Lisp muito enferrujado e já nem me recordo de como aceder a campos de parâmetros, e dado a minha aversão natural a lisp/scheme nem vou fazer um esforço, só aquela notação prefixa [:vm)]:sh)

tens de ter atenção ao pormenor de expressões dentro de expressões.


((((5+ 0)*1)^1)/(0 + 2))^2

ou mesmo:

((((5+ 0)*1)^1)/(0 + 1 + 1))^2
aquele 0 , o zero tem de desaparecer, desta maneira, tens mesmo de separar todas as expressões, analisares à parte, e só depois juntares.

Boa sorte com isso
lol
eu ate axo piado à notação prefixa....mas ao inicio é atrofiante

a sorte é que ainda tenho um es para fazer isso...

thanks!
 
pah, se tens uma soma ou subtracção com o 0 é ignorar.

se tens uma multiplicaçao ou divisao com o 1 é para ignorar...

se tens um exponencial de 1 é para ignorar...
 
e isto é muito facil de fazer, fazes um ciclo com estas 3 funções, onde verificas se o mais é conjugado com o 0, se o * é conjugado com o 1 e assim sucessivamente.
 
Assim de repente, e se começares por analisar a função da direita para a esquerda, analisando o último elemento de cálculo.

(((5+ 0)*1)^1)/1

Tipo:

/1 -->anula-se a divisão
^1 --> anula-se o elevado
*1-->anula-se a multiplicação
+0 --> anula-se a soma

Não sei se será a melhor solução, mas assim de repente foi o que me lembrei.
 
e isto é muito facil de fazer, fazes um ciclo com estas 3 funções, onde verificas se o mais é conjugado com o 0, se o * é conjugado com o 1 e assim sucessivamente.

sim , mas como é que eu exprimo isso?

qq do genero:

while( a expressão não acaba)
if( ??????)


o que é que meto dentro do if, para que ele verfique que há uma soma com zero, ou uma multiplicação por 1, por exemplo?

isso é que eu não estou a ver como se faz:(
 
A expressão já existe ou é introduzida pelo utilizador?
Se já existe talvez por sistema de array e vectores , se for dada pelo utilizador surgeria talvez um scanf isto em c ;) alguma expressao que vá snifando os parametros de entrada. Se disse parvoice desculpaideme :)
 
A expressão já existe ou é introduzida pelo utilizador?
Se já existe talvez por sistema de array e vectores , se for dada pelo utilizador surgeria talvez um scanf isto em c ;) alguma expressao que vá snifando os parametros de entrada. Se disse parvoice desculpaideme :)
a expressão é introduzida pelo utilizador

pois, a ideia é percorrer a expressão toda em busca de somas, divisões, multiplicações, etc, e ver se estas operações são realizadas com elementos neutros ( zeros ou 1s)...., e se for retirar estas expressões....
 
para veres como se faz, tenho de saber em que tipo de dados estao armazenadas as operaçoes que queres suprimir...

tipo, as contas para analise estao num array?
 
sendo introduzidas pelo utilizador, penso que sao armazenadas num array.

se assim é nada mais simples, comparas cada elemento do array com as operações e depois verificas se essas mesmo sao realizadas com elementos "neutros" para a operação em questao (o na soma, 1 na multiplicação.. etc), depois nesse array deixas so o que restou da operaçao.

tem em atenção que tens de ter um array dinamico
 
Antes disso é necessário implementar a separação da expressão em operações básicas para um array e depois seguir o raciocinio do Joao_Ben
 
Procura, para cada operação, qual o elemento neutro e o elemento absorvente (caso exista). Por exemplo, 0 é elemento absorvente na multiplicação ou como base numa potência. 0 como expoente é tb elemento absorvente (o resultado é 1). Podes até detectar erros como divisões por zero ou 0^0.

Fazes isto sempre em ciclo, guardando sempre a expressão tal como ela está no início do novo ciclo. Quando a expressão final for igual à inicial (o ciclo n produziu alteração) o ciclo termina.
 
Voltar
Superior