CMurphi入门笔记(六)——规则,起始状态和不变式

原文地址:http://www.cnblogs.com/Rainday/p/cmurphi_prime_6.html

 

规则,状态和不变式的语法如下所示:

    <rules> ::= <rule> {; <rule> } [;]
    
    <rule> ::= <simplerule>
             | <startstate>
             | <invariant>
             | <ruleset>
             | <aliasrule>

简单规则<simplerule>

    <simplerule> ::= rule [<string>]
                       [ <expr> ==> ]
                       [ { <decl> } begin ]
                       [ stmts ]
                     end

简单规则决定了非确定性有穷自动机从一个状态到另一个状态的转变。

简单规则描述了状态之间的转变。逻辑上,它由一个块和一个条件组成,其块是将要执行的语句的集合,其条件是一个布尔表达式,描述可能被执行的块下的状态。如果一个状态的条件为true,则该规则的块会被执行来提供到另一个状态的转变。

规则的条件是可选的。如果没有说明条件,则规则被假定为总是可用的。

在规则的条件中使用具有副作用的表达式是错误的。

规则可能定义局部变量,常量或者类型,这些并不是状态的一部分。如果没有定义变量,用来开始块的begin语句可以省略掉。不幸的是,如果既没有条件也没有局部变量,语法分析器常会错误地分析输入。所以,没有条件的规则应该使用保留字begin来开始它的块

一个有条件的规则可以通过下边的转换方法等价地写为一个没有条件的规则:

    rule                       rule
      <condition>                <decls>
    ==>                        begin
      <decls>        -->         if <condition>
    begin                          <body>
      <body>                     end
    end                        end

虽然这是功能冗余的,有条件可以使得验证器的速度快3~4倍。

程序中不存在至少一个简单规则是错误的。

起始状态<startstate>

    <startstate> ::= startstate [ <string> ]
                       [ { <decl> } begin ]
                       [ <stmts> ]
                     end

起始状态是一条特殊类型的规则。它仅仅在每次运行的开始的时候执行。换句话说,就是每次运行都会执行一个起始状态,然后执行零个或者多个简单规则。

起始状态必须为每一个全局变量赋值,否则将会引发运行时错误。

程序没有至少一个起始状态是错误的。

不变式<invariant>

    <invariant> ::= invariant [ <string> ] <expr>

下边的两种形式是等价的:

    invariant "foo"
      <expr>
   rule
     !<expr>
   ==>
     Error "Invariant violated: foo"
   end

某些时候,很多程序猿觉得使用内嵌的"assert"和"error"这种说明风格的语句比使用不变式要更加自然。然后,对于能够方便表达为不变式的特性,表达为不变式要更加有效率,因为编译器可以根据不变式的一些约束特性进行优化。

在不变式中使用具有副作用的表达式是错误的。

规则集<ruleset>:

    <ruleset> ::= ruleset <quantifier> {; <quantifier> } 
                  do 
[<rules>]
end

规则集可以被认为是为其<quantifier>中的每一个值创建一份其<rules>组件的副本。

别名规则<aliasrule>:

    <aliasrule> ::= alias <alias> {; <alias> } do [<rules>] end

别名规则创建可以在其所有<rules>组件中使用的规则的别名。

 


CMurphi的基本知识就到这里啦~~

 

CMurphi入门笔记(一)——概览

CMurphi入门笔记(二)——基本概念

CMurphi入门笔记(三)——定义

CMurphi入门笔记(四)——表达式

CMurphi入门笔记(五)——语句

CMurphi入门笔记(六)——规则,起始状态和不变式

转载于:https://www.cnblogs.com/Rainday/p/cmurphi_prime_6.html

springboot052基于Springboot+Vue旅游管理系统毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值