证明辅助工具 coq 简介

65
证证证证证证 证证证证证证 Coq Coq 证证 证证 证证 2010-07-20 证证证 - 证证证证证证证证证证证证证 ttp://kyhcs.ustcsz.edu.cn/summer-school

Upload: casey

Post on 14-Jan-2016

492 views

Category:

Documents


0 download

DESCRIPTION

证明辅助工具 Coq 简介. 郭宇 2010-07-20 中科大 - 耶鲁高可信软件联合研究中心. http://kyhcs.ustcsz.edu.cn/summer-school. 课程主页. http://kyhcs.ustcsz.edu.cn/summer-school. 问题. 如何表示数学证明?. Miracles often occur …. 费马大定理 ( 1673). X n = Y n + Z n 当 n>2 时无整数解 A. Wiles 1993 证明 ? 超过一百页 世界上能看懂的人屈指可数 原始证明有错,一年多以后更正. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 证明辅助工具 Coq 简介

证明辅助工具证明辅助工具 CoqCoq 简介简介

郭宇2010-07-20

中科大 - 耶鲁高可信软件联合研究中心

http://kyhcs.ustcsz.edu.cn/summer-school

Page 2: 证明辅助工具 Coq 简介

课程主页课程主页http://kyhcs.ustcsz.edu.cn/summer-sch

ool

Page 3: 证明辅助工具 Coq 简介

问题问题• 如何表示数学证明?

•Miracles often occur…

Page 4: 证明辅助工具 Coq 简介

费马大定理 费马大定理 ((1673)1673)• Xn = Yn + Zn

• 当 n>2 时无整数解• A. Wiles

• 1993• 证明 ?

• 超过一百页• 世界上能看懂的人屈指可数• 原始证明有错,一年多以后更正

Page 5: 证明辅助工具 Coq 简介

四色定理四色定理• K. Appel & W. Haken

• 1976 年证明

• 证明?• 分 1,936 种情况讨论• 利用计算机程序来自动分析,不产生证明• 一些数学家拒绝承认• 仍然难以检查证明是否正确

Page 6: 证明辅助工具 Coq 简介

四色定理四色定理• G. Gonthier & B. Werner

• 2004 年证明

• 证明?• 完整详细的 Coq 证明• 机器可检查• 没有跳过任何步骤• 证明检查程序规模小

Page 7: 证明辅助工具 Coq 简介

高可信软件高可信软件• 嵌入式系统内核—— seL4

• G. Klein 等人• OSDI’09 Best Paper• 8700 lines of C• 经过形式化验证

• 证明?• 机器可检查证明• 200,000 lines of Isabelle script

Page 8: 证明辅助工具 Coq 简介

VeriSoftVeriSoft

• 芯片• 嵌入式内核

• 汽车电子控制单元• 应用

• 宝马汽车的应急呼叫系统• 证明:

• Isabelle 2005

Page 9: 证明辅助工具 Coq 简介

CompCertCompCert

• 经过完全证明的 C 语言编译器•Xavier Leroy [CACM ’09]•Power PC backend

• 证明?•机器可检查证明•使用 Coq 代码编写并证明•抽取出 O’Caml 代码运行

Page 10: 证明辅助工具 Coq 简介

Certified SoftwareCertified Software

• Certified Software = Program + Proof

Page 11: 证明辅助工具 Coq 简介

CoqCoq 是什么是什么• 一个证明系统

• 编写证明,检查证明• 一套形式化语言

• 编写数学定义、算法、定理• 类型化 演算

• 一个环境• 交互式证明

Page 12: 证明辅助工具 Coq 简介

其它证明辅助工具其它证明辅助工具• Isabelle 2005

• Twelf

• Agda

Page 13: 证明辅助工具 Coq 简介

CoqCoq 介绍介绍• Coq 环境

• 函数式编程

• 逻辑推理

• 归纳

Page 14: 证明辅助工具 Coq 简介

运行 运行 coqcoq• 命令行解释器

•coqtop

• 编译器 •coqc

Page 15: 证明辅助工具 Coq 简介

用户界面用户界面• CoqIDE

Page 16: 证明辅助工具 Coq 简介

用户界面用户界面• emacs + proofgeneral(推荐 )

Page 17: 证明辅助工具 Coq 简介

运行 运行 CoqCoq• 运行 coqtop

• 检查一个表达式的类型Coq< Check 3.

3 : natCoq< Check 3 + 5.

3+5 : nat

Coq 命令 (以 . 结尾 )

Page 18: 证明辅助工具 Coq 简介

类型检查类型检查• 每一个合式的项都有一个类型

•每一个类型也是一个项

> Check 3 + true.Error: The term “true” has type “boo

l”While it is expected to have type “na

t”.

Page 19: 证明辅助工具 Coq 简介

定义定义> Definition a := 5.a is defined

> Definition b := a + 6.b is defined

> Eval compute in b. = 11 : nat

Page 20: 证明辅助工具 Coq 简介

CoqCoq 命令——打印命令——打印Coq< Print b.b = a + 6 : natCoq< Set Printing All.

Coq< Print b.b = plus a (S (S (S (S (S (S O)))))) : nat

Page 21: 证明辅助工具 Coq 简介

自然数加法自然数加法

Coq< Check plus.plus : nat -> nat -> natCoq< Unset Printing All.Coq< Eval compute in (plus 7 8). = 15 : nat

Page 22: 证明辅助工具 Coq 简介

自然数加法自然数加法Coq < Print plus.plus =fix plus (n m : nat) : nat := match n with | 0 => m | S p => S (plus p m) end : nat -> nat -> nat

Argument scopes are [nat_scope nat_scope]

Page 23: 证明辅助工具 Coq 简介

函数式语言编程函数式语言编程

Page 24: 证明辅助工具 Coq 简介

函数式语言编程函数式语言编程• 函数是一等公民

•First-class• 可以做参数,也可以作为函数返回值• 高阶函数

Page 25: 证明辅助工具 Coq 简介

示例一:布尔值计算示例一:布尔值计算Coq < Inductive bool : Set := true : bool | false : bool.bool is definedbool_rect is definedbool_ind is definedbool_rec is defined

Coq < Print bool.

Page 26: 证明辅助工具 Coq 简介

示例一:布尔值计算示例一:布尔值计算Coq < Inductive bool : Set := true : bool | false : bool

Coq < Definition negb (a : bool) : bool := match a with | true => false | false => true end.

Coq < Eval compute in (negb true).

Page 27: 证明辅助工具 Coq 简介

示例一:布尔值计算示例一:布尔值计算Coq < Inductive bool : Set := true : bool | false : bool

Coq < Definition andb (a : bool) (b : bool) : bool := match a with | true => b | false => false end.

Coq < Eval compute in (andb true false).

Page 28: 证明辅助工具 Coq 简介

示例一:布尔值计算示例一:布尔值计算Coq < Inductive bool : Set := true : bool | false : bool

Coq < Definition andb (a : bool) (b : bool) : bool := match a with | true => b | false => false end.

Coq < Check (andb).Coq < Check (andb true).

Page 29: 证明辅助工具 Coq 简介

示例一:布尔值计算示例一:布尔值计算Coq < Inductive bool : Set := true : bool | false : bool

Coq < Definition andb (a : bool) : bool -> bool := match a with | true => fun (b : bool) => b | false => fun (b : bool) => false end.

Coq < Check (andb).Coq < Check (andb true).

Page 30: 证明辅助工具 Coq 简介

示例一:布尔值计算示例一:布尔值计算Coq < Definition double (f : bool -> bool) : bool -> bool

:= fun (a : bool) => f (f a).

Coq < Eval compute in (double negb true).

Page 31: 证明辅助工具 Coq 简介

示例二:自然数示例二:自然数Coq < Inductive nat : Set := O : nat | S : nat -> nat. nat is definednat_rect is definednat_ind is definednat_rec is defined

Page 32: 证明辅助工具 Coq 简介

偶数判定偶数判定Fixpoint evenb (n:nat) : bool := match n with | O => true | S O => false | S (S n') => evenb n' end.

Page 33: 证明辅助工具 Coq 简介

加法加法

• 原始递归函数( Primitive Recursion)•保证函数的终止性

Fixpoint plus (n : nat) (m : nat) {struct n}: nat := match n with | O => m | S n’ => S (plus n’ m) end.

Page 34: 证明辅助工具 Coq 简介

基本逻辑推理基本逻辑推理

Page 35: 证明辅助工具 Coq 简介

原子命题定义原子命题定义Variables A B C : Prop.

Page 36: 证明辅助工具 Coq 简介

定理证明演示定理证明演示Theorem T1 : A -> A.

Page 37: 证明辅助工具 Coq 简介

证明构造的编程证明构造的编程

Page 38: 证明辅助工具 Coq 简介

打印证明打印证明Theorem T1 : A -> A.

Coq < Print T1.T1 = fun H : A => H : A -> A

• Curry-Howard 同构• 类型形如 A ->B 的证明是一个函数• 以命题 A 的证明为参数,返回 B 的证明

Page 39: 证明辅助工具 Coq 简介

程序即证明程序即证明

Definition T1’ := fun (H : A) => H.

Check T1’.

Page 40: 证明辅助工具 Coq 简介

程序即证明程序即证明

Definition T1’’:= fun (H : A) => T1 H.

Check T1’’.

• 证明的构造方式并不唯一• 构造 —— Construction

Definition T1’ := fun (H : A) => H.

Check T1’.

Page 41: 证明辅助工具 Coq 简介

练习练习

Theorem T2 : A -> B -> A.Proof ?

Page 42: 证明辅助工具 Coq 简介

答案答案

Theorem T2 : A -> B -> A. Proof fun (H : A) => fun (H2 : B) => H.

• T2 是定理 A->B ->A 的“构造”

Page 43: 证明辅助工具 Coq 简介

合取连接词合取连接词

Theorem T3 : A /\ B -> A. Proof fun (H : A /\ B) => (proj1 H).Theorem T4 : A /\ B -> B. Proof fun (H : A /\ B) => (proj2 H).

Page 44: 证明辅助工具 Coq 简介

析取连接词析取连接词

Theorem T6 : A /\ B -> A \/ B. Proof ?

Theorem T5 : A -> A \/ B. Proof fun (H : A) => or_intro1 H.

Page 45: 证明辅助工具 Coq 简介

析取连接词析取连接词

Theorem T6 : A /\ B -> A \/ B. Proof fun (H : A /\ B) => T5 (T3 H).

Theorem T5 : A -> A \/ B.

Theorem T3 : A /\ B -> A.

Page 46: 证明辅助工具 Coq 简介

全称量词全称量词Theorem T7 : forall A : Prop, A -> A.

• Curry-Howard 同构• 类型形如 forall x :A, B 的证明仍然是一个函数• 以 x 为参数,返回 B 的证明

Page 47: 证明辅助工具 Coq 简介

全称量词全称量词Theorem T7 : forall A : Prop, A -> A.Proof fun (A : Prop) => fun (x : A) => x.

【思考】下面证明构造的含义:Definition T4 := T3 (forall A : Prop, A)

Page 48: 证明辅助工具 Coq 简介

全称量词全称量词

Theorem T7 : forall A : Prop, A -> A.

【思考】下面证明构造的含义:Definition T8 := T7 (forall A : Prop, A)

T8 : False -> False

Page 49: 证明辅助工具 Coq 简介

练习练习

Theorem T9 : forall A B C: Prop, (A -> B) -> (B -> C) -> (A -> C).Proof ?.

函数复合

Page 50: 证明辅助工具 Coq 简介

归纳归纳

Page 51: 证明辅助工具 Coq 简介

归纳谓词归纳谓词

Inductive EqNat : nat -> nat -> Prop := | OEq : EqNat O O | SEq : forall m n : nat, EqNat m n -> EqNat (S m) (S n).

P (m, n) iff m = n

Page 52: 证明辅助工具 Coq 简介

归纳谓词归纳谓词• 问题:证明 EqNat 0 0 ?

• 写出类型为 EqNat 0 0 的证明构造

• 答案: OEq

Lemma LEqNat1 : EqNat O O. Proof OEq.

Definition LEqNat1 : EqNat O O := OEq.

Page 53: 证明辅助工具 Coq 简介

归纳谓词归纳谓词• 问题:证明 EqNat 1 1 ?

• 写出类型为 EqNat 1 1 的证明构造

Lemma LEqNat1 : EqNat 1 1.Proof (SEq 0 0 LEqNat0).

Definition LEqNat1 : EqNat O O := (SEq 0 0 LEqNat0)..

Inductive EqNat : nat -> nat -> Prop := | OEq : EqNat O O | SEq : forall m n : nat, EqNat m n -> EqNat (S m) (S n).

Page 54: 证明辅助工具 Coq 简介

归纳谓词归纳谓词• 练习:证明 EqNat 2 2 ?

Inductive EqNat : nat -> nat -> Prop := | OEq : EqNat O O | SEq : forall m n : nat, EqNat m n -> EqNat (S m) (S n).

Page 55: 证明辅助工具 Coq 简介

归纳谓词归纳谓词• 问题:证明 forall n, EqNat n n ?

Definition LEqNatn : forall n, EqNat n n := ?

Inductive EqNat : nat -> nat -> Prop := | OEq : EqNat O O | SEq : forall m n : nat, EqNat m n -> EqNat (S m) (S n).

Page 56: 证明辅助工具 Coq 简介

归纳谓词归纳谓词• 问题:证明 forall n, EqNat n n ?• 答案:递归函数

Fixpoint LEqNatn (n : nat) : EqNat n n := match n return (EqNat n n) with | O => OEq | S n' => SEq n' n' (LEqNatn n') end.

Inductive EqNat : nat -> nat -> Prop := | OEq : EqNat O O | SEq : forall m n : nat, EqNat m n -> EqNat (S m) (S n).

Page 57: 证明辅助工具 Coq 简介

归纳谓词归纳谓词• 问题:证明 forall n, EqNat n n ?• 交互式证明(演示)

Lemma LEqNatn : forall n, EqNat n n.

Page 58: 证明辅助工具 Coq 简介

归纳谓词归纳谓词• 交互式证明产生的证明构造?

LEqNatn = fun n : nat =>nat_ind (fun n0 : nat => EqNat n0 n0) OEq (fun (n0 : nat) (IHn : EqNat n0 n0) => SEq n0 n0 IHn) n : forall n : nat, EqNat n n

Print LEqNatn.Lemma LEqNatn : forall n, EqNat n n.

Page 59: 证明辅助工具 Coq 简介

通用归纳原理通用归纳原理

nat_rect = fun (P : nat -> Type) (f : P 0) (f0 : forall n : nat, P n -> P (S n)) =>fix F (n : nat) : P n := match n as n0 return (P n0) with | 0 => f | S n0 => f0 n0 (F n0) end : forall P : nat -> Type, P 0 -> (forall n : nat, P n -> P (S n)) -> forall n : nat, P n

nat_ind = fun P : nat -> Prop => nat_rect P : forall P : nat -> Prop, P 0 -> (forall n : nat, P n -> P (S n)) -> forall n : nat, P n

Page 60: 证明辅助工具 Coq 简介

Coq & CICCoq & CIC

• CC: Calculus of Constructions

• CiC: Calculus of Inductive Constructions

Page 61: 证明辅助工具 Coq 简介

CoqCoq 不能做什么不能做什么• Coq 不能自动给出问题的形式化描述

•我们要明确问题,并形式化问题

• Coq 不能自动证明出所有定理•给出证明思路

• Coq 不能直接证明程序•只是一个基础而且底层的逻辑工具•需要开发更多更有效的基于 Coq 的工具

Page 62: 证明辅助工具 Coq 简介

我们用我们用 CoqCoq 做什么做什么• 内核原型

• 150 lines of assembly code • 证明:

• 82,000 lines of coq scripts• Machine model• Safety policy• Specifications• Logics & their soundness proof• Code safety proof

Page 63: 证明辅助工具 Coq 简介

谢谢谢谢

Page 64: 证明辅助工具 Coq 简介

逻辑推理与计算逻辑推理与计算• 莱布尼兹之梦• 罗素悖论• 希尔伯特计划• 哥德尔定理• 图灵机与 演算

Page 65: 证明辅助工具 Coq 简介

Lambda CubeLambda Cube

λω

λ2

λ→ λP

λω λPωλP2

λPω