LISP-설정
Common Lisp는 집합 데이터 유형을 제공하지 않습니다. 그러나 목록에서 집합 작업을 수행 할 수있는 여러 기능을 제공합니다.
다양한 기준에 따라 목록에서 항목을 추가, 제거 및 검색 할 수 있습니다. 또한 합집합, 교차 및 차이 집합과 같은 다양한 집합 작업을 수행 할 수 있습니다.
LISP에서 세트 구현
목록과 같은 집합은 일반적으로 단점 셀 측면에서 구현됩니다. 그러나 바로 이런 이유로 집합 연산은 집합이 클수록 효율성이 떨어집니다.
그만큼 adjoin기능을 사용하면 세트를 만들 수 있습니다. 항목과 집합을 나타내는 목록을 가져 와서 원래 집합의 항목과 모든 항목을 포함하는 집합을 나타내는 목록을 반환합니다.
그만큼 adjoin함수는 먼저 주어진 목록에서 항목을 찾고, 발견되면 원래 목록을 반환합니다. 그렇지 않으면 새로운 단점 셀을 생성합니다.car 항목으로 cdr 원래 목록을 가리키고이 새 목록을 반환합니다.
그만큼 adjoin 기능도 걸립니다 :key 과 :test키워드 인수. 이러한 인수는 항목이 원래 목록에 있는지 확인하는 데 사용됩니다.
adjoin 함수는 원래 목록을 수정하지 않기 때문에 목록 자체를 변경하려면 adjoin에서 반환 한 값을 원래 목록에 할당하거나 매크로를 사용할 수 있습니다. pushnew 세트에 항목을 추가합니다.
예
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
; creating myset as an empty list
(defparameter *myset* ())
(adjoin 1 *myset*)
(adjoin 2 *myset*)
; adjoin did not change the original set
;so it remains same
(write *myset*)
(terpri)
(setf *myset* (adjoin 1 *myset*))
(setf *myset* (adjoin 2 *myset*))
;now the original set is changed
(write *myset*)
(terpri)
;adding an existing value
(pushnew 2 *myset*)
;no duplicate allowed
(write *myset*)
(terpri)
;pushing a new value
(pushnew 3 *myset*)
(write *myset*)
(terpri)
코드를 실행하면 다음 결과가 반환됩니다.
NIL
(2 1)
(2 1)
(3 2 1)
회원 확인
멤버 함수 그룹을 사용하면 요소가 집합의 멤버인지 여부를 확인할 수 있습니다.
다음은 이러한 함수의 구문입니다-
member item list &key :test :test-not :key
member-if predicate list &key :key
member-if-not predicate list &key :key
이 함수는 주어진 목록에서 테스트를 만족하는 주어진 항목을 검색합니다. 그러한 항목이 없으면 함수는 다음을 반환합니다.nil. 그렇지 않으면 첫 번째 요소가 요소 인 목록의 꼬리가 반환됩니다.
검색은 최상위 수준에서만 수행됩니다.
이러한 함수는 술어로 사용할 수 있습니다.
예
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(write (member 'zara '(ayan abdul zara riyan nuha)))
(terpri)
(write (member-if #'evenp '(3 7 2 5/3 'a)))
(terpri)
(write (member-if-not #'numberp '(3 7 2 5/3 'a 'b 'c)))
코드를 실행하면 다음 결과가 반환됩니다.
(ZARA RIYAN NUHA)
(2 5/3 'A)
('A 'B 'C)
조합 설정
통합 함수 그룹을 사용하면 테스트를 기반으로 이러한 함수에 대한 인수로 제공된 두 목록에 대해 통합 집합을 수행 할 수 있습니다.
다음은 이러한 함수의 구문입니다-
union list1 list2 &key :test :test-not :key
nunion list1 list2 &key :test :test-not :key
그만큼 union함수는 두 개의 목록을 가져 와서 두 목록 중 하나에있는 모든 요소를 포함하는 새 목록을 반환합니다. 중복 된 항목이있는 경우 반환 된 목록에 구성원의 복사본 하나만 유지됩니다.
그만큼 nunion 함수는 동일한 작업을 수행하지만 인수 목록을 삭제할 수 있습니다.
예
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(setq set1 (union '(a b c) '(c d e)))
(setq set2 (union '(#(a b) #(5 6 7) #(f h))
'(#(5 6 7) #(a b) #(g h)) :test-not #'mismatch)
)
(setq set3 (union '(#(a b) #(5 6 7) #(f h))
'(#(5 6 7) #(a b) #(g h)))
)
(write set1)
(terpri)
(write set2)
(terpri)
(write set3)
코드를 실행하면 다음 결과가 반환됩니다.
(A B C D E)
(#(F H) #(5 6 7) #(A B) #(G H))
(#(A B) #(5 6 7) #(F H) #(5 6 7) #(A B) #(G H))
참고하십시오
통합 기능은 다음 없이는 예상대로 작동하지 않습니다. :test-not #'mismatch세 개의 벡터 목록에 대한 인수. 그 이유는 목록이 단점 셀로 구성되어 있고 값이 분명히 우리에게 동일 해 보이지만cdr셀의 일부가 일치하지 않으므로 LISP 인터프리터 / 컴파일러와 정확히 일치하지 않습니다. 이것이 이유 다; 목록을 사용하여 큰 집합을 구현하는 것은 권장되지 않습니다. 그래도 작은 세트에서는 잘 작동합니다.
교차로 설정
교차 함수 그룹을 사용하면 테스트를 기반으로 이러한 함수에 대한 인수로 제공된 두 목록에서 교차를 수행 할 수 있습니다.
다음은 이러한 함수의 구문입니다-
intersection list1 list2 &key :test :test-not :key
nintersection list1 list2 &key :test :test-not :key
이러한 함수는 두 개의 목록을 가져와 두 인수 목록에있는 모든 요소를 포함하는 새 목록을 반환합니다. 목록에 중복 항목이있는 경우 중복 항목이 결과에 표시되거나 표시되지 않을 수 있습니다.
예
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(setq set1 (intersection '(a b c) '(c d e)))
(setq set2 (intersection '(#(a b) #(5 6 7) #(f h))
'(#(5 6 7) #(a b) #(g h)) :test-not #'mismatch)
)
(setq set3 (intersection '(#(a b) #(5 6 7) #(f h))
'(#(5 6 7) #(a b) #(g h)))
)
(write set1)
(terpri)
(write set2)
(terpri)
(write set3)
코드를 실행하면 다음 결과가 반환됩니다.
(C)
(#(A B) #(5 6 7))
NIL
교차 기능은 교차의 파괴적인 버전입니다. 즉, 원래 목록을 파괴 할 수 있습니다.
차이 설정
set-difference 함수 그룹을 사용하면 테스트를 기반으로 이러한 함수에 대한 인수로 제공된 두 목록에서 차이 집합을 수행 할 수 있습니다.
다음은 이러한 함수의 구문입니다-
set-difference list1 list2 &key :test :test-not :key
nset-difference list1 list2 &key :test :test-not :key
set-difference 함수는 두 번째 목록에 나타나지 않는 첫 번째 목록의 요소 목록을 반환합니다.
예
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(setq set1 (set-difference '(a b c) '(c d e)))
(setq set2 (set-difference '(#(a b) #(5 6 7) #(f h))
'(#(5 6 7) #(a b) #(g h)) :test-not #'mismatch)
)
(setq set3 (set-difference '(#(a b) #(5 6 7) #(f h))
'(#(5 6 7) #(a b) #(g h)))
)
(write set1)
(terpri)
(write set2)
(terpri)
(write set3)
코드를 실행하면 다음 결과가 반환됩니다.
(A B)
(#(F H))
(#(A B) #(5 6 7) #(F H))