...collaborate on

Devemos nos restringir unicamente aos operadores Pointfree indicados no enunciado (não há o Either, por exemplo)?

Claro que não! Faltam todos os operadores das somas e dos exponenciais. Quanto mais provar melhor!!

No ponto 4 para a calculadora quantas expressões simplificadas são para devolver? É que tendo a função "reescreve" a devolver várias simplificações as hipóteses de aplicar novas regras vão aumentando progressivamente. Se é para devolver apenas uma simplificação qual devemos escolher?

Essa decisão fica ao vosso critério.

Na função "reescreve" pede para devolver todas as expressões possiveis resultantes da reescrita. A pergunta é: é necessário devolver expressões em que a substituião foi feita apenas num termo de nivel n? Isto é a substituição feita apenas dentro de um termo que por sua vez está dentro de outro e assim sucessivamente? Ou é necessário devolver apenas as substituições que fazem matching no primeiro nivel do termo?

Tem que devolver todas, independentemente do nível em que se encontrem na árvore. Por exemplo,

reescreve (Term Comp [Var ´f´, Term Id []], Var ´f´) (Term Comp [Term Comp [Term Fst [], (Term Comp [Term Snd [], Term Id []]], Term Id []])
deverá devolver a seguinte lista (não necessariamente na ordem apresentada). Note que existem duas subexpressões que fazem match com o lado esquerdo da regra.
[Term Comp [Term Fst [], (Term Comp [Term Snd [], Term Id []]], Term Comp [Term Comp [Term Fst [], Term Snd []], Term Id []]]

O enunciado faz referência à necessidade de definir a orientação em que vamos aplicar a equação.

Na practica, a que se refere essa orientação? Isso quer dizer que uma vez que assumimos que a orientação é sempre feita da

esquerda para a direita, a substituição vai ser sempre feita na equação (PF1,PF2)? Isto é, fazendo match com PF1, devolve sempre

PF2 (partindo do principio que as condicoes se verificam)?

Exactamente. Definir a orientação é decidir qual dos lados de uma equação vai ficar do lado esquerdo e qual vai ficar do lado direito.

Quanto às expressões genéricas, a noçao de subexpressão refere-se a todos os membros da lista de Expressões de cada termo? ou seja..

data Exp v c = Term c [SubExp v c] | Var v

data SubExp v c = Term c [SubExp v c] | Var v

e se assim é qual a vantagem da criaçao deste tipo? sendo que uma subexpressão é em si mesma uma expressão.

Na versão mais simplista uma subexpressão é efectivamente igual a uma expressão, ou seja,

type SubExp v c = Exp v c

Assumindo esta definição, a função que enumera as subexpressões deverá devolver para o exemplo

assocr :: Pointfree 
assocr = Term Split [Term Comp [Term Fst [], Term Fst []], Term Prod [Term Snd [], Term Id []]]
a seguinte lista de subexpressões (não necessariamente nesta ordem).
[Term Split [Term Comp [Term Fst [], Term Fst []], Term Prod [Term Snd [], Term Id []]], 
 Term Comp [Term Fst [], Term Fst []], Term Prod [Term Snd [], Term Id []], Term Fst [], Term Snd [], Term Id []]
Por vezes pode ser conveniente distinguir subexpressões iguais, mas que ocorrem em posições diferentes da expressão original, como é o caso da subexpressão Term Fst [] do exemplo acima. Quem desejar enveredar por esta alternativa deverá incluir no tipo das subexpressões uma indicação da posição ocupada pela subexpressão em causa. Essa posição deverá ser o caminho necessário para encontrar a subexpressão na expressão original.

Achei a explicaçao da função update um tanto confusa, é possivel dar um exemplo concreto de uma invocaçao e do resultado?

Vamos supor que uma substituição s (do tipo Subst Char PF) contém as seguintes associações entre variáveis e expressões (note que não estamos a assumir nenhuma impementação concreta para este tipo):

'x' --> Term Fst []
'y' --> Term Comp [Term Snd [], Term Fst []]

Se fizermos update s 'z' (Term Snd []) será devolvida uma nova substituição que para além das expressões associadas a 'x' e 'y' contém uma nova associação entre 'z' e Term Snd []. Se fizermos update s 'x' (Term Fst []) devolve a mesma substituição sem alterações. No entanto, se fizermos update s 'x' (Term Snd []) o update falha devolvendo Nothing pois 'x' já estava associado a uma expressão diferente.

Como colocar questões?

Faça login como TWikiGuest e coloque a sua questão no topo da página em bold. Logo que possível um dos docentes responderá às suas dúvidas.

r14 - 16 Dec 2005 - 17:52:15 - AlcinoCunha
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback
Syndicate this site RSSATOM