MC346 - Prova Lisp

Criada: 2014-07-27
Modificada: 2015-01-07

Enunciado distribuído na sala.

Gabarito

Questão 1

Exista herança múltipla em Common Lisp. Herança múltipla é a possibilidade de definir classes que tenham mais de uma classe mãe.

Questão 2

  1. ((λx . (x(yx))(λy . z))) → ((λy . z)(y(λy . z))) → z
  2. ((λw . (ww))(λz . x)) → ((λz . x)(λz . x)) → x
  3. (λp . λq . ppq) (λz . λx . z)(λy . λx . x) → (λz . λx . z)(λz . λx . z) (λy . λx . x) → (λz . λx . z)

Questão 3

Variante com acumulador:

(defun separa (lista)
  (separa-acc lista () ())
  )

(defun separa-acc (lista pos nopos)
  (cond
   ((null lista) (list pos nopos))
   ((> (car lista) 0)
    (separa-acc (cdr lista) (cons (car lista) pos) nopos))
   (t
    (separa-acc (cdr lista) pos (cons (car lista) nopos)))
   )
  )

Variante sem acumulador:

(defun separa (lista)
  (if (null lista)
   (list () ())
   (let* ((res (separa (cdr lista)))
	  (pos (first res))
	  (nopos (second res)))
     (if (> (car lista) 0)
	 (list (cons (car lista) pos) nopos)
       (list pos (cons (car lista) nopos))
       )
     )
   )
  )

Questão 4

A solução a seguir é bem direta, usando a técnica de map-reduce, que tem recebido muita atenção ultimamente. Note que reduce não pode ser chamado com lista vazia, por isso foi necessário o if, e consequentemente o let, para evitar de chamar (pais x) duas vezes.

(defun ancestrais (x)
  (let ((p (pais x)))
    (if (null p)
	(list x)
      (cons x (reduce #'union (mapcar #'ancestrais p)))
      )
    )
  )

Questão 5

(defun perfeito (n)
  (and (> n 1)
       (= n (somadiv n))
       )
  )

(defun somadiv (n)
  (somadiv-ateh (1- n) n)
  )

(defun somadiv-ateh (k n)
  (cond
   ((<= k 0) 0)
   ((= 0 (mod n k)) (+ k (somadiv-ateh (1- k) n)))
   (t (somadiv-ateh (1- k) n))
   )
  )

Critérios de correção

Questão 1

Na Questão 1, que valia 0,5, a nota de cada aluna(o) foi 0,0 ou 0,5. Quem acertou e justificou apropriadamente ganhou 0,5. Os demais ficaram com 0,0. Ficou com 0,0 também quem disse que Lisp é uma linguagem orientada a objetos. Ficou com 0,0 quem não justificou nem explicou corretamente sua resposta.

Questão 2

Na Questão 2, os itens tiveram os seguintes valores:

Critérios adicionais para a Questão 2:

Questões 3, 4 e 5

Exceto pelas Questões 1 e 2, o critério de correção começou por decidir como seria a pontuação: de cima para baixo ou de baixo para cima. Se a resposta estava bem escrita, com sintaxe Lisp correta, resolução do problema pedido (e não de outro) e com comprimento proporcional à complexidade da questão, então a correção procedeu de cima para baixo, ou seja, parte-se do valor integral e vão sendo subtraidas frações de pontos para cada defeito encontrado.

Por outro lado, se a resposta estava mal escrita, com sintaxe errada, resolvendo o problema errado ou incompleta, então a correção procedeu de baixo para cima: parte-se de zero e vão sendo adicionadas frações de pontos a cada indício de conhecimento importante encontrado. Embora em geral a correção de cima para baixo resulte em notas maiores numa questão, é possível ter exceções a esta tendência.

Nas questões de escrita de código Lisp, os seguintes critérios foram universalmente aplicados. Os valores negativos se aplicam à correção de cima para baixo, e os valores positivos se aplicam à correção de baixo para cima.

A seguir, critérios específicos para cada questão. Novamente, os valores negativos se aplicam à correção de cima para baixo, e os valores positivos se aplicam à correção de baixo para cima.

Questão 3

Questão 4

Questão 5


MC346 Home

© 2014 João Meidanis