精华内容
下载资源
问答
  • 为了进一步提高伪谱最优控制方法的计算精度, 削弱微分形式伪谱法对状态变量近似误差的放大幅度, 研究基于积分形式的伪谱最优控制方法. 依次给出3 种伪谱法的积分伪谱离散形式, 证明当Lagrange 多项式对状态变量的...
  • 形式方法

    2020-11-18 09:20:05
    包括形式规约,形式证明与验证及程序求精三方面的活动。形式规约是规格说明的形式化;形式证明与验证技术包括模型检测和定理证明;程序求精是从抽象的形式规约推演出的面向程序代码的全过程,包括时态逻辑,Z语言及...

    形式化方法(formal methods)在逻辑科学中指分析研究思维形式结构的方法

    在软件工程中,通过建立精确的数学模型以及对软件模型进行分析活动后建立的方法称为软件工程中的形式化方法。

    包括形式规约,形式证明与验证及程序求精三方面的活动。形式规约是规格说明的形式化;形式证明与验证技术包括模型检测和定理证明;程序求精是从抽象的形式规约推演出的面向程序代码的全过程,包括时态逻辑,Z语言及分析和Petri网方法3种

    展开全文
  • 证明方法简析

    千次阅读 2013-05-01 23:27:22
    数学上的证明方法有很多,今天翻离散数学翻到证明方法的部分,觉得很是经典,所以将他们列在这边,以便自己时时记在心上。  定理常见的形式是“P成立当且仅当Q成立”,“如果P成立,那么Q成立”。而前者又相当...

      数学上的证明方法有很多,今天翻离散数学翻到证明方法的部分,觉得很是经典,所以将他们列在这边,以便自己时时记在心上。


      定理常见的形式是“P成立当且仅当Q成立”,“如果P成立,那么Q成立”。而前者又相当于P推出Q,并且Q也推出P,所以归根到底,定理的主要形式是P推出Q,至于其他形式,诸如非P的形式,只需要证明P是假;PQ均成立,只需证明P成立且Q成立;P或Q成立,只需证明P成立,P不成立时Q成立。


      1. 无意义证明

        证明前提假设是假,那么结论无所谓真假,命题都得证。(证明P不成立,则P推出Q成立)


      2. 平凡证明

        证明结论永真,那么前提无论真假,命题都得证。(证明Q成立,则P推出Q成立)


      3. 直接证明

        假设前提成立,成功推出结论成立,命题得证。(假设P成立,推出Q成立,则P推出Q成立)


      4. 间接证明

        根据逆反命题和原命题等价的原则,通过证明逆反命题成立,就可以证明原命题成立。(假设Q不成立,推出P不成立,则P推出Q成立)


      5. 多前提条件的命题

        P1,P2,P3,...,Pn推出Q形式的命题。

        直接证明:假设前提Pi全部成立,成功推出Q成立,则结论成立;

        间接证明:假设Q不成立,推出任意Pi不成立,则结论成立。


      6. 多前提条件的附加条件命题(演绎)

        P1,P2,P3,...,Pn推出P推出Q形式的命题。

        该命题形式等价于多前提条件Pi有附加了前提条件P,这与P就是在前提条件中没有区别。即原命题为P1,P2,P3,...,Pn,P推出Q形式。

        该规则被称为演绎定理。


      7. 多可选前提条件的命题

        P1,P2,P3,...,Pn前提条件任一存在都推出Q形式的命题。

        该命题按其本身的叙述,就应该证明任意的Pi都能够推出Q,以保证只有在前提Pi都不成立的情况下,Q才不成立。


      8. 反证法

        要证P1,P2,P3,...,Pn永真地推出Q,那么可以采用另外一种方式:

        证明P1,P2,P3,...,Pn,非Q永真地推出一个不可能的结论。也就是,将需要推出的结论Q的反命题作为附加前提,这个时候所有的前提假设推出一个永远不可能的情况。

    展开全文
  • 也提供一套形式化语言,可编写数学算法、定义、定理;它还可以用于程序的正确性证明。 2、Coq的安装 Coq-8.11.0 安装包【Windows、MacOS】 链接:https://pan.baidu.com/s/1rAjW8D6G5GJI3sQP1JfG7g...

    一、Coq的安装与使用

    1、Coq简介

            Coq是一款交互式证明辅助工具,提供一套证明系统,可以编写证明、检查证明;也提供一套形式化语言,可编写数学算法、定义、定理;它还可以用于程序的正确性证明。

    2、Coq的安装

    Coq-8.11.0 安装包【Windows、MacOS】

    链接:https://pan.baidu.com/s/1rAjW8D6G5GJI3sQP1JfG7g 
    提取码:ects

    安装完成之后,Coq自带CoqIde,对于形式化方法课程来说应该是够用了。

    【我有尝试使用另外一种IDE:Proof General,但是没有成功,等成功之后再来更新吧,目前就先用CoqIde了hhhh】

    3、Warm-up Test

    (1)创建一个名为 coq_warm_up.v 的文件,保存如下代码:

    【其中 “.v” 是Coq文件的默认后缀】

    Inductive day : Type := 
    | monday : day 
    | tuesday : day 
    | wednesday : day 
    | thursday : day 
    | friday : day 
    | saturday : day 
    | sunday : day. 
    
    Definition next_weekday (d:day) : day := 
    match d with 
    | monday => tuesday 
    | tuesday => wednesday 
    | wednesday => thursday 
    | thursday => friday 
    | friday => monday 
    | saturday => monday 
    | sunday => monday 
    end.
    
    Eval compute in (next_weekday friday). 
    Eval compute in (next_weekday (next_weekday saturday)). 

    (2)运行CoqIde,打开上述文件;

    (3)单击 Go to end 按钮,会得到如下的输出:

         = monday
         : day
         = tuesday
         : day

    此时说明Coq安装成功。

    4、Coq功能分区

    • Tool bar 工具栏:提供可执行的基本命令。
    • Script buffers 脚本缓冲区:用于打开和编辑脚本。
    • Goal window 目标窗口:显示待验证目标。
    • Message window 消息窗口

    二、Coq Tactics——如果使用Coq进行proof development

    在proof development的每个阶段,都有一个要证明的子目标列表。

    最初,该列表由所要证明的新定理的本身组成;

    应用某些策略之后,目标列表包含该策略生成的子目标,接下来的工作就是分别对这些子目标进行处理。

     

    主要包括以下策略:intros, apply, inversion, split, right and left

     

    A basic theorem:

    Theorem ident body: type.
    Proof.
        Tactics
    Qed.
    • Theorem - Coq中的一个命令,声明了一个需要证明的新定理;

    • ident - 新定理的名称;

    • body - 新定理的主体;

    • type - 

            forall 新定理中出现的变量名(多个变量用空格隔开):Prop,

                所要证明的新定理.

    • Proof - 标示着证明新定理的开始

    • Tactics - 指导证明的过程,在结论和前提之间提出演绎规则,实现反向推理

    • Qed - 标示着证明新定理的完成

     

    1、Implication(蕴含):intros and apply tactic

    【蕴含的引入规则:intros】

    主要用于拆分所要证明定理中的已知前提和所要证明的结论。【详见下方】

     

    【蕴含的删除规则:apply】

    【详见下方】

     

    第一个栗子:证明定理 P -> P成立

    证明代码如下:

    Theorem example1: forall P: Prop, 
        P -> P.
    Proof.
        intros.
        apply H.
    Qed.
    

    分析解释如下:

    (1)执行前三行,结果如下:

    由goal-window展示的结果可知,我们的证明目标位于水平线的下方。

    横线上方没有任何的内容,表示 local context 为空,没有任何东西可以使用。

    (2)执行intros策略:

    基于当前目标,intros策略具有不同的效果,如果是:

    forall T: type, T-> U    

    将 T: type 和 Hn: T 放入 local context,新的子目标就是U。

    执行intros策略后,根据横线上方的内容,local context 中有两个前提可供使用。

    (3)执行apply H:

    在步骤(2)中,我们得到了一个名为H的假设,并且该假设的值与我们唯一的子目标相同,当我们得出与目标相同的假设时,使用 apply 策略。

    (4)使用Qed命令完成证明:

    当goal-window显示“No more subgoals”,表示证明过程结束,使用Qed命令完成证明,该命令可以让Qed保存定理及其证明。

    相关练习:证明定理 P -> (Q -> P) 成立

    Theorem exercise1: forall P Q:Prop,
        P -> (Q -> P).
    Proof.
        intros.
        apply H.
    Qed.

    (1)前三行:

    (2)第四行:

    此时发现子目标P和前提H相同,因此直接apply H即可。

    (3)第五行:

     

    第二个栗子:证明定理 (P -> Q) -> P -> Q 成立

    证明代码如下:

    Theorem example2: forall P Q: Prop,
        (P -> Q) -> P -> Q.
    Proof.
        intros.
        apply H in H0.
        apply H0.
    Qed.

    分析解释如下:

    (1)执行前三行:

    (2)执行第四行:

    在local context中得到了两个假设,但是都和子目标不相同时:

    如果我们知道: (a) x implies y,并且 (b) x 为真 时,我们可以使用 apply (a) in (b) 策略将(b)中的 x 转换为 y。

    在本例中,

    H: P -> Q   

    H0: P 

     

    由H可知,P implies Q,并且由H0可知,P为真,因此我们可以使用:

    apply H in H0

    将H0转换为Q。

    即:将假设 H: P -> Q 应用于假设 H0: P,将假设H0变为Q。

    (3)执行第五行:

    此时前提H0和子目标Q相同,apply H0 即可。

    (4)执行第六行:

    证毕。

    相关练习:证明 P -> (Q -> ( H -> Q )) 成立

    代码如下:

    Theorem exercise2: forall P Q H:Prop,
       P -> (Q -> (H -> Q)).
    Proof.
        intros.
        apply H1.
    Qed.

     

    2、Conjunction(合取、交):inversion(反演) and split(拆分) tactic

    【合取的】

     

    【合取的引入规则】

    在Coq中使用这个命令就是将结论拆分成两个来证明,两个都需要进行证明。

     

    第一个栗子:证明 P /\ Q -> Q 成立

    证明代码如下:

    Theorem example3: forall P Q: Prop,
        P/\Q -> Q.
    Proof.
        intros.
        inversion H.
        apply H1.
    Qed.

    分析解释如下:

    (1)执行前三行:

    (2)执行第四行:

    【 inversion 策略 用法一】

    inversion 策略用于证明具有 conjuction(合取、交)连接的定理。

    执行完第四行之后,我们得到了一个假设 H: P /\ Q,其中具有合取运算符。

    inversion 策略主要用于发现假设成立的前提。

    有假设H可知,P /\ Q为真,只有在 P 为真并且 Q 为真的情况下,P /\ Q 才可能为真,因此我们可以使用 Inversion 策略向 local context 中添加两个假设—— H0: P  H1: Q。

    (3)执行第五行:

    此时假设H1和子目标相同,因此只需要 apply H1 即可。

    (4)执行第六行:

    相关练习:证明 P /\ Q ->P 成立

    代码如下:

    Theorem exercise3: forall P Q: Prop,
        P /\ Q -> P.
    Proof.
        intros.
        inversion H.
        apply H0.
    Qed.

     

    第二个栗子:证明 (P /\ Q) -> (Q /\ P)

    证明代码如下:

    Theorem example4: forall P Q:Prop,
        (P /\ Q) -> (Q /\ P).
    Proof.
        intros.
        inversion H.
        split.
        apply H1.
        apply H0.
    Qed.

    分析解释如下:

    (1)执行前三行:

    (2)执行第四行:

    假设中包含合取运算符,因此使用 Inversion 策略。

    (3)执行第五行:

    我们需要证明的目标是 Q /\ P 成立,显然 Q /\ P 成立的条件是 Q 和 P 都为真,因此我们可以将目标拆分。

    split 策略用于将目标拆分成几个子目标,然后再对子目标进行一一证明。

    (3)执行第六行:

    首先证明子目标Q,直接 apply H1 即可

    (7)执行第七行:

    再证明剩余的一个子目标P,apply H0

    (8)执行第八行:

    相关练习:证明 (P /\ (Q /\ R)) -> ((P /\ Q) /\ R) 成立

    Theorem exercise4: forall P Q R:Prop,
        (P /\ (Q /\ R)) -> ((P /\ Q) /\ R).
    Proof.
        intros.
        inversion H.
        inversion H1.
        split.
        split.
        apply H0.
        apply H2.
        apply H3.
    Qed.

     

    3、Disjunction(析取,并): right and left tactic

    【析取的引入规则 left & right】

    对目标结论输入 left,能够使得目标变成 P;同理对目标结论输入 right,能够使得目标变成 Q。

    在实际操作时,选择一个证明起来比较简单的式子。

     

    第一个栗子:证明 (P \/ Q) -> (Q \/ P) 成立

    证明代码如下:

    Theorem example5: forall P Q: Prop,
        (P \/ Q) -> (Q \/ P).
    Proof.
        intros.
        inversion H.
        right.
        apply H0.
        left.
        apply H0.
    Qed.

    分析解释如下:

    (1)执行前三行:

    (2)执行第四行:

    【 inversion 策略 用法二】

    inversion 策略还可用于具有 disjunction(合取、并)连接的定理,生成两个具有相同结论、但 local context 中H0值不同的子目标。

    (3)执行第五行:

    第一个子目标需要我们在假设 H0: P 成立的前提下,证明 Q \/ P 为真,因此许需要证明 Q 为真或者 P 为真 或者 Q 和 P 均为真即可。

    前提为 H0: P,需要证明的子目标 Q \/ P 中包含 P,且 P 位于合取符号的右侧,因此,使用 right 策略使得子目标与假设 H0 相同。

    (4)执行第六行:

    此时 前提 H0 与第一个子目标相同,因此只需要 apply H0 即可。

    (5)执行第七行:

    需要证明的目标为:在 H0: Q 成立的前提下,证明 Q \/ P 为真,Q 位于合取符号的左侧,因此使用 left 策略使得目标与假设 H0 相同。

    (6)执行第八行:

    (7)执行第九行:

    相关练习:证明 (P \/ (Q \/ R)) -> ((P \/ Q) \/ R) 成立

    代码如下:

    Theorem exercise5: forall P Q R:Prop,
        (P \/ (Q \/ R)) -> ((P \/ Q) \/ R).
    Proof.
        intros.
        inversion H.
        left.
        left.
        apply H0.
        inversion H0.
        left.
        right.
        apply H1.
        right.
        apply H1.
    Qed.

     

    4、not(~):unfold 策略

    【使用场景】

    当我们想要展开某个定义或者函数实现时,使用 unfold 策略。

    当我们想要将 ~X 转换为 X -> False 时,使用 unfold 策略,有两种实现方法:

    (1)unfold not

    (2)unfold "~"

     

    举个栗子:证明 P -> ~P -> Q 成立。

    证明代码如下:

    Theorem absurd: forall P Q:Prop,
        P -> ~P -> Q.
    Proof.
        unfold not.
        intros.
        elim H0.
        apply H.
    Qed.

    (1)执行前三行代码:

    使用 unfold not 将 ~Q 转换为 Q -> False。

    (2)执行第四行代码:

    elim 策略用于消除谬误。

    (3)执行第五行代码:

    (4)执行第七行代码:

    练习:

    证明 ((P -> R) /\ (Q -> R)) -> (P /\ Q -> R) 成立。

    Theorem exercise6: forall P Q R:Prop,
        ((P -> R) /\ (Q -> R)) -> (P /\ Q -> R).
    Proof.
        intros.
        inversion H0.
        inversion H.
        apply H3 in H1.
        apply H1.
    Qed.

     

    证明 (P -> Q /\ R) -> ((P -> Q) /\ (P -> R)) 成立。

    Theorem exercise7: forall P Q R:Prop,   
        (P -> Q /\ R) -> ((P -> Q) /\ (P -> R)).
    Proof.
        intros.
        split.
        apply H.
        apply H.
    Qed.

     

    证明  ((P /\ Q) /\ R, S /\ T) -> (Q /\ S) 成立。

    Theorem challenge1: forall P Q R S T:Prop,
        (((P /\ Q) /\ R) /\ (S /\ T)) -> (Q /\ S).
    Proof.
        intros.
        inversion H.
        inversion H0.
        inversion H2.
        inversion H1.
        split.
        apply H5.
        apply H6.
    Qed.

     

    证明 (P -> Q) -> (~Q -> ~P) 成立。

    证明代码如下:

    Theorem challenge2: forall P Q:Prop,
        (P -> Q) -> (~Q -> ~P).
    Proof.
        unfold not.
        intros.
        apply H in H1.
        apply H0 in H1.
        apply H1.
    Qed.

    (1)执行前三行代码:

    (2)执行第四行:

    (3)执行第五行:

    (4)执行第六行:

    (5)执行第七行:

    (6)执行第八行:

     

    参考:

    https://www.cnblogs.com/luluathena/archive/2010/08/19/1803065.html

    http://www.doc88.com/p-5187845230295.html

    https://zhuanlan.zhihu.com/p/33294417?edition=yidianzixun

    展开全文
  • 形式方法 | Proof Engineering in Coq——Coq tatics 在命题逻辑证明中的应用 一、谓词逻辑(也成为一阶逻辑、量化逻辑) 1、谓词 谓词是一个包含变量(谓词变量)的语句,根据这些变量的值,它可以为 True ...

    关于Coq的安装、使用及Coq tatics在命题逻辑中的应用详见:

    形式化方法 | Proof Engineering in Coq——Coq tatics 在命题逻辑证明中的应用

    一、谓词逻辑(也成为一阶逻辑、量化逻辑)

    1、谓词

    谓词是一个包含变量(谓词变量)的语句,根据这些变量的值,它可以为 True 或者 False。

    2、谓词逻辑

    谓词逻辑使用关系、表达式和量化扩展命题逻辑。

    即,谓词逻辑允许使用包含变量的句子对更加现实的问题进行建模。

     

    二、More Coq Tatics

    1、Negation: tactic unfold

    【使用场景】

    unfold 策略将目标中的术语替换成其定义。

    (1)Coq使用 ~ 表示命题的否定,我们使用 unfold not 策略可以将 ~p 转换成 p -> False。

    举个栗子:证明 ~(P /\ ~P) 成立。

    证明代码如下:

    Theorem example_1: forall P:Prop,
        ~(P /\ ~P).
    Proof.
        unfold not.
        intros.
        inversion H.
        apply H1.
        apply H0.
    Qed.

    分析解释如下:

    (1)观察可知,目标中包含一个全局的 ~,因此首先使用 unfold not 将这个 ~ 给展开,结果如下:

    (2)然后使用 intros 拆分所要证明定理中的已知前提和所要证明的结论:

    (3)已知前提 H 是一个合取式,使用 inversion 策略发现该前提 H 成立的假设:

    (4)之后两次使用 apply 策略就可以证明出相应结论。

     

    (2)还可以使用 unfold t in H 来展开标签为 H 的假设中 t 的定义。

     

    Exercise 1: Using the tactic unfold, to prove DeMorgan law:

            ~(P \/ Q) -> ~P /\ ~Q

    证明代码如下:

    Theorem exercise1: forall P Q:Prop,
        ~(P \/ Q) -> ~P /\ ~Q.
    Proof.
        unfold not.
        intros.
        split.
        intro H1.
        apply H.
        left.
        apply H1.
        intro H2.
        apply H.
        right.
        apply H2.
    Qed.

    分析解释如下:

    (1)执行前五行:

    (2)发现所要证明的结论为 /\ 式,所以使用 split 策略将其分解成两个子目标:

    (3)使用 intro 策略引入子目标的前提:

    (4)发现第一个子目标所要证明的结论变为 False,所以直接 apply H:

    (5)发现第一个子目标所要证明的结论变为 P \/ Q,而前提中包含 H1: P,所以使用 left 策略保留第一个子目标的左半部分:

    (6)apply H1 第一个子目标得证,同理可以证明第二个子目标。

     

    2、Tatic assert

    [使用场景】

    有时我们需要从一个中间目标来证明我们当前的目标。

    assert 或 assert(h:H) 策略将 H 引入为新的子目标; 证明新目标后,可以使用假设h:H证明原始目标。

    举个栗子:证明 ( P /\ ~P) -> Q 成立

    证明代码如下:

    Theorem example_2: forall P Q:Prop,
        (P /\ ~P) -> Q.
    Proof.
        unfold not.
        intros.
        assert (f: False).
        inversion H.
        apply H1.
        apply H0.
        inversion f.
    Qed.

    分析解释如下:

    (1)执行前三行:

    (2)显然,命题(P / \〜P)是错误的,因此它可以 imply 任何命题。

    我们需要引入一个中间目标:(P / \〜P)是错误的。

    所以引入子目标 assert(f: False):

    (3)执行4-6句证明子目标:

    (4) 在证明了该子目标之后,我们可以将其用作新的假设来证明最初的目标:

     

    3、Tactic destruct

    [使用场景】

    在之前的博客中,我们使用 inversion 策略打破假设中的合取或析取。

    还有另一种更常用的策略来处理合取和析取:destruct 策略。

    (1)假设为 /\ 式子:

    该策略用两个假设P和Q代替了一个假设P / \Q。

    destruct H as [H1 H2]

    (2)假设为 \/ 式子:

    如果该假设是析取项P \ / Q,则该策略会生成两个子目标:一个保持P,另一个保持Q。

    destruct H as [H1 | H2]

    (3)destruct 策略 也可以为每个归纳类型的构造函数生成子目标。

    举个栗子:证明 P \/ Q -> (P -> R) -> (Q -> R) -> R 成立

    证明代码如下:

    Theorem example_3: forall P Q R:Prop,
        P \/ Q -> (P -> R) -> (Q -> R) -> R.
    Proof.
        intros.
        destruct H as [Hp | Hq].
        apply H0 in Hp.
        apply Hp.
        apply H1 in Hq.
        apply Hq.
    Qed.

    (1)执行前四行:

    (2)前提H为 \/ 式子,使用 destruct H as [Hp | Hq] 将其分解为两个前提:

    (3)依次证明即可

     

    Exercise 2: Using the tactic destruct, to prove

           P /\ (Q \/ R) <-> (P /\ Q) \/ (P /\ R).

    证明代码如下:

    Theorem exercise2: forall P Q R:Prop,
        P /\ (Q \/ R) <-> (P /\ Q) \/ (P /\ R).
    Proof.
        intros.
        split.
        intros.
        destruct H as [Ha Hb].
        destruct Hb as [Hc | Hd].
        left.
        split.
        apply Ha.
        apply Hc.
        right.
        split.
        apply Ha.
        apply Hd.
        intros.
        destruct H as [He | Hf].
        destruct He as [Hg Hh].
        split.
        apply Hg.
        left.
        apply Hh.
        destruct Hf as[Hi Hj].
        split.
        apply Hi.
        right.
        apply Hj.
    Qed.

    注意点:

    观察发现为双向箭头 <->,在 intros 之后使用 split 将该目标分解为两个子目标:

    若要证明 P<-> Q,则需要分别证明 P-> Q 和 Q -> P。

     

    三、Predicate Logic——使用 Coq 证明谓词逻辑定理

    声明集合变量

    Variables A B: Set.

    在这里,我们声明A和B都是集合变量。

    声明集合上的谓词变量

    Variables P Q: A -> Prop.
    

    可以将P和Q视为从A中获取元素并返回Prop的函数。

    如果我们拥有A集合的元素,例如a:A,则可以使用P(a)表示满足属性P。

    使用相同的方法,我们可以声明与多个元素相关的属性,例如,我们可以通过以下方式引入关系R,将A和B关联起来:

    Variable R : A -> B -> Prop.
    

    在此,R a b表示与a和b的关系,可以将R视为具有两个参数的函数。

    1、Universal Quantification

    在Coq中,关键字forall用于表示通用量化。

    forall x:A, P x

    表示A的所有元素都满足属性P。
     

    forall x:A,P x-> Q x

    表示A的任何满足属性P的元素也将满足属性Q 。

    举个栗子:证明  (forall x: A, P x -> Q x) -> (forall x: A, P x) -> forall x: A, Q x. 成立

    证明代码如下:

    Variables A: Set.
    Variables P Q: A -> Prop.
    Theorem example_4:
        (forall x:A, P x -> Q x) -> (forall x:A, P x) -> forall x:A, Q x.
    Proof.
        intros H1 H2 a.
        apply H1.
        apply H2.
    Qed.
        

    证明分析如下:

    主要前提是“所有A满足特性P也满足Q”,次要前提是“所有A满足特性P”,结论是“所有A满足Q”。

    (1)使用 intros 策略:

    得到一个前提“ a: A”以及两个假设H1和H2。

    intros a 策略引入了一个假设 a: A,则 所要证明目标中 forall 之后所有自由变量 x 都被 a 所取代。 因此,我们可以看到我们的目标变为Q a。

    (2)执行 apply H1.

    观察可知,假设H1: forall x: A, P x -> Q x,表示对于A中的所有元素,只要其满足P性质,则其一定满足Q性质,我们要证明的结论为 Q a,因此只需要能证明出 P a 即可。

    因此,使用Apply H1来将假设H1实例化为Pa-> Q a。 

    (3)执行 apply H2.

     

    Exercise 3: Try to prove the following predicate logic proposition:

           ∀x.(~P(x) /\ Q(x)) -> ∀x.(P(x) -> Q(x))
    

    证明代码如下:

    Theorem exercise3:
        (forall x, ~P x /\ Q x) -> (forall x, P x -> Q x).
    Proof.
        intros H1 a H2.
        apply H1.
    Qed.

     Exercise 4: Try to prove the following predicate logic proposition:

           ∀x.(P(x) -> Q(x)) -> ∀x.~Q(x) -> ∀x.~P(x)
    

    证明代码如下:

    Theorem exercise4:
        (forall x, P x -> Q x) -> (forall x, ~Q x) -> (forall x, ~P x).
    Proof.
        unfold not.
        intros H1 H2 a.
        intros.
        apply H1 in H.
        apply H2 in H.
        apply H.
    Qed.

     Exercise 5: Try to prove the following predicate logic proposition:

           ∀x.(P(x) /\ Q(x)) <-> (∀x.P(x) /\ ∀x.Q(x))
    

    证明代码如下:

    Theorem exercise5:
        (forall x, (P x /\ Q x)) <-> ((forall x, P x) /\ (forall x, Q x)).
    Proof.
        split.
        intros.
        split.
        apply H.
        apply H.
        intros H a.
        inversion H.
        split.
        apply H0.
        apply H1.
    Qed.

     

    2、Existential Quantification——使用Coq证明谓词逻辑定理

    在Coq中,关键字exist用于表示存在量化。

    exists x: A, P x

    表示集合A中存在具有属性P的元素x。

    举个栗子:证明 (exists x: A, P x) -> (forall x: A, P x -> Q x) -> exists x: A, Q x 成立。

    证明代码如下:

    Theorem example_5:
        (exists x:A, P x) -> (forall x:A, P x -> Q x) -> exists x:A, Q x.
    Proof.
        intros H1 H2.
        destruct H1 as [a p].
        exists a.
        apply H2.
        apply p.
    Qed.

    分析解释如下:

    (1)执行 intros H1 H2.

    将前提和结论区分开。

    处理已知前提和所要证明结论中的 exists 符号:

    existential quantification 策略 与 conjuction(合取) 策略 类似,为了证明 exsit x:A, Q x,我们假设满足该 existence 的 x 是 a,并且将 Q 中所有的 x 都替换为 a。

    在该定理中,假设 H1: exists x: A, P x   ,我们可以使用 destruct 策略将其分解为两个假设 a: A 和 P a。

    (2)执行 destruct H1 as [a p].    ——假设中  exists 的消除

    (3)执行 exists a.    ——目标中 exists 的消除

    exists a 策略将目标中所有自由的 x 都替换为 a。

    (4)执行 apply H2.

    (5)执行 apply p.

     

    Challenge: Try to prove the following predicate logic proposition:

           ∃x.∃y.P(x, y) -> ∃y.∃x.P(x, y)

    实现代码如下:

    Variables A B: Set.
    Variables P: A -> B -> Prop.
    
    (* Challenge: Try to prove the following predicate logic proposition:
           ∃x.∃y.P(x, y) -> ∃y.∃x.P(x, y) *)
    Theorem challenge1:
        (exists x, exists y, P x y) -> (exists y, exists x, P x y).
    Proof.
        intros.
        destruct H as [a p1].
        destruct p1 as [b p2].
        exists b, a.
        apply p2.
    Qed.

     

    3、tactic rewrite

    【使用场景】

    设项 e 的类型为 ∀(x1: T1)(x2: T2)...(xn: Tn), a=b

    对于目标 P a,使用 rewrite e 可以将目标修改为 Pb,即该策略将目标里所有的a替换成b。

    也可以改写假设:rewrite e in H.

    反向改写规则:rewrite <- e.

    举个栗子:

    Theorem eq_sym' : forall(A:Type)(a b:A), a=b->b=a.
    Proof.
      intros.
      rewrite H.
      reflexivity.
    Qed.

    分析解释如下:

    (1)执行前三行:

    (2)执行rewrite H. 

    将所要证明结论中的b替换为a。

    (3)执行 reflexivity.

    当结论显然可证时,可以执行 reflexivity.

     

    Challenge: Try to prove the following predicate logic proposition:

          P(b) /\ (∀x.∀y.(P(x) /\ P(y) -> x = y)) -> (∀x.(P(x) <-> x = b))

    实现代码如下:

    Variables A: Set.
    Variables P: A -> Prop.
    Variables b: A.
    
    Theorem Challenge2:
        (P b) /\ (forall (x:A) (y:A), (P x /\ P y -> x = y)) -> (forall (x:A), (P x <-> x = b)).
    Proof.
        intros.
        split.
        inversion H.
        intros.
        apply H1.
        split.
        apply H2.
        apply H0.
        intros.
        inversion H.
        rewrite H0.
        apply H1.
    Qed.

     

    参考:

    https://www.cnblogs.com/luluathena/archive/2010/08/19/1803111.html

    https://www.cnblogs.com/luluathena/archive/2010/08/19/1803111.html

    展开全文
  • 证明几种不等式的方法及常用的一些不等式,该文中的方法既包含了初等数学的方法也包含了高等数学的方法,且每个方法都对应一个题目,方便大家来理解并应用它们,但本文不再去证明一些不等式,直接去利用它们的结论。...
  • 什么是形式方法

    2020-12-29 23:32:20
    什么是形式方法 从广义上讲,形式方法是借助数学的方法来解决软件工程领域的问题,主要包括建立精确的数学模型以及对模型的分析活动。狭义的讲,形式方法是运用形式化语言,进行形式化的规格描述、模型推理和...
  • 软件开发的形式方法

    热门讨论 2012-02-06 22:37:32
    内容涵盖了SE2004中关于"软件的形式方法"的知识点,主要包括:有限状态机、Statecharts、Petri网、通信顺序进程、通信系统演算、一阶逻辑、程序正确性证明、时态逻辑、模型检验、Z、VDM、Larch等。形式方法是...
  • 首先提出了一致性测试的形式方法的总体架构;然后分析了Mosbus协议形式方法,给出了Modbus的FSM模型;接着分析了Modbus形式化测试生成...最后设计并实现了一致性测试系统,在实际应用中证明了该方法的有效性和实用性。
  • Event-B 形式方法

    2020-07-13 17:05:03
    Event-b 是一种基于传统的谓词演算和定理证明形式化语言。 Event-b 新的特征是它引入了事件(Event)。事件是event-b的一个重要特征,因此它非常适合用来为周期行为建模。除此之外,Event-b支持逐步精化地建立...
  • 形式证明与验证技术主要包括模型检测和定理证明。程序求精是将自动推理和形式化方法相结合,从抽象的形式规约推演出具体的面向计算机的程序代码的全过程。模态(Modal)逻辑是经典命题逻辑和一阶谓词逻辑的扩展形式。...
  • 在软件工程中,通过建立精确的数学模型以及对软件模型进行分析活动后建立的方法称为软件工程中的形式化方法,包括形式规约,形式证明与验证及程序求精三方面的活动。形式规约是规格说明的形式化;形式证明与验证技术...
  • 琴生不等式及其加权形式证明

    万次阅读 多人点赞 2018-02-23 23:49:46
    但是一时半会又想不起来证明方法,遂百度,发现给出的证明方法乱七八糟,于是这里给出自己的证明方法以供参考。在思考式【2】的证明时也曾想过使用多元函数求驻点,再利用海森矩阵来判断驻点的极值性质。想来想去...
  • 整数整除性质的一些通用证明方法

    千次阅读 2015-07-13 23:19:41
    本文介绍如何证明被某些数整除的数的性质 设有数x,写成如下形式:am · · · a4a3a2a1a0. a0 在个位, a1 在十位, a2 在 百位 等等。 还可以把x写成:*x = a0 + a1 · 10 + a2 · 100 + a3 · 1000 + a4 · 10000...
  • 泰勒公式的各种余项形式及其多种证明◎陈建梅...本文介绍了泰勒公式及其各种余项形式,总结出多种关于泰勒公式的证明方法.【期刊名称】《数学学习与研究:教研版》【年(卷),期】2018(000)017【总页数】2【关键词】...
  • 2020形式方法复习笔记

    千次阅读 2020-07-08 22:31:17
    每个形式系统应当包括语法+语义 2.1 语法 The syntax P⋁PP \bigvee PP⋁P :析取 P⋀PP \bigwedge PP⋀P:合取 P→PP \to PP→P:蕴含 2.2 证明系统 The proof system 数学上:Hibert系统,构造性,没有规律可言...
  • 形式化方法是指将离散数学的方法用于解决软件工程领域的问题,主要包括建立精确的数学模型以及对模型的分析活动。...该过程包括:形式规约、形式证明我与检验、程序求精三方面的活动。 其通过模态来对可能世界中的命...
  • 针对有限域乘法器设计正确性的问题进行研究,阐述了有限域乘法器在高阶逻辑定理证明器HOL4中进行形式化建模和验证的过程。通过分析电路的结构特性和时序特性,提出了结合层次化和基于周期的形式化建模方法,构建4位...
  • 对几种Hermite插值多项式的存在唯一性给出另一种证明方法,对带不完全导数的m(m≥4)次Hermite插值多项式,给出推广的基函数构造方法,并对带不完全导数的三次及四次Hermite插值多项式的具体实例,给出了基函数的具体表达...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,281
精华内容 512
关键字:

形式证明方法