用Prolog实现过程
的有关信息介绍如下:
我们说Prolog是陈述式(声明式)语言,实际上它是半陈述式的。如果存在真正的陈述式语言的话,那么程序员只需要描述信息和问题就好了,计算机在求解时会自动地产生相应算法,并力图使算法尽可能地有效。然而Prolog具有某些过程式语言的特点,例如,同一谓词的子句(规则)顺序对程序的执行是十分重要的。又如人们常常利用谓词fail或截断来干预过程。本篇经验将介绍Prolog实现选择、循环等过程式结构。
6SWI-Prolog的递归
2SWI-Prolog的截断机制
If…Then…Else结构是最简单的过程式控制结构,我们常常称之为选择结构或条件结构。下图是一个由Python语言编写的一个例子:
用Prolog表达上述过程的程序如图所示。
程序中的write和read是Prolog内置的谓词,分别用于输出和输入。nl表示换行。子句writetest(注意其变元)可保证Prolog做出正确的路线选择,其中截断用于保证得到唯一确定的解。空变量记作“_”,表示对其变量的值并不关心。
2SWI-Prolog的截断机制
6Prolog的基本概念和语法规则
下图是Prolog运行后交互和输出的情况。
循环结构也是过程式程序设计中常见的一种程序结构。下图是一段简短的Python代码,执行后会打出8×5大小的由“*”组成的矩形。
与其相对应的Prolog程序如图所示。显然该程序中第一个while子句是递归循环的过程,在其测试条件失败之前始终进行自身调用。第二个while子句是停止条件。
6SWI-Prolog的递归
2SWI-Prolog的截断机制
Prolog程序运行后交互和输出情况如图所示。读者还可以设计出其它循环结构,设计具有循环结构的程序的基本过程可归纳成下述规则:
❶把过程转换成标准的While循环;
❷整个过程分为三步:初始化,循环,给出结果所需的后续计算过程;
❸用递归子句的尾表示循环,在循环开始处进行条件测试;
❹用循环谓词的第二个子句进行徃完成后所需的计算;
❺建立递归子句的前端谓词,该谓词用于为循环提供所需的变量值和从循环中获取变量值;
❻设计调用前端谓词的程序。
在设计过程结构时应使其执行效率最高,下面是前面循环的另一个实现方式。这个程序不如前面的效率高,因为这个程序中第一个子句在每次谓词调用时(除了最后一次调用)均失败。递归调用要放在循环子句最后,同时截断应尽可能前放,放在测试条件之后,这样也可以提高执行效率。如果有多层循环,应将循环次数多的作为内层,减少外面大层循环的跳转频率。
6SWI-Prolog的递归
2SWI-Prolog的截断机制



