验证实施的一般程序有哪些?

验证实施的一般程序有哪些?,第1张

认证程序是指在认证活动中任何直接或间接用以确定是否满足技术法规或标准中相关要求的程序。认证机构实施认证活动应当遵循认证基本规范、认证准则的要求,并编制本机构详细的认证程序。

认证程序一般包括以下基本内容,以质量管理体系认证为例:

1.公布申请信息

在实施认证业务之前,认证机构应当公布实施认证所依据的审核准则和全部相关认证信息,包括认证机构信息、认证要求和程序信息,以及描述获证组织权利和义务的文件等。例如与组织相关的管理体系标准和其他规范性文件。

2.认证受理(包括合同评审等活动)

认证机构应要求由申请认证的组织提出正式申请。认证审核开始前,认证机构应审查:组织的简况组织提供的质量管理体系所覆盖的范围的描述申请认证的标准的清单质量手册及相关的支持性文件和记录,并对这些信息的充分性进行评价。

根据申请信息,初步确定组织的认证范围。

认证机构应实施认证资源的复核。认证机构应从自身方针和能力等方面,复核是否有能力对申请人实施审核,能力包括:是否有适当能力的审核员和专家,以及其及时实施初次审核的能力。

3.审核准备(包括审核方案策划等租燃)

审核准备活动可能包括:初次审核前的预访问审核方案斗型升策划允许组织对指派的审核员和技术专家提出异议就审核计划与组织达成一致为审核组提供审核文件和记录等。ISO 10011:2002《质量和/或环境管理体系审核指南》标准,为审核准备和审核方案管理提供了指南。

4.实施审核(包括审核各阶段的安排和要求等)

ISO 10011:2002《质量和/或环境管理体系审核指南》标准,为审核实施提供了空老指南。通常审核包括:文件审核、现场审核和审核后续活动。对于质量管理体系认证审核,要特别关注对ISO9001:2008标准要素删减的适宜性。

审核组应在审核完成后,撰写审核报告、作出审核结论和提出推荐意见。

审核组应分析审核中收集的所有相关信息和证据,该分析需足以使审核组确定组织的质量管理体系与认证要求的符合性和一致性。

5.认证决定

(包括授予认证的条件与认证依据等)

认证机构应规定适用的管理体系标准或其他规范性文件要求,和授予、保持、缩小及扩大认证的条件,以及全部或部分暂停或撤销组织认证范围的条件。认证机构应特别要求组织供方及时通报对质量管理体系拟实施的变更,或其他可能影响其符合性的变更。

根据认证过程中和其他方面得到的信息,认证机构对组织作出是否批准认证的决定。只有在所有不符合项都已经得到纠正,并且采取的纠正措施经认证机构验证以后,才可以授予认证。

6.认证证书与认证标志的管理

(包括认证资格的宣传和认证标志的使用要求等)

认证机构应对质量管理体系认证证书与认证标志的所有权、使用和展示实施作出适当的规定和控制。应有程序确保获证组织不允许以可能引起误解和混淆的方式使用其证书和标志。

如果组织只有质量管理体系认证,不允许在产品上使用认证标志,产品上使用认证标志意味着产品认证。

7.监督审核

(包括监督审核的安排、要求和程序等)

为验证获证组织的质量管理体系是否持续有效运行,考虑组织运作的变化可能对其管理体系产生的影响,确认对认证要求的持续符合性和保持认证的资格,认证机构应该在足够短的时间间隔内实施监督方案。多数情况下,定期的监督审核时间间隔不超过一年。

8.复评

(包括复评审核的安排、要求和程序等)

为验证作为一个整体组织质量管理体系的全面持续有效性和保持认证资格,大多数情况下,以三年为一个周期,对组织的质量管理体系进行复评。复评一般至少包括一次对质量管理体系文件的审查和一次现场审核。

9.认证变更与通报

认证机构需要规定要求和制定和程序,特别要求组织及时通报对组织管理体系拟实施的变更,或者其他可能影响其符合性的变更。如果一个组织对它的质量管理体系进行了重大改变,或发生了

首先,我照着前面提到的网页,大致画了个界面,包括三个 checkBox、两个 textEdit 和两个 label,分别放在三个 layout 里面大概就是下面这个界面:

保存后会得到一个扩展名为 .ui 的文件。比如我得到了一个 RegexTester.ui。

然后打开 cmd 命令行,切换到当前目录,输入以下命令: pyuic4 -o regexTesterUi.py RegexTester.ui,回车,就能根据画好的 ui 文件生成一个 py 文件。这时可以写一个测试脚本来运行一下这个界面。

1 from PyQt4.QtGui import * 2 from PyQt4.QtCore import * 3 import sys 4 import regexTesterUi 5  6 class TestDialog(QDialog,regexTesterUi.Ui_Dialog): 7     def __init__(self,parent=None): 8         super(TestDialog,self).__init__(parent) 9         self.setupUi(self)10         11 if __name__ == '__main__':12     app=QApplication(sys.argv)13     dialog=TestDialog()14     dialog.show()15     app.exec_()

运行这个脚本,我们就可以得到刚才画的那个 GUI 界面,并且可以选中三个 checkBox ,在两个 textEdit 里面春困输入文本。只是除此之外没有任何功能。现在界面已经做好,我们需要做的就是实现高亮匹配数据的功能。

首先我们来完善一下这个类,我们需要的变量为输入的正则表达式、输入的测试数据、三个匹配模式(大小写敏感、多行匹配、点匹配所有)。吵早

1 class RegexTesterDialog(QtGui.QDialog, regexTesterUi.Ui_Dialog): 2      3     def __init__(self, parent = None): 4         super(RegexTesterDialog, self).__init__(parent) 5  6         self.CI = False     # case insensitive (i) 7         self.MB = False     # ^$ match at line breaks (m) 8         self.DM = False     # dot matched all (s) 9  升森雀       self.regex = ''10         self.data = ''11 12         self.ui = regexTesterUi.Ui_Dialog()13         self.ui.setupUi(self)

响应功能:

由于这个界面并没有按钮,我需要程序检测到任何一点变动就改变高亮的部分。这里就涉及到 Qt 的信号和槽机制。本文就不复述这些知识,具体可以参考 QT的信号与槽机制介绍。这里我们就要用到 QTextEdit 控件的 textChanged() 信号函数。具体的介绍可以查看 Qt 在线文档。这个信号函数在检测到 QTextEdit 控件中的文本发生了变化的时候会发射一个信号,与其关联的槽函数就会立即执行。而把这个信号函数和槽函数关联起来的方法就是 connect() 方法。这个网上也有很多介绍,这里我来介绍一个更 pythonic 的方法,使用 Python 的装饰器。PyQt中支持同名传递信号,就是说根据控件的名字来自动选择哪个槽。比如这里提到的 textChanged() 信号函数,如果要响应这个文本变化信号,可以这么做:

@QtCore.pyqtSlot()                            # 该装饰器标志此函数为接收信号的槽函数def on_textEdit_Regex_textChanged(self):      # 槽函数名标准格式 【on_控件名字_信号函数名字】

self.regex = self.ui.textEdit_Regex.toPlainText()

self.ui.textEdit_Data.setText(self.regex)

这里在槽函数上面加一个装饰器表示这个函数为接收信号的槽函数,然后根据控件名和信号函数名命名一个槽函数,这里我的接收正则表达式输入的 QTextEdit 控件名为 textEdit_Regex,因此这个槽函数名为 on_textEdit_Regex_textChanged。在这个槽函数里,我们通过 toPlainText() 方法得到文本框中的文本数据,然后将 textEdit_Data 中的数据设置为我们输入的值,这样就可以测试这个槽函数运行是否正确。当测试 textEdit_Data 控件的信号和槽函数时,也可以利用 textEdit_Regex 来输出结果。

除了 QTextEdit 控件,我们的界面还有 QCheckBox 控件。去查一下文档,可以找到这个控件的信号函数为 stateChanged(int)。我们发现这个函数带有一个参数,使用之前的方法会发现无法发射信号,这里我们需要在装饰器和槽函数中加入这个参数:

@QtCore.pyqtSlot(int)def on_checkBox_CI_stateChanged(self, value):    if self.ui.checkBox_CI.isChecked():

       self.CI = True

self.ui.textEdit_Data.setText(‘True’)    else:

       self.CI = False

self.ui.textEdit_Data.setText(‘False')

虽然我们不知道这个参数是什么,但只要加进来,就可以正常使用。同理,碰到需要两个参数的信号函数时,只要再加一个参数就行。这里,当接收到 stateChanged(int) 信号时,我们使用 isChecked() 方法来检查控件是否被选中。如果选中了,则返回真,否则返回假。这里我们同样用到了 QTextEdit 控件来输出结果测试信号是否正确。其他两个 QCheckBox 控件同样设置。

匹配功能:

完成基本的响应函数之后,就要开始实现匹配功能。这里很简单,直接调用 re 模块,使用 findall() 方法。由于有三个 checkBox 提供三种匹配模式:

re.I (全拼:IGNORECASE): 忽略大小写(括号内是完整写法,下同)

re.M (全拼:MULTILINE): 多行模式,改变'^'和'$'的行为

re.S (全拼:DOTALL): 点任意匹配模式,改变'.'的行为

因此总共有 23 =8 种匹配模式:

1 def matchData(self): 2     if (not self.CI) and (not self.MB) and (not self.DM): 3         pattern = re.compile(self.regex) 4     elif (not self.CI) and (not self.MB) and (self.DM): 5         pattern = re.compile(self.regex, re.S) 6     elif (not self.CI) and (self.MB) and (not self.DM): 7         pattern = re.compile(self.regex, re.M) 8     elif (not self.CI) and (self.MB) and (self.DM): 9         pattern = re.compile(self.regex, re.M|re.S)10     elif (self.CI) and (not self.MB) and (not self.DM):11         pattern = re.compile(self.regex, re.I)12     elif (self.CI) and (not self.MB) and (self.DM):13         pattern = re.compile(self.regex, re.I|re.S)14     elif (self.CI) and (self.MB) and (not self.DM):15         pattern = re.compile(self.regex, re.I|re.M)16     elif (self.CI) and (self.MB) and (self.DM):17         pattern = re.compile(self.regex, re.I|re.M|re.S)18         19     dataMatched = re.findall(pattern, self.data)

这里我们就可以得到匹配好的一个列表。刚开始实现这部分的时候,由于 Python 的 re 模块接收的参数类型是 Python string,而 PyQt 中控件得到的数据是 QString,一直报错,我一度准备使用 Qt 的 QRegExp 类来进行正则表达式匹配。但是查找文档查了好久,只找到一个改变大小写敏感的函数,找不到设置多行匹配和点匹配所有的方法,于是我去 stackoverflow 上问了个问题:Can QRegExp do MULTILINE and DOTALL match? 得到了一个详细的答案,一个解决问题的简单方法就是使用 unicode() 方法将 QString 转换成 python string,而一般不用将 python string 转换成 QString,因为接收 QString 类型参数的函数会自动将python string 转换成 QString。这样,我们直接在两个 QTextEdit 控件的槽函数中将得到的文本数据转换成 python string,就可以交给 re 模块处理了。

@QtCore.pyqtSlot()                      

def on_textEdit_Regex_textChanged(self):                  

   self.regex = unicode(self.ui.textEdit_Regex.toPlainText())

   self.matchData()

通过单步调试,我们可以测试上述 dataMatched 列表中的数据是否正确,如果正确,我们就可以继续进行下一步,实现高亮功能。

下面的框图代表一个非负整数的除法程序。x1是简租游被除数;x2是除数;z1中存放程序加工后得到的商;z2中存放得到的余数y1、y2是程序加工时使用的工作单元。START 表示程序的起始,HALT表示程序的终止。方框中是同时赋值语句,如(y1,y2):=(O,x1)

表示将y1置0值的同时,将y2的值置为x1。圆框内是测试语句,用于控制程序加工的流程。如框图中的语句y2≥x2

表示当y2的值大于等于x2时,程序按yes的箭头继续执行;否则按no的箭头继续执行。 为验证程序,必须首先将程序所要实现的目标形式化,即使用数学公式表达程序加工的初始数据的范围(称作输入谓词)和程序加工的结果(称作输出谓词)。

若约定各个变量的取值都是整数,上述除法程序的输入谓词和输出谓词分别为 在用归纳断言方法证明程型轮序正确性时,还必须在程序的框图中设置一些数学公式,称作断言,表示程序执行到该处时,程序中变量应满足的数学关系。输入谓词可选作起点处的断言,而输出谓词可选作终止点处的断言。

在除法程序中设置三个断言,A处和C处的断言分别为上述输入和输出谓词,B处断言为(x1=y1x2+y2)&(y2≥0) (1)

反映了y1、y2中存放商数和余数的中间结果值。

验证程序的正确性拦销,就是证明在程序的任何一种可能的加工过程中所设置的断言都是成立的。程序的一个加工过程就是框图中的一个流程。除法程序的所有可能的流程都是由图上的三条路径组合而成:由A至B由B出发回到B由B至C。这样,验证程序的正确性,就是证明对任一条路径,只要起点的断言成立,则终点的断言也成立。

以第二条路径为例,它是一条环路。要证明下列命题:若程序执行到环路的起点B时,断言(1)成立,则程序执行一周,再达到B点时,断言(1)仍然成立。

环行该圈,就是在(y2≥x2)成立的条件下,执行赋值语句(y1,y2):=(y1+1,y2-x2)

而上述语句的执行结果是使 y1的取值为执行前y1的值加1,y2的取值为执行前y2的值与x2的差,其他变量的值不变。为保证执行该赋值语句后断言(1)仍然成立,就要求将断言(1)中的y1代为(y1+1),y2代为(y2-x2)后得到的公式在执行该语句前成立。即(x1=(y1+1)x2+(y2-x2))&(y2-x2≥0) (2)

在执行上述赋值语句前成立。但已知执行该语句前断言①和测试条件(y2≥x2)均成立。由此推断公式②是成立的。这样就完成了对第二条路径的验证。对其余两条路径的验证也是类似的。从而可以证明除法程序的正确性。

归纳断言方法是由建立断言和对各条路径逐条验证两部分组成的。建立断言是一种创造性的工作,而验证路径的工作尽管繁琐,却是机械的。如何由计算机系统协助用户归纳出合适的断言,是程序验证研究中的重要课题。

用上述方法只能证明在输入谓词成立的前提下,程序终止时输出谓词一定成立。但不能证明在输入谓词成立时,程序一定能终止。不讨论程序终止性的程序验证称为程序部分正确性的验证。包括终止性的验证,则称为程序完全正确性的验证。

程序验证技术除了用于证明程序的正确性,或辅助用户编制正确程序外,还可从程序正确性角度评价程序设计方法和程序设计语言的优劣。但是,保证程序正确性的有效办法,不是在编制程序后再去验证,而是设法在编制过程中,使用适当的技术,使产生的程序是正确无误的。这类技术叫作程序综合和程序变形。程序验证技术和程序综合变形技术相互参照,共同发展。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12416065.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存