Đến nội dung


Hình ảnh
- - - - -

Hỏi Lisp so sánh hai tập hợp!


  • Please log in to reply
4 replies to this topic

#1 dkkx3a

dkkx3a

    biết lệnh trim

  • Members
  • PipPipPip
  • 190 Bài viết
Điểm đánh giá: 57 (tàm tạm)

Đã gửi 01 June 2014 - 11:34 AM

Mình viết một lisp so sánh hai tập hợp các dữ liệu

Ví dụ tập hợp các text:

              + Th1 = ("1" "2" "3" "7" "9");

              + Th2 = ("1" "2" "3" "4" "5" "6")

Mình muốn so sánh các phần tử của tập hợp 1 với tập hợp 2, nếu phần tử nào của tập hợp 1 mà không có trong tập hợp 2 thì trả về list danh sách các phần tử của tập hợp 1 không thuộc tập hai"

               (sosanh12 th1 th2) = th12: ("7" "9")

Mình có viết một lệnh mà không chạy được, bác nào hỗ trợ để mình hoàn thiện lisp của mình với. thanks!

 

 

(defun SS12 (ds1 ds2 / index)
(setq index 0)
(while (> (length ds1) index)
  (progn
   (setq ds1_i (nth index ds1))
   (if (= (member ds1_i ds1) nil)
(setq ds12 (cons ds1_i ds12))
); end if
   (setq index (+ index 1))
   );end progn
);end while
  ds12
)
(defun SS12 (ds1 ds2 / index)
(setq index 0)
(while (> (length ds1) index)
  (progn
   (setq ds1_i (nth index ds1))
   (if (= (member ds1_i ds1) nil)
(setq ds12 (cons ds1_i ds12))
); end if
   (setq index (+ index 1))
   );end progn
);end while
  ds12
)
(defun SS12 (ds1 ds2 / index)
(setq index 0)
(while (> (length ds1) index)
  (progn
   (setq ds1_i (nth index ds1))
   (if (= (member ds1_i ds1) nil)
(setq ds12 (cons ds1_i ds12))
); end if
   (setq index (+ index 1))
   );end progn
);end while
  ds12
)
(defun SS12 (ds1 ds2 / index)
(setq index 0)
(while (> (length ds1) index)
  (progn
   (setq ds1_i (nth index ds1))
   (if (= (member ds1_i ds1) nil)
(setq ds12 (cons ds1_i ds12))
); end if
   (setq index (+ index 1))
   );end progn
);end while
  ds12
)
(defun SS12 (ds1 ds2 / index)
(setq index 0)
(while (> (length ds1) index)
  (progn
   (setq ds1_i (nth index ds1))
   (if (= (member ds1_i ds1) nil)
(setq ds12 (cons ds1_i ds12))
); end if
   (setq index (+ index 1))
   );end progn
);end while
  ds12
)

  • 0
TỰ SỰ
Biển vào chiều buồn giữa cô liêu
Sóng vỗ bờ bạc đầu con nước
Khi biển động như lòng ta chợt động
Biển ồn ào nhưng thực rất dịu êm.......

#2 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 01 June 2014 - 11:41 AM

Bạn làm như sau:

 
(setq Th1 '("1" "2" "3" "7" "9")
      Th2 '("1" "2" "3" "4" "5" "6"))
(vl-remove-if '(lambda(x) (member x Th2)) Th1)
 
(setq Th1 '("1" "2" "3" "7" "9")
      Th2 '("1" "2" "3" "4" "5" "6"))
(vl-remove-if '(lambda(x) (member x Th2)) Th1)

  • 1

#3 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 01 June 2014 - 11:48 AM

Chào dkkx3a!

 (setq ds1_i (nth index ds1))
   (if (= (member ds1_i ds1) nil)

Vì (setq ds1_i (nth index ds1))

nên 

   (if (= (member ds1_i ds1) nil)

;;;;;;

ds1_i bao giờ cũng là "thành viên" của ds1 nên biểu thức logic sau if bao giờ cũng là T

;;;;;;;;;

Hy vọng bạn tự sửa được


  • 1

#4 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 01 June 2014 - 11:54 AM

hoặc là nh­ư­­­ thế này cho dễ ngấm :D :D :D

(defun test(lst_1 lst_2 / lst_12)
(foreach elem lst_1
	(if (not (member elem lst_2)) (setq lst_12 (cons elem lst_12))))
(reverse lst_12)
)

  • 2

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#5 dkkx3a

dkkx3a

    biết lệnh trim

  • Members
  • PipPipPip
  • 190 Bài viết
Điểm đánh giá: 57 (tàm tạm)

Đã gửi 01 June 2014 - 12:53 PM

Cảm ơn mọi người, mình làm được rồi. Chúc cuối tuần vui vẻ.


  • 0
TỰ SỰ
Biển vào chiều buồn giữa cô liêu
Sóng vỗ bờ bạc đầu con nước
Khi biển động như lòng ta chợt động
Biển ồn ào nhưng thực rất dịu êm.......