书开篇之前说, 本书的目标的一个例子: 证明(reverse (reverse x))对于任何列表x, 结果总是x.

(安装Chez Scheme的200字请看最后)

书刚开始, 就用到一个scheme中没有的函数atom和equal, 用中文定义应是如下:

注: 多谢 @张砸锅 指正, 下面的"为空?"不正确, 名称应该是"不是非空列表?". 原文用atom一词, 就不直译了. 鉴于似乎不影响本文后面的例子, 恕我不一一纠正了.

(define 为空?
(lambda (列表)
(if (atom? 列表)
'nil
't))) (define 相等?
(lambda (甲 乙)
(if (equal? 甲 乙)
't
'nil)))

书的第一个例子是在甲乙的值未知时, 对下面表达式求值

(相等? '那个啥 (为空? (cons 甲 乙)))

(cons 甲 乙) 不论甲乙值为何, 都不会为空, 因此(为空? (cons 甲 乙))返回'nil. 而(相等? '那个啥 'nil)显然返回'nil, 因此这个表达式的值必定是'nil.

这里"(为空? (cons 甲 乙))肯定返回'nil"被认为是Axiom(公理). 由这个公理推导出表达式的值.

第八页列出了在Scheme"世界"里与cons相关的几个公理:

(定义定律 cons不为空 (甲 乙)
(相等? (为空? (cons 甲 乙)) 'nil)
(定义定律 car/cons (甲 乙)
(相等? (car (cons 甲 乙)) 甲)
(定义定律 cdr/cons (甲 乙)
(相等? (cdr (cons 甲 乙)) 乙)

之后就是equal相关的(交换律, 自身相等). 接下去是一系列基于这几个定律的推导演绎. 而推导演绎法则(?不知说法是否恰当)本身被定义为如下:

对定律 (定义定律 名称 (x1, x2, ...xn) 定律内容), "定律内容"中的x1xn可以被任何表达式e1en替换, 得出的新定律只要符合格式(相等? p q)或者(相等? q p), q就可以被置换为p.

举例如下:

之前的定律car/cons

(定义定律 car/cons (甲 乙)
(相等? (car (cons 甲 乙)) 甲)

可以作用于下面表达式:

(为空? (car (cons (car a) (cdr b))))

只要把定律内容"(相等? (car (cons 甲 乙)) 甲)", 把"甲"替换为(car a), "乙"替换为(cdr b)之后就得出:

(相等? (car (cons (car a) (cdr b))) (car a))

根据推导法, (car (cons (car a) (cdr b))) 等同于 (car a), 因此表达式等同于

(为空? (car a))

看起来有些绕, 因此作者提供了辅助推导工具the-little-prover/j-bob. 第一章完(共十章).

感觉上是把定理以及推导的方法用代码表达, 进而赋予了程序证明定理的能力.


为了运行书中的代码, 决定装Chez. 上次用好像还是在学校机房, 因为当时只有Petite Scheme是免费可以装在个人机器, 而Chez还是商业软件. 几年过去, Dybvig教授离职去了思科, 而Chez Scheme随后开源了(cisco/ChezScheme). 今天尝试了下载9.5版, 在Mac上编译生成了Petite和Chez(中间碰到了这个问题).

运行后的提示即眼熟又生疏. 个人的力量毕竟有限, 不知道他一开始(1985年)就把Chez开源会不会改变今天的IT格局呢? 哪位开发者穿越回去试试改变历史吧.

$ a6osx/bin/scheme
Chez Scheme Version 9.5
Copyright 1984-2017 Cisco Systems, Inc.

当然要尝试中文标识符, 蛮好:

> (cons '火腿 '(鸡蛋))
(火腿 鸡蛋)
> (define 阶乘
(lambda (x)
(if (zero? x)
1
(* x (阶乘 (1- x))))))
> (阶乘 3)
6

发现一个小问题, 在控制台下, 在输入后括号时, 匹配前括号的光标定位有错位, 猜测是由于中文字符的宽度不同导致的. 在之后使用中, 发现对上一个命令进行编辑也有显示问题. 这使得在交互环境中使用中文命名有了不小障碍(想想在上个程序基础上任何一点修改都要重新输入整个程序). 试着在源文件中编写'阶乘'函数后导入, 发现中文文件名也不支持(多谢 @Eternal Chaos 指出, 已有问题报告command-line-arguments can't read umlauts with utf-8 encoding · Issue #81 · cisco/ChezScheme), 不过导入成功.

看了一点书之后发现...好像装了也不能直接用, 没有那个J-Bob好像基本上跑不了什么东西.

2018-01-04 浅尝The Little Prover一书, 重逢Chez Scheme的更多相关文章

  1. 2018.01.04 bzoj5291: [Bjoi2018]链上二次求和(线段树)

    传送门 线段树基础题. 题意:给出一个序列,要求支持区间加,查询序列中所有满足区间长度在[L,R][L,R][L,R]之间的区间的权值之和(区间的权值即区间内所有数的和). 想题555分钟,写题202 ...

  2. 浅尝装饰器和AOP

    [写在前面] 参考文章:https://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html[从简单的例子入手进行讲解,由浅入深,很到位] 装饰器部 ...

  3. 浅尝Spring注解开发_Servlet3.0与SpringMVC

    浅尝Spring注解开发_Servlet 3.0 与 SpringMVC 浅尝Spring注解开发,基于Spring 4.3.12 Servlet3.0新增了注解支持.异步处理,可以省去web.xml ...

  4. 浅尝ECMAScript6

    浅尝ECMAScript6 简介 ECMAScript6 是最新的ECMAScript标准,于2015年6月正式推出(所以也称为ECMAScript 2015),相比于2009年推出的es5, es6 ...

  5. 浅尝key-value数据库(二)——MongoDB的优与劣

    浅尝key-value数据库(二)——MongoDB的优与劣 MongoDB的名字取自英文单词"humongous"的中间五个字母,是一个C++开发的基于分布式文件存储的数据库开源 ...

  6. 浅尝key-value数据库(三)——MongoDB的分布式

    浅尝key-value数据库(三)——MongoDB的分布式 测试了单机MongoDB的随机读和写入性能,这一节来讲一讲MongoDB的分布式. MongoDB的分布式分成两种,一种是Replicat ...

  7. 浅尝key-value数据库(一)——一览NoSQL

    浅尝key-value数据库(一)——一览NoSQL 最近由于一个项目的关系,研究了一下key-value数据库这个最近很火的概念.本系列从项目需求的角度分析并测试了几个key-value数据库的性能 ...

  8. Python图形界面开发编程:wxPython(浅尝篇)

    Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 ...

  9. IDEA(2018.01)安装和破解

    IDEA(2018.01)安装和破解 1.下载IDE https://www.jetbrains.com/idea/download/#section=windows 选择Ultimate版本 2.下 ...

随机推荐

  1. c# 多线程实现ping 多线程控制控件

    这个备份器放在项目目录下面,每次使用就双击一下,因为便捷性,就不采用xml等等储存信息,全部在面板内做,这样可以保证一个exe就运行了. 我发现运行起来还蛮快的,唯一没有实现的是ping通的电脑如果出 ...

  2. Android之控件与布局,结构知识点,基础完结

    版权声明:未经博主允许不得转载 在Android中我们常常用到很多UI控件,如TextView,EditText,ImageView,Button,ImageButton,ToggleButton,C ...

  3. [Swift]LaunchScreen.storyboard设置启动页

    设置[General]->[App Icons and Launch Images] 注意:当App不是用LaunchScreen.xib来配置启动页时,[LaunchScreen File]置 ...

  4. Nginx---(Server虚拟主机)

    server{ listen PORT; server_name NAME; root /PATH: } 基于端口 listen指令监听在不同的端口; 基于IP 基于FQDN (域名,主机名) ser ...

  5. python库函数Map, Filter and Reduce的用法

    python中有三个函数式编程极大的简化了程序的复杂性,这里就做一下讨论和记录. 一 Map:应用在链表输入所有元素的函数,它的格式如下所示: map(function_to_apply, list_ ...

  6. python中匿名函数lambda

    简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命 名一个函数的场合下使用,也就是指匿名函数. 先看它的几个用法: map( lambda x: x*x, [y f ...

  7. IO流查找文件然后写入TXT文档

    今天领导让分析日志,把日志中所有登录过的员工信息都拿出来.于是.把日志摘下来谢了这段代码 import java.io.BufferedReader;import java.io.BufferedWr ...

  8. 对nginx中location的认识

    关于一些对location认识的误区 1.location的匹配顺序是“先匹配正则,在匹配普通”. location的匹配顺序其实是“先匹配普通,在匹配正则”.造成误解的原因是:正则匹配会覆盖普通匹配 ...

  9. Thread,ThreadPool,Task, 到async await 的基本使用方法和理解

    很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题吧. ...

  10. 全网最详细的Eclipse里如何正确新建普通的Java web项目并发布到Tomcat上运行成功【博主强烈推荐】(图文详解)

    不多说,直接上干货! 首先,大家要明确,IDEA.Eclipse和MyEclipse等编辑器之间的新建和运行手法是不一样的. 如果是在Myeclipse里,则是File -> new -> ...