前面我们用Rodin建模了各种各样的模型,想必大家都知道Rodin的自动证明器有时候是会出错的吧?有时候,在自动证明器无法证明的情况下,我们需要进行手动的证明
环境更改
我们现在用的是SMT自动证明器,那玩意儿太高级了,为了体验一下手动证明的感觉,我们要首先更改一下我们的环境,来到这个界面,点击new
我们新建的这个证明环境命名为prp1,然后先把右边Loop On All Pending这个东西拖到中间
然后左边的都是证明的方法,把这个Goal in Hypotheses这个拖到中间的Loop上,在这里我们只用Goal in Hypotheses这一个方法
点击finish后就完成了一个自定义的证明器,我们把证明器切换到我们自己定义的这个东东,环境就搭建完了
证明规则
要证明一个问题,我们就需要简单了解一些证明规则,这里简单地写几个
deduction
H
,
P
⊢
G
H
⊢
P
⇒
G
\dfrac{H,P\vdash G}{H\vdash P\Rightarrow G}
H⊢P⇒GH,P⊢G
这个规则是说,如果要证明的式子形式是 H ⊢ P ⇒ G H\vdash P\Rightarrow G H⊢P⇒G这样子的,我们就可以把前面这个P放到假设里面,其实这就是演绎定理
Conjunction Introduction
H
⊢
P
H
⊢
Q
H
⊢
P
∧
Q
\dfrac{H\vdash P\qquad H\vdash Q}{H\vdash P\wedge Q}
H⊢P∧QH⊢PH⊢Q
在假设H条件下,要证明P和Q,相当于在假设H条件下,去证明 P ∧ Q P\wedge Q P∧Q
Disjunction to Implication
H
⊢
¬
P
⇒
Q
H
⊢
P
∨
Q
\dfrac{H\vdash \lnot P\Rightarrow Q}{H\vdash P\vee Q}
H⊢P∨QH⊢¬P⇒Q
这个其实就是德摩根律
Contradict
H
,
P
,
¬
Q
⊢
P
H
,
P
,
¬
P
⊢
Q
\dfrac{H,P,\lnot Q\vdash P}{H,P,\lnot P \vdash Q}
H,P,¬P⊢QH,P,¬Q⊢P
这个规则就很有趣了,讲的是如果P和
¬
P
\lnot P
¬P都在假设里面,那么我们就认为证明成立,这个规则在rodin里面点选的位置比较特殊
Goal in Hypotheses
H
,
P
⊢
P
\dfrac{}{H,P\vdash P}
H,P⊢P
这个规则就是我们之前设定的,非常好理解,如果P在假设里,并且P在证明目标里,那么证明成立,这个是证明的时候最优先考虑的规则,接下里的证明都是基于此
练习
还是实际地手动证明一下比较好,只看概念是不知道会出现什么问题的
要证明的东西是下面这个
我们现在只有rodin内置和Goal in Hypotheses这几个规则,在这种情况下怎么证明这个thm呢?
看到中间红色的部分了吗?在带红色的符号上,我们可以使用相应的证明规则
先用合取规则把要证明的部分拆成两个
在第一个证明里面用一次析取规则,再拆成俩
到了这一步可以使用deduction规则了,这一步把要证明的x∈A和x∈B提到假设了里面
再用一次deduction,把x属于A提到假设,这时候我们看到了,x∈B既在假设里面又在要证明的目标里面,所以这一条的证明成立
下面的这条同样,先用deduction两次
到了这一步,发现没法继续点下去了,别急,看一下
¬
x
∈
A
\lnot x\in A
¬x∈A和
x
∈
A
x\in A
x∈A竟然都在假设里面,我们点击一下
x
∈
A
x\in A
x∈A前面那个蓝色的ct,然后就这么证明出来了
接下来下面的证明和已演示的过程完全相同,全部点完后证明就完成了,笑脸都绿了呢,保存一下就可以收工了
其实就算是相同的命题,证明的序列也是多种多样的,不过证明序列有长短的区别,现在单纯的命题逻辑证明还是比较简单的,要是加上谓词逻辑相关的证明,就比较复杂了