MC600 - Segundo semestre de 2003 - LISTA 1 ------------------------------------------ 1. Desenhe a representacao grafica das seguintes S-expressoes: a. ( (A . B) . (C . NIL) ) b. (A . (B . (C . D))) c. ((((A . B) . C) . D) . NIL) Solução: 1a ((A . B) . (C . NIL)) +---+---+ | | | --+-----+ +-+-+---+ | | | +---V---+ +---V---+ | A | B | | C |NIL| +---+---+ +---+---+ 1b (A . (B . (C . D))) +---+---+ +---+---+ +---+---+ | A | --+-->| B | --+-->| C | D | +---+---+ +---+---+ +---+---+ 1c ((((A . B) . C) . D) . NIL) +---+---+ | | |NIL| +-+-+---+ | +---V---+ | | | D | +-+-+---+ | +---V---+ | | | C | +-+-+---+ | +---V---+ | A | B | +---+---+ 2. Escreva a representacao textual das seguintes S-expressoes: a. _______ _______ _______ | | | | | | | | /| | | | ------> | | | ------> | | | / | | | | | | | | | | | |/ | -|----- -|----- -|----- | | | | | | V V V _______ | | /| B C | | | / | | | |/ | -|----- | | V A b. _______ _______ _______ | | | | | | | | /| | | | ------> | | | ------> | | | / | | | | | | | | | | | |/ | -|----- -|----- -|----- | | | | | | V V V _______ B C | | /| | | | / | | | |/ | -|----- | | V A Solução: a. ((A . NIL) . (B . (C . NIL))) ou ((A) B C) b. (B . (C . ((A . NIL) . NIL))) ou (B C (A)) 3. Diga quais das S-expressoes mencionadas nas questoes anteriores sao listas. Solução: 1.a) Não é lista (Houve duvidas neste item) 1.b) Não é lista 1.c) Não é lista 2.a) É lista 2.b) É lista 4. Descreva o que acontece quando as expressoes abaixo sao avaliadas: a. (+ (- 5 1) (+ 3 7)) b. (list 1 (+ 2 3)) c. (if (listp 1) (+ 1 2) (+ 3 4)) d. (list (and (listp 3) t) (+ 1 2)) Solução: a. (+ (- 5 1) (+ 3 7)) > 14 b. (list 1 (+ 2 3)) > (1 5) c. (if (listp 1) (+ 1 2) (+ 3 4)) > 7 d. (list (and (listp 3) t) (+ 1 2)) > (nil 3) 5. De tres expressoes "cons" distintas que retornam (a b c). Solução: (cons 'a '(b c)) (cons 'a (cons 'b '(c)) (cons 'a (cons 'b (cons 'c NIL))) 6. Usando "car" e "cdr", defina uma funcao que retorna o quarto elemento de uma lista. RESPOSTA: (defun quarto(x) (car (cdr (cdr (cdr x) ) ) ) ) 7. Defina uma funcao que receba dois argumentos e retorne o maior dos dois. Solução: (defun retornaMaiorElem (arg1 arg2) ( if ( > arg1 arg2) arg1 arg2 ) )