Homework: Sublist? checking if an item is a sublist of the first one

大憨熊 提交于 2019-12-13 07:57:56

问题


So I have this program that needs to be written in Scheme using Racket that has the following properties and I am stumped. The function is called sublist? with two inputs of S and L which are both lists. It checks whether S is a sublist of L and returns #t or #f.

Examples would be similar to:

sublist? of (A A) and (A B C) is #f
sublist? of (A B C) and (A B D A B C D) is #t
sublist? of (A (B)) and (C ((A (B))) (C)) is #t

A small function called extractLists needs to be created to extract the lists and (atomicSublist S L) is used to check the two extracted lists to see if every element of S is in L.

So far I have

(define (atomicSublist S L)
  (cond ((null? L) #f)
        ((equal? S (car L)) #t)
        (else (atomicSublist S (cdr L)))))

The second part does not really do anything and doesn't even output the extracted value of S.

Updated code: Just for testing I use atomicSublist to check for now.


回答1:


Begin with a simpler problem and then generalize.

How would you write a function that checks whether a symbol 'a is an a list or not?




回答2:


I don't think you want this check ((equal? S (car L) ) #t) as the car of L will never be equal to the list S.

Heres what I came up with for atomicSublist.

    (define (atomicSublist S L)
        (cond
            [(null? S) #t]
            [(member? (car S) L) (atomicSublist (cdr s) L)]
            [else #f]))



回答3:


The question is a little ambiguous. What should this return? (sublist? '(a (b)) '(a b c d e)) ??

Anyway here is what i wrote:

(define (sublist? s l)  
  (cond ((null? s) true)
        ((atom? (car s))
         (cond ((exists? (car s) l) (sublist? (cdr s) (remove-elm (car s) l)))
               (else false)))
        (else 
         (cond ((sublist? (car s) l) (sublist? (cdr s) (remove-elm (car s) l)))
               (else false)))))


(define (exists? elm l)
  (cond ((null? l) false) 
        ((atom? (car l))
         (cond ((symbol=? elm (car l)) true)
               (else (exists? elm (cdr l)))))
        (else
         (cond ((exists? elm (car l)) true)
               (else (exists? elm (cdr l)))))))



(define (remove-elm elm l)
  (cond ((null? l) '())
        ((null? elm) l)
        ((atom? elm)
         (cond ((atom? (car l)) 
                (cond ((symbol=? elm (car l)) (cdr l))
                      (else (cons (car l) (remove-elm elm (cdr l))))))
               (else
                (cons (remove-elm elm (car l)) (remove-elm elm (cdr l))))))
        (else
         (remove-elm (cdr elm) (remove-elm (car elm) l)))))


(define (atom? elm)
  (and (not (null? elm)) (not (pair? elm))))

(sublist? '(a a) ('a b c d e)) returns #f. (sublist? '(a b c) '(a d b e c f)) returns #t. (sublist? '(a (b)) '(c ((a (b)) e f))) returns #t. (sublist? '(a (b) b) '(c ((a (b)) e f))) retrns #f. However, (sublist? '(a (b)) '(a b c d)) returns #t.



来源:https://stackoverflow.com/questions/10822537/homework-sublist-checking-if-an-item-is-a-sublist-of-the-first-one

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!