2015-10-31 1 views
0

Je suis un débutant dans LISP.J'utilise clisp en ubuntu .J'ai un code ici en Lisp pour effectuer le fonctionnement de l'union sur deux listes.La logique est correcte.Mais coincé à une erreur qui est:Lisp: pour effectuer l'opération d'union set

*** - APPEND: A proper list must not end with T

mon code est:

(defun set-union (L1 L2) 
(cond 
((null L2) ;if l2 is null then union is l1 itself. 
    L1) 
((not (member (first L2) L1)) ;check if first member of l2 is in l1 or not 
    (setq l1 (append (set-union L1 (rest L2)) (list (first L2))))) ;if not then append it with the union of l1 and rest of l2. 
(t 
    (set-union L1 (rest L2))) 
)) ;if second condition is not true then carry out union on l1 and rest of the elements of l2 
(setq l1 (list 'a 'c 'b 'g)) 
(setq l2 (list 'd 'g 't)) 
(set-union l1 l2) 
(print l1) 

je besoin d'aide !! Merci.

Répondre

1
(append (set-union L1 (rest L2)) (first L2)) 

à un certain point de votre logique tente de append (A C B G. T) et E, qui échoue parce que le premier est pas une liste appropriée.

Soit utiliser

(append (set-union L1 (rest L2)) (list (first L2))) 

ou, mieux

(cons (first L2) (set-union L1 (rest L2))) 
+0

Monsieur, j'ai essayé this.This temps aucune erreur, mais la sortie imprimée est la première liste et non l'union de lists.Thanks @uselpa – Midhun

+0

Avec votre code mis à jour '(set-union l1 l2)' produit '(ACBGTD)' ce qui est correct. Mais 'set-union' ne modifie pas l1 ou l2, il retourne juste le résultat. Après cela, vous imprimez l1 qui n'a pas changé. – uselpa

+0

Donc, ce que vous voulez probablement est '(setq l1 (set-union l1 l2))', après quoi l1 a été mis à jour et '(print l1)' produit le résultat que vous attendez. – uselpa