MC600 - Segundo semestre de 2003 - LISTA 5 ------------------------------------------ Defina funções LISP que resolvam os seguintes problemas. Para muitos deles já existem funções pré-definidas que fazem o serviço. Neste caso, o nome da função pré-definida é dado entre parêntesis. (As funções a seguir se referem a operações entre conjuntos, sendo os conjuntos representados por listas). 1. Verifique se um elemento está numa lista (member). Resposta: (defun my_member (x lst) (if (null lst) nil (if (equal x (car lst)) lst (my_member x (cdr lst)) ) ) ) 2. Acrescente um elemento a uma lista, se ele já não estiver. 3. Faça a união de duas listas (union). Resposta: (defun my-union (lst1 lst2) (if (null lst1) lst2 (if (member (car lst1) lst2) (my-union (cdr lst1) lst2) (cons (car lst1) (my-union (cdr lst1) lst2)) ) ) ) 4. Faça a intersecção de duas listas (intersection). Resposta: (defun intersection (lista1 lista2) (cond ((null lista2) lista2) ((member (car lista2) lista1) (cons (car lista2) (intersection lista1 (cdr lista2)))) (t (intersection lista1 (cdr lista2))) ) ) 5. Verifique se uma lista é sub-conjunto de outra (subsetp). Resposta: (defun subsetp (lista1 lista2) (if (null lista1) t (and (member (car lista1) lista2) (subsetp (cdr lista1) lista2)) ) ) 6. Retorne os elementos que estão na primeira lista e não estão na segunda (set-difference). Resposta: (defun set-difference (lista1 lista2) (cond ((null lista1) lista1) ((member (car lista1) lista2) (set-difference (cdr lista1) lista2)) (t (cons (car lista1) (set-difference (cdr lista1) lista2))) ) )