Схема: сравнить / проверить, равны ли 2 списка - PullRequest
1 голос
/ 05 декабря 2011

Я ищу функцию, которая сравнивает или проверяет, равны ли 2 списка.

Следует игнорировать порядок номеров и повторяющиеся номера ...

Я уже создал функцию, которая проверяет, является ли элемент частью списка в другом блоке, но у меня сейчас есть некоторые проблемы с этим.

Вот что у меня есть

(define (ispart? x b)
      (cond ((null? b) #f)
            ((= x (car b)) #t)
             (else (ispart? x (cdr b)))))

    (define (check=? c1 c2)


(define (verification-1 c1 c2) 
        (cond((null? c1) 
            #t)
        ((ispart? (car c1) c2) (check=? (cdr c1) c2))))
   (define (verification-2 c1 c2) 
    (cond((null? c2) 
        #t)
  ((ispart? (car c2) c1) (check=? c1 (cdr c2)))))
    (if (equal? (and verification-1 verification-2) #t)
        #t
  (#f)))

У меня, в основном, проблемы с условиями, я создаю проверку для каждого элемента первого списка, чтобы увидеть, принадлежит ли он ко второму списку, а затем проверку для каждого элемента второго списка. Если какой-либо элемент не проходит эту проверку, списки отличаются.

Я тоже пробовал это, но он не игнорирует дублированные числа или порядок номеров, поэтому (3 2 1) отличается от (1 2 2 3), и я не хочу, чтобы это произошло

    (define (lists=? lst1 lst2)
  (cond ((null? lst1) (null? lst2))
        ((null? lst2) #f)
        ((= (car lst1) (car lst2))
         (lists=? (cdr lst1) (cdr lst2)))
        (else #f)))

1 Ответ

2 голосов
/ 06 декабря 2011

С учетом функции all, которая говорит, что все элементы списка истинны,

(define (all l)
   (cond ((null? l) #t)
         ((equal? #f (car l)) #f)
         (else (all (cdr l)))))

и с учетом вашей ispart? функции,

. Вы можете просто увидеть, если каждыйэлемент в первом списке проходит тест ispart? во втором списке, и наоборот:

(define (set_equal l0 l1)
   (and (all (map (lambda (x) (ispart? x l1))
                  l0))
        (all (map (lambda (x) (ispart? x l0))
                  l1))))
...