2013-01-17 1 views
2

목록이 실제로 알리미인지 확인하는 간단한 방법이 있습니까?목록이 알리 스트인지 확인하는 방법

내 첫 번째 시도 : (alistp '((1 . (4 5 6))))

에 대한 (alistp '((1 . 2) (2 . 3)))

그러나 NIL에 대한

(defun alistp (list) 
    (and (listp list) 
     (every (lambda (c) 
        (and (consp c) 
         (or (atom (cdr c)) 
          (null (cddr c)))))) 
       list))) 

반환 T는 해결책이 있습니까?

답변

5

음, 연결리스트의 definition 살펴 보자 :

연관리스트의 N. 키와 값의 연관을 나타내는 cons의 목록. 각 cons의 car가 키이고 cdr이 해당 키와 연관된 값인 입니다.

alistp의 가능한 구현 될 것을 감안할 때 :

(defun alistp (alist) 
    (and (listp alist)   ; a list 
     (every #'consp alist))) ; of conses 

지금, 당신의 코드 예제에서 당신은 아마이 직접 구현할 수 있었던 것 말할 수 있지만, 당신은 보인다 마음에있는 알 스트의 다른 정의를 갖기. 내가 본 앨리스스트의 예는 모두 다음과 같이 보입니다 : ((a . x) (b . y)), 아마도 ((a . x) (b . (y z))) 그러나 마지막 요소로서리스트를 가진 점선 된리스트는 목록 일뿐입니다. 그리고 예제 입력으로부터 당신이 원하는 것은 분명합니다. 목록을 값으로 허용합니다. (왜 어쨌든, 당신이하지 않을까요?)

당신이 실현해야 할 무엇, 나는 가정, 귀하의 예를 입력 ((1 . (4 5 6))) 내가 주로 자신의 값으로 목록으로 alists를 참조하는 방법 인 ((1 4 5 6)) 정확히 같은 때문이다 코드에서 사용됩니다. 적어도 필자가 보통 쓰는 방법입니다.

이제는 목록이기는하지만 값도 제외하려는 것입니다. 단지 공백 인 ()입니다. 따라서 실제로 생각해 보는 정의는 다음과 같습니다.

연관 목록 n. 키와 nil이 아닌 값의 연관을 나타내는 cons 셀 목록. 각 cons의 car가 키이고 cdr이 해당 키와 연관된 값인 입니다. 그건 정말 당신이 원하는 경우

, 새로운 정의를 따르 그런

(defun alistp (alist) 
    (flet ((true-cdr-p (element) 
      (and (consp element)  ; cons cell 
       (cdr element))))  ; with non-nil cdr (i.e. value) 
    (and (listp alist)     ; a list 
     (every #'true-cdr-p alist)))) ; of cons cells with non-nil cdr 

또는 무언가를. 위의 간단한 버전을 고집하는 것이 좋습니다.

+0

감사합니다. @danlei. 나는 명백한 무엇인가 놓치고있다라는 것을 알고 있었다. .. 그리고 나는 있었다! –

+0

여러분을 환영합니다! – danlei

관련 문제