第七章 Friends and Relations

这是一个set集合吗

(apple peaches apple plum)

不是,apple出现了不止一次

(set? lat) 是真还是假,其中lat是(apples peaches peaches plums)

#t,因为没有重复出现的原子

那么(set? lat)呢,其中lat是()

#t,因为没有重复出现的原子

试试看写出函数set?
(define set?
  (lambda (lat)
    (cond
      ((null? lat) #t)
      (else (cond
              ((member? (car lat) (cdr lat)) #f)
              (else (set? (cdr lat))))))))

简化set?

(define set?
  (lambda (lat)
    (cond
      ((null? lat) #t)
      ((member? (car lat) (cdr lat)) #f)
      (else (set? (cdr lat))))))

这个函数对(apple 3 pear 4 9 apple 3 4)有用吗

是的,member?中现在用equal?替代了eq?

看到书member?出现在set?的定义中你惊讶吗

别这样,我们已经写过member?了,现在我们想用就用。

(makeset lat)是什么,其中lat是(apple peach pear peach plum apple lemon peach)

(apple peach pear plum lemon)

试试用member?写出函数makeset

(define makeset
  (lambda (lat)
    (cond
      ((null? lat) (quote ())
      ((member? (car lat) (cdr lat)) (makeset (cdr lat)))
      (else ((cons (car lat) (makeset (cdr lat))))))

函数短得让你惊讶吧

希望如此。别怕:这个是正确的。

使用之前的定义,那么(makeset lat)是什么,其中(apple peach pear peach plum apple lemon peach)

(pear plum apple lemon peach)

试试用 multirember 重写 makeset 函数

(define makeset
  (lambda (lat)
    (cond
      ((null? lat) (quote ())
      ((member? (car lat) (cdr lat)) (makeset (cdr lat)))
      (else ((cons (car lat) (makeset (multirember (car lat) (cdr lat))))))))))

使用第二个定义,那么(makeset lat)是什么,其中(apple peach pear peach plum apple lemon peach)

(pear plum apple lemon peach)

用自己的话描述及喜爱第二个 makeset 函数定义是如何工作的。

下面是我们的描述:
“函数 makeset 在用删除再次出现与第一个原子相同的原子成员后,把第一个原子cons到自然递归上。”

这个函数对(apple 3 pear 4 9 apple 3 4)有用吗

是的,multirember中现在用equal?替代了eq?

(subset? set1 set2) 是什么,其中 set1 是(5 chicken wings) set2是(5 hamburgers 2 pieces fried chicken and light duckling wings)

#t,因为每一个set1中的原子也在set2中。

写出函数 subset?

(define subset?
  (lambda (set1 set2)
    (cond
      ((null? set1) #t)
      (else (cond
              ((member? (car set1) set2) (subset? (cdr set1) set2))
              (else #f))))))

你能写出一个更简单的吗

(define subset?
  (lambda (set1 set2)
    (cond
      ((null? set1) #t)
      ((member? (car set1) set2) (subset? (cdr set1) set2))
      (else #f))))

试试用(and ...)重写 subset?

(define subset?
  (lambda (set1 set2)
    (cond
      ((null? set1) #t)
      (and ((member? (car set1) set2) (subset? (cdr set1) set2))))))

(eqset? set1 set2)是什么,其中set1是(6 large chickens with wings),set2是(6 chickens with large wings)

#t

写出函数eqset?

(define eqset?
  (lambda (set1 set2)
    (cond
      ((subset? set1 set2)
       (subset? set1 set2))
      (else #f))))

你能用一行的cond-写出 eqset吗
(define eqset?
  (lambda (set1 set2)
    (cond
      (and (subset? set1 set2) (subset? set1 set2)))))

写出一行版

(define eqset?
  (lambda (set1 set2)
    (and (subset? set1 set2) (subset? set1 set2))))

(intersect? set1 set2) 是什么,其中set1是 (stewed tomatoes and macaroni),set2是 (macaroni and cheese)

#t,因为set1至少有一个原子出现在set2中。交集

定义函数 intersect?

(define intersect?
  (lambda (set1 set2)
    (cond
      ((null? set1) #f)
      (else (cond
              ((member? (car set1)  set2) #t)
              (else (intersect? (cdr set1) set2)))))))

写出更简洁的版本

(define intersect?
  (lambda (set1 set2)
    (cond
      ((null? set1) #f)
      ((member? (car set1)  set2) #t)
      (else (intersect? (cdr set1) set2)))))

试试使用(or ...)写 intersect?函数
(define intersect?
  (lambda (set1 set2)
    (cond
      ((null? set1) #f)
      (or (member? (car set1)  set2)
          (intersect? (cdr set1) set2)))))

对比subset? 和interset?

(intersect set1 set2)是什么,其中set1是(stewed tomatoes and macaroni),set2是(macaroni and cheese)

(and macaroni)

现在你能写出简短版的函数 intersect

(define intersect
  (lambda (set1 set2)
    (cond
      ((null? set1) (quote ()))
      ((member? (car set1) set2) (cons (car set1) (intersect (cdr set1) set2)))
      (else (intersect (cdr set1) set2)))))

(union set1 set2)是什么,其中set1是(stewed tomatoes and macaroni casserole),set2是(macaroni and cheese)

(stewed tomatoes casserole macaroni and cheese)

写出函数union

(define union
  (lambda (set1 set2)
    (cond
      ((null? set1) set2)
      ((number? (car set1) set2) (union (cdr set1) set2))
      (else (cons (car set1) (union (cdr set1) set2))))))

这个函数是什么

(define xxx
  (lambda (set1 set2)
    (cond
      ((null? set1) (quote ()))
      ((member?? (car set1) set2) (xxx (cdr set1) set2))
      (else (cons (car set1) (xxx (cdr set1) set2))))))
      
我们的解释是:
“这个函数返回的是set1中有,但是set2中没有的原子。

(intersectall l-set)是什么,其中 l-set 是 ((a b c) (c a d e) (e f g h a b))

(a)

(intersectall l-set)是什么,其中 l-set 是
((6 pears and) (3 peaches and 6 peepers) (and 6 prunes with some apples))

(6 and)

现在使用任何你需要的的辅助函数写出 intersectall ,假定所有的集合表都非空。

(define intersectall
  (lambda (l-set)
    (cond
      ((null? (cdr l-set)) (car l-set))
      (else (intersect (car l-set) (intersectall (cdr l-set)))))))

这是一对a pair吗(pear pear)

是的,列表中只有两个原子。
注:一对a pair在Scheme(或Lisp)中是一个异样但相关的东西

这是一对a pair吗
(3 7)

这是一对a pair吗
((2) (pair))

是。 因为列表中只有两个表达式。

(a-pair? l),其中l是(full (house))

#t。 因为列表中只有两个表达式。

定义函数 a-pair?

(define a-pair?
  (lambda (x)
    (cond
      ((atom? x) #f)
      ((null? x) #f)
      ((null? (cdr x)) #f)
      ((null? (cdr (cdr x))) #t)
      (else #f))))

怎样取得一个对a piar的第一个 S-expression表达式

对pair取car

怎样取得一个对a piar的第一个 S-expression表达式

对pair取cdr再取car

怎样用两个原子又称一个 pair

把两个原子依次cons到一个()里,即(cons x1 (cons x2 (quote I())))

怎样用两个S-expression表达式又称一个 pair

把两个S-expression表达式依次cons到一个()里,即(cons x1 (cons x2 (quote I())))

觉得上边最后两个问题的回答有什么区别吗

没什么区别

(define first
  (lambda (p)
    (cond
      (else (car p)))))

(define second
  (lambda (p)
    (cond
      (else (car (cdr p))))))

(define build
  (lambda (s1 s2)
    (cond
      (else (cons s1 (cons s2 (quote ())))))))

这三个函数会有什么用

它们被用来表示pair对和获得pair对的成员。详见第六章。他们用来提高可读性,见下文。

请把这三个函数用一行重定义。

(define first
  (lambda (p)
    (car p)))

(define second
  (lambda (p)
    (car (cdr p))))

(define build
  (lambda (s1 s2)
    (cons s1 (cons s2 (quote ())))))

你能写出third的一行定义吗

(define third
  (lambda (p)
    (car (cdr (cdr p)))))

l是rel吗,其中,l是(apple peaches pumpkin pie)

不是,因为l不是全由pair对构成。我们使用rel来表示relation。

l是rel吗,其中,l是((apples peaches) (pumpkin pie) (apples peaches))

不是,因为l不是pair对的一个的集合,有重复的。

l是rel吗,其中,l是((apples peaches) (pumpkin pie) )

l是rel吗,其中,l是((4 3) (4 2) (7 6) (6 2) (3 4))

rel是fun吗,其中rel是((4 3) (4 2) (7 6) (6 2) (3 4))

不是,我们用fun表示function函数。

(fun? rel) 的值是什么,其中rel是((8 3) (4 2) (7 6) (6 2) (3 4))

#t,因为(firsts rel)是一个set。firsts详见第三章。

(fun? rel) 是什么,其中rel是((d 4) (b 0) (b 9) (e 5) (g 4))

#f,因为b重复了。

用set?和firsts写出函数fun?

(define fun?
  (lambda (rel)
    (set? (firsts rel))))

函数fun?是简单的one-liner吗

当然是啊

我们怎么定义有限函数

对于我们,有限函数是pair对组成的list表,其中每个pair的第一个元素没有相同的。

(revrel rel)是什么,其中l是(8 a) (pumpkin pie) (got sick))

((a 8) (pie pumpkin) (sick got))

现在能写出revrel函数

(define revrel
  (lambda (rel)
    (cond
      ((null? rel) (quote ()))
      (else (cons (build (second (car rel)) 
                         (first (car rel)))
                  (revrel (cdr rel)))))))

下面的这个对吗
(define revrel
  (lambda (rel)
    (cond
      ((null? rel) (quote ()))
      (else (cons (cons (car (cdr (car rel))) 
                        (cons (car (car rel))
                              (quote ())))
                  (revrel (cdr rel)))))))

是的,现在你看出“representation表达”对可读性的益处了吧。

假设我们有如下函数revpair可以反转一个piar对的两个成员。
(define revpair
  (lambda (pair)
    (build (second pair) (first pair))))
我们如何用这个辅助函数重写revrel
没问题,而且更易读

(define revrel
  (lambda (rel)
    (cond
      ((null? rel) (quote ()))
      (else (cons (revpair (cr rel))
                  (revrel (cdr rel)))))))

猜猜看为什么fun不是fullfun,其中fun是((8 3) (4 2) (7 6) (6 2) (3 4))

fun不是fullfun,因为所有pair的第二项中2出现了不止一次。

为什么(fullfun? fun)是#t,其中fun是((8 3) (4 8) (7 6) (6 2) (3 4))

因为(3 8 6 2 4)是一个set。

(fullfun? fun) 是什么,其中fun是((grape raisin) (plum prune) (stewed prune))

#f

(fullfun? fun) 是什么,其中fun是((grape raisin) (plum prune) (stewed grape))

#t,因为(raisin prune grape)是一个集合。

定义fullfun?

(define fullfun?
  (lambda (fun)
    (set? (seconds fun))))

你能定义seconds吗

如同firsts

fullfun?还可以称作什么

one-to-one一对一

你能想出第二种one-to-one的写法吗

(define one-to-one?
  (lambda (fun)
    (fun? (revrel fun)))

问((chocolate chip) (doughy cookie))是一个 one-to-one一对一函数吗

是的,你现在就该来一份!

去点一份((chocolate chip) (doughy cookie))吧!

或者你自己做一份,这样不是更好吗

(define cookies
  (lambda ()
    (bake
      (quote (350 degrees))
      (quote (12 minutes))
      (mix
        (quote (walnuts 1 cups))
        (quote (oatmeal 2 cups))
        (quote (salt .5 teaspoon))
        (quote (baking-powder 1 teaspoon))
        (quote (baking-soda 1 teaspoon)))
      (mix
        (quote (eggs 2 large)))
        (quote (vanilla 1 teaspoon)))
        (cream
          (quote (butter 1 cups))
          (quote (sugar 2 cups)))))

转载于:https://www.cnblogs.com/weekbo/p/10297424.html

the little schemer 笔记(7)相关推荐

  1. the little schemer 笔记(5)

    the little schemer 笔记(5) 第五章 "Oh My Gawd":It's Full of Stars (rember* a l)是什么,其中a是cup,l是(( ...

  2. the little schemer 笔记(3)

    第三章 cons the magnificent (rember a lat)是什么,其中a是mint,lat是(lamb chops and mint jelly) (lamb chops and ...

  3. The Little Shemer笔记

    ;;预备函数 (define (atom? x)(and (not (pair? x))(not (null? x)))) (define (sub1 x)(- x 1)) (define (add1 ...

  4. 【读书笔记】知易行难,多实践

    前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...

  5. 【运维学习笔记】生命不息,搞事开始。。。

    001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...

  6. SSAN 关系抽取 论文笔记

    20210621 https://zhuanlan.zhihu.com/p/353183322 [KG笔记]八.文档级(Document Level)关系抽取任务 共指id嵌入一样 但是实体嵌入的时候 ...

  7. pandas以前笔记

    # -*- coding: utf-8 -*- """ Created on Sat Jul 21 20:06:20 2018@author: heimi "& ...

  8. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  9. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

最新文章

  1. 网络应用 axIos +vue的应用
  2. Java熔断框架有哪些_降级熔断框架 Hystrix 源码解析:滑动窗口统计
  3. java比python快多少倍_java为什么比python快
  4. python爬取设置了权限的qq空间_日常用Python来监控女神QQ空间!就算他把我屏蔽,也阻止不了我!-qq空间怎么设置访问权限...
  5. Hightopo 受邀参加第二十三届中国国际高新技术成果交易会
  6. 51单片机流水灯画图打板焊元件历程
  7. 程序设计基础流程图以及进制的介绍
  8. 蓝桥杯 ADV-222 7-2求arccos值 java
  9. 原创|我为什么不建议你等公司倒闭后,再找工作!
  10. 实现制作萝莉语音包前的准备——百度AI的使用介绍
  11. PowerBI网关on-premises data gateway无法登录账号的问题及解决方法
  12. János-the-Ripper
  13. Python-S9-Day124-爬虫微信
  14. 为什么 FIQ 比 IRQ 的响应速度更快?
  15. springwebmvc的入门案例
  16. 解决:Keil安装C51驱动C8051Fxxx uVision但Debug中不显示
  17. 洛谷月赛2018.8 T1题解(U28036 Nagisa loves Tomoya)
  18. jQuery的属性与样式之增加样式、删除样式、切换样式
  19. 罗斯蒙特3051S变送器快速连接装置分解图!
  20. php语言中计算字符串长度的函数是,php 语言中计算字符串长度函数是:

热门文章

  1. 安卓蓝牙键盘按键映射_多设备无缝切换 雷柏XK100无线蓝牙轻薄键盘评测
  2. Codeforces 994A. Fingerprints
  3. 虚幻4皮肤材质_虚幻4渲染编程(材质编辑器篇)【第六卷:各向异性材质amp;玻璃材质】...
  4. 根据身高重建队列—leetcode406
  5. 为什么判断 n 是否为质数只需除到开平方根就行了?(直接证明)
  6. IEDA快速书写代码快捷键
  7. Pwn环境配置(一)——安装虚拟机
  8. 运算符重载(加减运算符、前置加加(减减)后置加加(减减)运算符、赋值运算符、输入输出运算符、关系运算符、函数调用)
  9. linux io端口复用,Linux系统IO复用接口(select、poll、epoll)
  10. sql解析json oracle,oracle 11g plsql解析json数据示例1