-1

したがって、次のプロパティを持つRacketを使用してSchemeで作成する必要があるこのプログラムがあり、困惑しています。この関数は、sublist?と の 2 つの入力で呼び出されSLどちらもリストです。S が and のサブリストかどうかをチェックし、orLを返します。#t#f

例は次のようになります。

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

リストを抽出するには、と呼ばれる小さな関数extractListsを作成する必要があります。この関数(atomicSublist S L)を使用して、抽出された 2 つのリストをチェックし、 のすべての要素が に含まSれているかどうかを確認しLます。

これまでのところ、

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

2 番目の部分は実際には何もせず、抽出された S の値を出力することさえありません。

更新されたコード: テストのためだけにatomicSublist、今のところチェックしています。

4

3 に答える 3

1

より単純な問題から始めて、一般化します。

'aシンボルが a リストかどうかをチェックする関数をどのように書きますか?

于 2012-05-30T19:39:00.950 に答える
0

((equal? S (car L) ) #t)L の車がリスト S と等しくなることは決してないので、このチェックは必要ないと思います。

私がatomicSublistについて思いついたのは次のとおりです。

    (define (atomicSublist S L)
        (cond
            [(null? S) #t]
            [(member? (car S) L) (atomicSublist (cdr s) L)]
            [else #f]))
于 2012-05-30T20:51:47.123 に答える
0

質問は少しあいまいです。これは何を返す必要がありますか?(サブリスト? '(a (b)) '(abcde)) ??

とにかくここに私が書いたものがあります:

(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? '(aa) ('abcde)) は #f を返します。(sublist? '(abc) '(adbecf)) は #t を返します。(sublist? '(a (b)) '(c ((a (b)) ef))) は #t を返します。(sublist? '(a (b) b) '(c ((a (b)) ef))) #f を返します。ただし、(sublist? '(a (b)) '(abcd)) は #t を返します。

于 2012-05-31T05:01:05.040 に答える