自动程序设计

程序设计自动化或部分自动化的技术。自动化的涵义并非固定不变的,而是逐渐深化的,在科学技术的不同发展阶段曾有不同的内容。最原始的程序设计,是通过硬连线装置直接用机器语言(只包含0,1两个符号)编制的;理想的情形是用户只需用自然语言提出对程序的目的要求,然后由自动程序设计系统自动生成能满足给定规范的程序。这种由低级阶段向最高级阶段演变的每一步,都是在某种意义上实现程序设计自动化。例如有了高级语言FORTRAN、PASCAL,人们就可以从面向机器的机器语言转而采用面向过程的语言,从而可摆脱许多与所用机器有关的细节,而将编程序的精力集中在解题算法上面。在这种情况下,编译程序将用户用高级语言编制的源程序变换为机器可以直接执行的目标程序。第一个公式翻译语言 FORTRAN的编译程序曾被称为自动程序设计系统,原因就在于此。传统的程序设计的每一执行细节,在程序运行时都已硬性规定,而人工智能程序设计则是具有较高的灵活性,其具体细节要在运行过程中,根据环境条件由程序自行决定。从这个意义讲,所有人工智能程序也可纳入自动程序设计范畴。从另一方面看,理解和推理是人工智能中的重要问题,如果理解和推理的对象就是程序本身,它便成为自动程序设计的研究目标。因此,也可将自动程序设计看成人工智能的一个重要分支。

从实用观点来看,自动程序设计系统的目的在于减轻人编制程序的负担。每个自动程序设计的基本特征,表现在说明方法、目标语言、问题领域和编制方法等四个方面有所不同。

说明方法

分为形式说明、示范说明和自然语言说明等几种方法。

(1)形式说明:采用机器定理证明技术研制自动程序设计系统时,相应的程序说明往往采用形式说明方法。例如,在求最大公因子的程序中,xy 必须是正整数和z是最大公因子这两个条件可分别用P(x,y)和 Q(x,y,z)来说明,即有

P(x,y):x>0 AND y>0Q(x,y,z):DIVIDE(z,x)AND DIVIDE(z,y)AND

u((u>0 AND DIVIDE(u,x)AND

DIVIDE(u,y))─→zu)

(2)示范说明:有输入输出比较方法、程序示踪方法,例如

CONCAT[(ABC),(DE)]=(ABCDE)

CONCAT[(LM),(NOP)]=(LMNOP)程序根据上述例子,得知CONCAT函数的输入是两张表,而输出则是将两张表合并成一张表,此即为比较输入输出的示范说明方法。又如

SORT[(3142)]─→( )

(142)─→(3)

(42)─→(13)

(2)─→(134)

( )─→(1234)显示了SORT函数对输入表(3142)重新排序而得输出表(1234)的全过程,这就是程序示踪的示范说明方法。

(3)自然语言说明:用自然语言提出对程序的要求。这种说明通常是交互的,也就是通过人和系统间的对话来完成程序说明。例如,用于模拟简单排队问题的自然语言程序设计系统NLPQ,就用这种程序说明方法。另外,还有综合运用上述各种方法的混合说明方法。

目标语言

自动程序设计系统最终完成的目标程序中所使用的语言,一般是LISP,PL/1、GPSS(通用系统仿真语言)等高级语言。

问题领域

自动程序设计的应用领域,对选择程序说明方法和运行方法有一定的影响,例如NLPQ系统用于编制排队问题仿真程序;PSI系统则用于编制符号计算程序。前者用自然语言的说明方法,而后者则利用与示范说明相结合的混合说明方法。

编制方法

主要采用定理证明、程序变换、知识工程和传统的问题求解等方法。在定理证明方法中,用定理证明程序来证明,对于所有给定输入必存在一个满足规定条件的输出,这时整个证明程序实际上就是所需要生成的目标程序。程序变换方法是将程序的初始说明变换为等价的另一种形式的说明,这种变换的目的在于比较方便地生成目标程序。知识工程方法是将编制程序所需的大量专门知识放入知识库,这时自动程序设计系统就成为用于自动编制程序的专家系统。传统的问题求解方法是把目标程序归约为若干子目标,然后应用问题求解技术。

自动程序设计尚处于起始阶段。它是改进现有程序设计的技术途径之一,在人工智能领域也已得到应用。

参考书目
  1. M.Rubinoff and M.C.Yovits,eds,Advance in Computers,Vol.15, Acadcmic Press, New York,1976.
  2. D.R.Barstow,Knowledge-based Program Construc-tion, Elsevier Publ.Co., Amsterdam, 1979.