程序理论(theory of programs)总览

程序理论是研究程序的语义性质程序设计及开发方法的理论。主要包括:

  • 程序语义理论
  • 数据类型理论
  • 程序逻辑理论
  • 程序验证理论
  • 并发程序设计理论
  • 混成程序设计理论

程序理论算法理论是计算机科学的两大支柱。

程序理论的基本问题:如何建立一个相对完善的理论框架,为软件设计与开发方法提供理论依据。这个框架应能:

  • 提供有效的描述程序规约的语言(specification)
  • 定义可操作的变换方法以便能从程序规约构造可执行的程序(program from specification)
  • 给出验证程序与其规约之间一致性的机制(consistency between program and specification)

程序是用程序语言编写的,如果要研究程序规约、变换、验证,首先必须给出程序语言的语义。这种语义用数学方法刻画程序语句的加工过程,并将其执行结果形式化。所以,程序语义也叫形式语义。形式语义的研究始于20世纪60年代初期,ALGOL60是第一个明确区分语法和语义的程序设计语言。

程序语言的形式语义分为四类:

  • 操作语义:模拟程序执行中计算系统的操作过程;
  • 指称语义:将程序作为论域间的泛函,以便刻画程序的执行数据结果;
  • 公理语义:用公理化方法刻画程序与被加工数据的逻辑关系;
  • 代数语义:将程序执行结果定义为满足某种公理体系的代数结构;

还有比较冷门的博弈语义。程序理论对形式语义的需求(研究),促进了论域、偏序、范畴论等数学理论的发展。形式语义理论的研究(过程)也促进了程序语言和程序设计方法的进步,例如:在高级语言中广泛使用的过程说明和过程调用的精确概念和实现机制,就是在语义理论的研究中逐步明确的。

程序设计和开发理论早期研究的目标是解决程序验证问题。Hoare在20世纪60年代首次提出了程序逻辑的理论。这个理论的基本逻辑公式形式化为\(\{\phi\}P\{\psi\}\),这个公式为真,当且仅当:如果程序\(P\)执行前,程序变量满足\(\phi\),则程序执行后,变量满足\(\psi\)。程序设计的目标就是构造使\(\{\phi\}P\{\psi\}\)成立的程序。Hoare对程序语言的每个语句都给出了相应的逻辑规则。因此,在程序\(P\)给定后,可以使用这些规则证明:如果程序\(P\)执行前程序变量满足\(\phi\),则程序执行后程序变量满足\(\psi\)。

Hoare逻辑的缺点是其基本形式不能进行逻辑演算。为了克服这种缺点,学者在20世纪80年代,提出了类型论方法以求为程序设计与开发建立更完善的理论框架(类型理论)。典型的类型理论是由P. Martin-Lof建立的,称为直觉主义类型论,它的基本思想是:选择一组类型(集合)作为程序规约,其中每个类型可看作一个集合,集合中的元素为满足该规约的程序;用一组规则定义类型与其元素间的隶属关系,这些规则即是从规约产生程序的变换规则,即一阶(直觉主义)逻辑的证明规则。因此,只要对给定的规约(逻辑命题)进行证明,就可以构造出符合此规约的程序。这样,程序规约、变换、验证都在对规约的证明中了。

Martin-Lof理论的基本对象是\(a: A\),其中\(a\)是类型\(A\)中的元素。这个理论的基本对象\(a: A\)有多种解释,这些解释导致了它在程序设计和开发理论中的应用。例如,\(a: A\)可以解释为,元素:类型、证明:命题、程序:规约。以类型\(A\rightarrow B\)为例,它有以下两个基本规则:

\(\frac{a:A\vdash b:B}{(\lambda a.b):A\rightarrow B}[Rule0]\qquad\frac{m:A\rightarrow B\quad n:A}{(mn):B}[Rule1]\)

它们有三种解释:

  1. 元素:类型。Rule0表示:若类型\(A\)有元素\(a\)可以推出类型\(B\)有元素\(b\),则类型\(A\rightarrow B\)有元素\(\lambda a.b\)。Rule1表示:若类型\(A\rightarrow B\)有元素\(m\)且类型\(A\)有元素\(n\),则类型\(B\)有元素\(mn\)。其中,\(\lambda a.b\)(\(\lambda\)-抽象),\(mn\)(\(\lambda\)-作用),\(m\)和\(n\)称为\(\lambda\)-项。类型理论的重要结论:给定典型元素\(a\)和类型\(A\),可以在有限步内判断\(a\)是否为\(A\)的元素,这就是类型理论的强范式化性质。
  2. 证明:命题。采用直觉主义逻辑的观点,一个逻辑命题为真当且仅当存在此命题的证明。若将\(a:A\)解释为\(a\)是命题\(A\)的证明,将类型\(A\rightarrow B\)解释为\(A\)蕴含\(B\),那么Rule0表示:若命题\(A\)有证明\(a\)可以推出命题\(B\)有证明\(b\),则命题\(A\rightarrow B\)有证明\(\lambda a.b\);Rule1表示:若命题\(A\rightarrow B\)有证明\(m\)且命题\(A\)有证明\(n\),则命题\(B\)有证明\(mn\)。如果将Rule0和Rule1中的所有“证明”去掉,它们就称为关于逻辑蕴含的自然推理规则:\(\frac{A\vdash B}{A\rightarrow B}\)和\(\frac{A\rightarrow B\quad A}{B}\)。类似地,若将类型\(A\times B\)、\(A+B\)、\(\Pi_{a:A}B\)、\(\Sigma_{a:A}B\)分别解释为\(A\wedge B\)、\(A\vee B\)、\(\forall a:A\cdot B\)、\(\exists a:A\cdot B\),则关于这些类型的规则就成为关于\(\wedge\)、\(\vee\)、\(forall\)、\(\exists\)的逻辑推理规则。这就是Howard的“命题即类型”原则。
  3. 程序:规约。假定一阶逻辑语言作为规约语言,函数式语言作为程序语言,则\(\lambda\)-项:\(\lambda a.b\)、\(mn\)、\(m\)和\(n\)都将表示程序,而\(a:A\)可以解释为程序\(a\)满足规约\(A\)。Rule0和Rule1在这种情况下定义了程序与规约之间的关系。Rule0表示:若程序\(a\)满足规约\(A\)可以推出程序\(b\)满足规约\(B\),则程序\(\lambda a.b\)满足规约\(A\rightarrow B\);Rule1表示:若程序\(m\)满足规约\(A\rightarrow B\)且程序\(n\)满足规约\(A\),则程序\(mn\)满足规约\(B\)。

根据这三种解释,对程序理论的基本问题:给定规约\(A\),要找到满足它的程序\(a\),就可以有新的理解:

  • 按照解释3,规约\(A\)是一逻辑表达式,对它可使用逻辑推理规则进行证明,证明的过程就是引用逻辑推理规则的过程;
  • 根据解释2和解释3,逻辑推理规则就是程序构造规则,在证明中,引用一条规则的同时,就构造出满足被证明的某个子公式的一个程序片段;
  • 如果规约\(A\)被证明为真,在证明过程中就已经构造出满足规约\(A\)的一个程序了。

总之,根据Martin-Lof理论,只要将作为规约的逻辑公式证明为真,就可构造出满足规约\(A\)的程序。因此,程序验证作为程序理论的单组组成部分就不再需要了。这就是将类型理论作为程序设计和开发理论的典型方法。

根据这种思想,学者在20世纪80年代推出了多种不同的交互式证明编辑工具,使用这类工具时,对规约的证明是由用户完成的。用户引用开发工具中的逻辑推理规则,对规约进行证明,并构造程序。这种引用的合理性是由计算机检查的,类型理论的强范式性质保证了这种检查的可行性。目前,这类开发工具尽管保证了所开发程序的正确性,但它们的程序设计质量与人工设计的程序质量相比差距很大,尚待提高。

(关于逻辑推理规则就是程序构造规则的一点个人理解:假设\(x\)表示程序输入,相应的\(x'\)表示程序输出,只有两个推理规则\(\frac{x\in\mathbb{R}}{x'=x+1}[Rule0]\)和\(\frac{x\in\mathbb{R}}{x'=x-1}[Rule1]\)。对于程序规约\(x<x'\),推理规则Rule0本身就构成满足这个规约的程序,它对应赋值语句\(x:=x+1\),其他推理规则Rule1;Rule0;Rule0对应顺序语句\(x:=x-1;x:=x+1;x:=x+1\)也构成满足这个规约的程序)

20世纪70年代初,为了保证在操作系统中多个并行执行进程的正确性,并发程序理论产生了。进入80年代以来,随着超大规模集成电路技术的日臻成熟,并行和分布式计算机系统得到了迅速发展,特别是互联网的出现和广泛使用,大大促进了并行程序理论的发展,使之成为程序理论的一个重要分支。

并发程序是包含多个没有因果关系的进程的程序。进程间通信、同步和它们的并行执行是并发程序区别于顺序程序的基本操作。计算机科学中的并发概念是由Petri在1962年提出的。Hoare和Milner在20世纪70年代后期,分别提出并发程序的CSP和CCS模型,他们将输入输出以及并行执行作为基本语法成分引入程序设计语言,并使用结构操作语义方法定义模型中基本语法成分的操作语义,开创了用代数方法研究并发程序中通信和并行行为的领域。并发程序理论研究的内容包括:

  • 如何刻画并行进程的行为;
  • 在什么情况下它们可以互相模拟;
  • 研究各种通信和同步机制;
  • 死锁、活性、可观察性、发散性等并发现象。

并发程序理论的研究加深了人们对并发系统的认识,其主要研究成果,例如,关于通信和同步的概念,已作为基本语言成分在Ada、Occam和Java等程序语言中得到广泛的应用。

进入20世纪90年代,对控制系统的研究,例如,对自动导航及核电站检测等控制系统的研究,引起了程序理论界的关注。这些系统的特点是:

  • 都使用计算机进行实时控制;
  • 对控制系统的安全性和可靠性要求高,控制系统的微小错误都将给经济和社会安全带来巨大的损失;
  • 系统中都存在两类不同对象:
    • 根据传统控制理论,使用微分方程刻画的连续现象;
    • 根据逻辑和代数方法,使用计算机程序控制的离散事件

这类系统又称为混成系统(hybrid system)。近年来,混成系统的程序理论已成为研究热点。其基本目标:建立混成系统的计算模型,设计描述混成系统的高级语言,探索混成系统程序的设计和开发方法。目前,在建立混成计算模型方面有三种不同的方法:

  • 逻辑型混成计算模型方法。其基本思想是在时态逻辑基础上引入时段和切变的概念,时段(演算)用于刻画系统在时间区间上的连续变化,切变则表示系统中离散事件间的时序关系;
  • 程序设计型混成模型方法。其目标是在CSP及Ada等并发语言中引入连续变量及给定初值的微分方程(例如,混成CSP),而语言中原有的通信、顺序、条件语句则用来表示系统中离散事件的关系;
  • 将自动机概念推广。将微分方程刻画的连续现象扩充为自动机的状态,用自动机状态转移刻画离散事件之间的关系(混成自动机)。

尽管混成系统理论发展的历史不长,但它在一些重要的实时控制系统中已经得到了应用,显示出这些理论的生命力。

(关于本篇总览中提到的众多概念,将在后续的博文中一一详解。)

posted @ 2020-08-18 22:08  公羊尺  阅读(698)  评论(0)    收藏  举报