该功能被称为子列表?有两个参数(两个列表)。它检查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 :(得分: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)如果是,则检查其余元素。
答案 1 :(得分: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))))