2012-09-29 38 views
-1

该函数被称为子列表?有两个参数(两个列表)。它检查l2是否是l1的子列表并返回#t或#f。方案,子列表

我有这到目前为止,但似乎存在功能不正常

(define (sublist? l1 l2) 
    (cond ((null? l2) #t) 
     ((exists l1 (car l2)) #t) 
     (else (sublist? l1 (cdr l2))))) 
(define (exists l p) 
    (if (null? l) #f 
     (or (equal? p (car l)) (exists (cdr l) p)))) 

更新

+0

你是不是指'(等于?p(车l))? –

回答

0

首先我想在你的exists功能,你缺少的equals?

看起来第一个参数应该是一个原子,但是在你的子列表函数中,你首先发送列表,然后下一个原子,你需要切换参数。

(define (exists l p) 
    (if (null? l) #f 
     (or (equal? p (car l)) (exists (cdr l) p)))) 

这应该可以正常工作。

此外,它的约定打电话给你的谓词充当一个问题,你应该将其命名为exists?

[编辑]

还仔细检查后,它看起来像你的子表?功能不正确。即使列表中只有一个子列表元素,它也会返回#t。你需要稍作修改为:

(define (sublist? l1 l2) 
    (cond ((null? l2) #t) 
     ((not (exists l1 (car l2))) #f) 
     (else (sublist? l1 (cdr l2))))) 

现在你说:

1)是空的?然后是一个子列表。

2)这个元素不在列表中吗?然后不是。

3)如果是,则检查其余的元素。

+0

等于?:模块中的未绑定标识符in:equals?这个错误是什么意思? – John

+0

只是纠正了这一点。 –

+0

谢谢。它现在有效,但是子列表?函数总是返回true。 – John

0

我相信以前的答案只检查子集,而不是子列表。订单对于子列表很重要,所以你不能简单地检查列表中是否存在元素。你需要做如下的事情。

(define (sublist? l1 l2) 
    (cond ((null? l2) #t) 
     ((null? l1) #f) 
     ((headlist? l1 l2) #t) 
     (else (sublist? (cdr l1) l2))) 

(define (headlist? l1 l2) 
    (cond ((null? l2) #t) 
     ((null? l1) #f) 
     ((not (equal? (car l1) (car l2))) #f) 
     (else headlist? (cdr l1) (cdr l2))))