多语言展示
当前在线:1120今日阅读:83今日分享:49

用Prolog实现过程

我们说Prolog是陈述式(声明式)语言,实际上它是半陈述式的。如果存在真正的陈述式语言的话,那么程序员只需要描述信息和问题就好了,计算机在求解时会自动地产生相应算法,并力图使算法尽可能地有效。然而Prolog具有某些过程式语言的特点,例如,同一谓词的子句(规则)顺序对程序的执行是十分重要的。又如人们常常利用谓词fail或截断来干预过程。本篇经验将介绍Prolog实现选择、循环等过程式结构。6SWI-Prolog的递归2SWI-Prolog的截断机制
工具/原料
1

电脑

2

SWI-Prolog

选择结构
1

If…Then…Else结构是最简单的过程式控制结构,我们常常称之为选择结构或条件结构。下图是一个由Python语言编写的一个例子:

2

用Prolog表达上述过程的程序如图所示。程序中的write和read是Prolog内置的谓词,分别用于输出和输入。nl表示换行。子句writetest(注意其变元)可保证Prolog做出正确的路线选择,其中截断用于保证得到唯一确定的解。空变量记作“_”,表示对其变量的值并不关心。

3

下图是Prolog运行后交互和输出的情况。

循环结构
1

循环结构也是过程式程序设计中常见的一种程序结构。下图是一段简短的Python代码,执行后会打出8×5大小的由“*”组成的矩形。

2

与其相对应的Prolog程序如图所示。显然该程序中第一个while子句是递归循环的过程,在其测试条件失败之前始终进行自身调用。第二个while子句是停止条件。

3

Prolog程序运行后交互和输出情况如图所示。读者还可以设计出其它循环结构,设计具有循环结构的程序的基本过程可归纳成下述规则:❶把过程转换成标准的While循环;❷整个过程分为三步:初始化,循环,给出结果所需的后续计算过程;❸用递归子句的尾表示循环,在循环开始处进行条件测试;❹用循环谓词的第二个子句进行徃完成后所需的计算;❺建立递归子句的前端谓词,该谓词用于为循环提供所需的变量值和从循环中获取变量值;❻设计调用前端谓词的程序。

优化过程结构

在设计过程结构时应使其执行效率最高,下面是前面循环的另一个实现方式。这个程序不如前面的效率高,因为这个程序中第一个子句在每次谓词调用时(除了最后一次调用)均失败。递归调用要放在循环子句最后,同时截断应尽可能前放,放在测试条件之后,这样也可以提高执行效率。如果有多层循环,应将循环次数多的作为内层,减少外面大层循环的跳转频率。6SWI-Prolog的递归2SWI-Prolog的截断机制END

注意事项

用Prolog语言编写过程式程序在可读性上比起其它语言要逊色得多,切记在Prolog编程中应尽量避免过程式编程。

推荐信息