coq的一点体会2

下面是谓词逻辑。在coq里,量词的表示如下:

全称量词:forall

存在量词:exists

同样都有自己的引入规则和删除规则

1. forall引入规则 intros x

1

输入intros x就可以提取出一个前提x,使得结论成为F。intros前面有讲很多,这里就不多说了。

2. forall删除规则 apply H

2

 

对于已知的前提H : forall x:A , F.可以用它来简化结论,比如对于H : forall x:A, P x -> forall y:A, R x y -> R x (f y),输入coq>apply H. 可以看到目标R a (f (f a))被分解为两个:P a 和 R a (f a)

下面来举个课件中的例子。。下面有用到";" 意思就是两句合并到一起执行。注意有时A ; B与A. (换行) B. 的运行结果是不一样的,这两句并不等价。

输入:

Hypothesis Hf : forall x y:A, R x y -> R x (f y).
Hypothesis R_refl : forall x:A, R x x.
Lemma Lf : forall x :A, R x (f (f (f x))).
Proof.
intro x;apply Hf.

1 subgoal

Hf : forall x y : A, R x y -> R x (f y)
R refl : forall x : A, R x x
x : A
============================
R x (f (f x))

repeat apply Hf.

1 subgoal
A : Set
f : A -> A
Hf : forall x y : A, R x y -> R x (f y)
R refl : forall x : A, R x x
x : A
============================
R x x

apply R_refl.
Qed.

有时候应用前提来证明时,系统并不知道如何给forall x:A找到一个合适的赋值,在我们输入apply H时,会给出如下的错误提示:

Error: Unable to find an instance for the variable m.

这时需要给出H的赋值,使用with后缀。下面看一个例子:

Hypothesis lt_trans : forall n m p : nat, n < m -> m < p -> n < p.
Lemma lt_n_SSn : forall i:nat, i < S (S i).
Proof.
intro i.

1 subgoal

Hypothesis lt_trans : forall n m p : nat, n < m -> m < p -> n < p

i : nat

===========================

i < S (S i)

如果这时输入的是apply lt_trans. 会给出错误提示找不到m的实例。正确的输入应该是:

apply lt_trans with (S i);

目标这时就会分解为 i < S i S i < S (S i)。类似的可以输入eapply lt_trans. 系统会自动找一个随机变量替代m。

注:with x 这一后缀同样适用于elim子句。

3. 存在量词引入规则 exists t

image

输入exists t. 提取出F来证明。需要注意的是这个t必须是在前提中存在的。

4. 存在量词删除规则 destruct H as [x Hx]

image

输入destruct H as [x Hx]. ,将前提H分解为两个,分别是x和Hx :F –>  G。

5. 等价性引入规则 reflexivity

image

当证明目标是很显然的a=a时,可以输入reflexivity, trivial, auto中的一个来证明。

6. 替换规则

image

已知前提e : a=b,想要用b来替换目标A[a]中的a,可以输入rewrite –>e.

同样的

image

用a来替换b:rewrite <-e.

还是比较直观的,下面是一个例子:

Lemma eq_trans_on_A :
forall x y z:A, x = y -> y = z -> x = z.
Proof.
intros x y z e.

. . .
e : x = y
============================
y = z -> x = z

rewrite -> e.

. . .
e : x = y
============================
y = z -> y = z

class over~

 

本文原创,转载请注明出处:

http://blog.163.com/sara_athena/

http://www.cnblogs.com/luluathena/

你可能感兴趣的:(c)