使用抽象

时间:2012-10-09 12:09:46

标签: scheme predicate abstraction

如果谓词位?如果项目为1或0,则返回#t

(define bit?
  (lambda (item)
    (if (equal? item 0)
        #t
    (if (equal? item 1)
        #t
        #f))))

我怎么用bit?在一个新程序中,所有位?如果列表中的所有项都是位,则返回#t?我无法弄明白 这就是我的尝试。

 (define all-bits?
      (lambda (ls)
        (cond
          [(null? ls) #t]
          [(equal? (car ls all-bits?)) bit?]
          [else (all-bits? ls (cdr ls))]))

1 个答案:

答案 0 :(得分:1)

cond 条件中的第二个完全错误。它在语法上是错误的; 相等?需要两个参数, car 只需要一个,也需要一个,但是你分别传递了1,2和0个参数。这也没有意义:你的帮助函数 bit?旨在测试单个项目,但你没有用它测试任何东西。为什么是全位?在那条线上?

第三个 cond 行语法错误:再次,您将两个参数传递给只需要一个的函数。

你需要说'如果第一个原子有点则返回true; 第二个原子有点(依此类推,等等)。该结构根本没有在您的代码中表示。

我还认为all-bits应该为空列表返回false,如果列表中有一位,则为true,但在原始课程问题中可能指定了(all-bits? '()) ==> #t

按照您的方式执行(对于空列表是正确的),您的 cond 应该只有两个语句;

(cond
   ((null? l) #t)
   (else ("Return true if the first atom is a bit **and** if the second atom is a bit **and** the third (and so on, and so on, recursively)"))

按照我的方式做,它看起来像这样:

(cond
   ((null? l) #f)
   ((and (null? (cdr l)) ("something here to test that (car l) is a bit")) #t)
   (else ("Return true if the first atom is a bit **and** if the second atom is a bit **and** the third (and so on, and so on, recursively)")).

应该清楚引号中的位不是真正的代码。

我没有为你完成你的作业,但我希望我的所有评论都能让你更清楚你要做什么。即使你试图做你的版本而不是我的版本,我的实际上还包括一个很大的提示,你应该如何构建最后一行。

如果您尚未展示如何使用,请使用嵌套的 if 语句。